2016-05-23 34 views
0

我在插入和更新文档时创建了CPF。这些CPF管道创建多个xdmp:spawn-tasks以执行各种任务。我用这种方法有几个问题。MarkLogic 8中的CPF和任务服务器

  1. 一些产生的任务将修改原始文档。这会触发CPF的更新工作流程吗?我可以在文档上使用一个标志,表明它是衍生任务的更新。但是,有没有更好的方法来做到这一点?
  2. 我需要担心死锁吗?我的意思是,如果从同一个CPF产生的两个任务尝试同时更新同一个文档,我该如何避免这种情况?

基本上我试图为我插入的文档使用信封模式,并将所有的工件文档包装到一个文档中。我使用CPF生成此工件文档的原因是,我可以使用MLCP或任何其他方式将文档转储到数据库中,并让CPF担心处理,而不是使用自定义REST端点并通过此方法获取所有文档定制REST端点。

+2

为什么你在第一个地方显式使用spawn?为什么不把这项工作作为单独的管道步骤执行并让CPF负责管理?从你的解释中你不清楚你想要完成什么。 –

+0

我原本是在做自己的CPF任务,但是当我这样做时,我有时会发现内存异常,因为我所做的一件事就是使用“xdmp:document-filter”从文档中提取文本...但使用任务服务器,我没有得到任何东西,从而产生任务..我不认为原始文件的大小是问题。我最初的记忆假设没有得到释放或什么......但随着任务正常工作 – Ravi

+0

xdmp:文件过滤器允许流式传输结果,所以它不一定需要消耗大量内存。然而,过滤可能是一个沉重的过程。这可能是值得打开另一个问题,以分享一些更多的细节,并问为什么你收到内存异常.. – grtjn

回答

0

我会建议不要派生任务将更新应用到手边的文档。这种更新会干扰公积金国家的自然流动。 CPF本身旨在通过多个州采取文件,并且每次转换都对整个转换作出贡献。

因此,让文档通过多个CPF状态,并在更多状态转换(管道)中进行更新。每个状态转换已经是一个单独的事务,所以不需要派生任务。

我不认为你需要担心死锁,但我可以很容易想象,并行执行更新会导致部分更新丢失,因为它们可能会被相互覆盖。这种取决于你正在使用的确切代码。 MarkLogic的交易机制通常会防范这种情况,但编写绕过该机制的代码很容易。

HTH!

+1

有用的阅读:[预防死锁](http://docs.marklogic.com/guide/app-dev/transactions #id_85082) –

+0

适用于eval和invoke,不会产生,但有用但是.. – grtjn

+0

我原本是在CPF任务中做它自己的,但是当我这样做时,我有时会出现内存异常,因为我一次做的是从文档中使用“xdmp:document-filter”提取文本......但是使用任务服务器我没有得到任何东西,因此产生了任务。而且我不认为原始文档的大小是问题。我最初的记忆假设没有得到释放或某事...但随着任务一切工作正常.. – Ravi