有没有办法检查任务服务器上的所有衍生任务是否在marklogic中完成?

时间:2018-01-05 11:09:31

标签: marklogic marklogic-8

我正在使用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任务等等......

请同样帮忙,如果需要更多细节,请告诉我。

1 个答案:

答案 0 :(得分:1)

在完整阅读您的帖子时,我强烈建议您查看以下选项:

  • CORB2(使用xdmp:save)
  • MLCP(如果您只是尝试使用shell命令和配置文件按原样导出内容,则自然选择)
  • Data Movement SDK(一个强大的Java工具包,包含上述两者的优点)

但要回答标题中的具体问题,请参阅以下内容:

请记住,作为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"/>