我们计划使用xdmp:lock-acquire
MarkLogic中的API(无超时选项)为文档实现一种锁定机制。该文档将被锁定,直到用户编辑并保存该文档为止。为此,我们需要在指定的时间(例如每天12:00 AM)释放所有锁。
为此,我们可以使用xdmp:lock-release
API,但是如果有很多文档,则需要一些时间才能完成。
有人可以建议在MarkLogic中实现此目标的更好方法吗?
如果你有可能需要处理的大量锁,并且担心在单个事务中完成所有工作所导致的超时或其他问题,则可以将工作分解为较小的块或单个事务。
有各种各样的批处理工具和框架可以做到这一点。CoRB是一种可以轻松插入自定义选择器和处理脚本以及针对大型集合执行的选项。
如果你希望从MarkLogic计划的任务中启动工作并在MarkLogic中执行所有工作,则可以生成多个任务来处理子集。
一个简单的示例,演示如何为每个事务设置“块大小”并如何继续产生更多工作:
declare function local:release-locks($locks, $chunk-size){
if (exists($locks))
then (
(: release all of these locks(you might apply some sort of filter to restrict to a subset,
and maybe a try/catch in case the lock gets released before this runs) :)
$locks[1 to $chunk-size] ! xdmp:node-uri(.) ! xdmp:lock-release(.),
(: now spawn the next set to be released in a separate transaction :)
xdmp:spawn-function(function(){
local:release-locks(subsequence($locks, $chunk-size+1), $chunk-size)
},
<options xmlns="xdmp:eval">
<update>true</update>
<commit>auto</commit>
</options>)
)
else () (: nothing left to do, stop spawning work :)
};
let $locks := xdmp:document-locks()
let $chunk-size := 1000
local:release-locks($locks, $chunk-size)
如果你想沿这条路线走,则有一些可用的库:
将多个项目产卵到任务服务器上的风险是,如果重新启动或中断,则某些任务可能无法执行,并且所有锁也可能无法释放。但是,如果你只是想释放所有锁,则可以重新运行该脚本以启动另一轮。
非常感谢!将尝试这些,并让您知道。
我尝试使用计划任务执行锁定释放过程,但该方法可以正常工作,但是是否有一种方法可以获取计划任务的状态,无论它是否尚未开始/开始/进行中/已取消/已完成?
您可以看到任务服务器上正在运行哪些查询。有各种各样的API。您还可以在模块中放入一些日志消息,以使用xdmp:log()或xdmp:trace()指示执行的开始和结束。
如果计划任务仍在进行中或完成,我需要向前端发送消息。因此,基于任务服务器状态,我需要发送此消息吗?