我正在使用ML 8。
有没有办法在任务任务服务器上检查队列大小是否为零(所有生成的任务都被消耗了)?
为什么我需要这个:
我必须生成让10k任务,这些10K任务将在D盘中创建10K xml文件(使用xdmp:save
)
生成这些10K文件后,我已经生成另外20k任务,并且必须在D盘中保存20K xml文件,在这些20K任务中我必须利用之前10K生成任务的结果(保存在D盘中的10k文件) )
然后产生另一个25k任务,再次将在D盘中保存25K文件,同时处理需要先前生成的任务的结果,即20K xml文件。
依旧......
目前我手动执行此操作,我的意思是我将生成第一组10K文件,并将监视8001端口的任务服务器状态。一旦队列大小达到零,我将转到qconsole并生成另外的20K文件,依此类推......
我想用代码实现这一目标。
类似的东西:
产生10K文件; 等到所有生成的10k任务完成(必须使用代码检查); 产生另外20k任务等等......
请同样帮忙,如果需要更多细节,请告诉我。
答案 0 :(得分:1)
在完整阅读您的帖子时,我强烈建议您查看以下选项:
但要回答标题中的具体问题,请参阅以下内容:
请记住,作为MarkLogic的无共享体系结构的一部分,任务队列是每个主机而不是群集范围的数字。但是,由于您正在使用查询控制台进行当前方法,因此您已将自己隔离到单个主机。
您想要的实际命令是:
xdmp:server-status()
这将为您提供相当多的信息。返回XML中的一个项称为请求状态。根据当前任务的运行情况,计数将为您提供所需的内容。您还可以找到完整的队列大小。当然,如果还有其他任何事情使用任务队列,这一点都不会有任何帮助,因为您不知道与您的处理和任务队列中的其他项目相关的内容。
以下代码示例将一些任务加载到队列中,并演示如何获取队列大小和当前任务的运行。
xquery version "1.0-ml";
for $x in 1 to 10
for $y in 1 to 10
return xdmp:spawn-function(function(){
xdmp:sleep(1000)
})
;
let $id := fn:data(xdmp:host-status(xdmp:host())//*:task-server/*:task-server-id)
return for $x in 1 to 10
let $_ := xdmp:sleep(1000)
return
element {"current-status"} {
attribute {"queued"} {xdmp:server-status(xdmp:host(),$id)//*:queue-size/text()},
attribute {"being-processed"} {fn:count(xdmp:server-status(xdmp:host(),$id)//*:request-statuses/*)}
}
在我的机器上有16个线程用于任务服务器,我得到以下示例输出,显示两个数字都已用完。
<current-status queued="68" being-processed="16"/>
<current-status queued="52" being-processed="16"/>
<current-status queued="36" being-processed="16"/>
<current-status queued="20" being-processed="16"/>
<current-status queued="4" being-processed="16"/>
<current-status queued="0" being-processed="4"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>