在完成多个并行CPF管道执行后如何触发事件?

时间:2019-03-03 23:56:03

标签: marklogic

我有一个客户ID列表。对于他们每个人,我需要(通过Web服务)从外部系统收集一些信息,然后创建一个报告。在创建所有客户报告之后,我想根据所有报告自动生成摘要文档。

我的计划是使用MarkLogic内容处理框架(CPF)来处理Web请求和每个客户ID的报告生成。但是,我不知道在完成所有所有客户报告渠道之后,如何触发摘要文档的操作。

enter image description here

基于Mary's (@mholstege) response的更新(2019-03-04)

根据我对Mary的建议的理解,我应该只让一个管道直接处理客户ID文档,并创建操作以按顺序处理ID,然后在终端状态下执行摘要生成操作。我对这种设计的唯一担心是错误处理,因为我不再可以依靠CPF状态来跟踪每个单独的报告。我应该如何设计状态/动作来有效地处理故障?

enter image description here

2 个答案:

答案 0 :(得分:2)

要想完全正确,这将非常困难。您最终将创建瓶颈或漏洞,这可能会导致事情被跳过,或同时导致这两者。总体计划是在“创建报告”之后进行过渡,该过渡具有检查所有客户ID的状态并在所有客户ID都位于正确位置时启动摘要操作的条件。为了使它具有可靠性,您可能需要创建一个代表批次的单个文档,并让各个客户ID的管道对其进行更新(这将确保您可以依靠一个闩锁,不利的一面是创建了一个它们都将阻塞的单个闩锁。)但是,如果可以避免的话,我不建议这样做。

CPF旨在对一个文档执行一系列步骤。因此,使文档对它起作用是批次,并且使动作成为对批次起作用的动作。这可能意味着各个步骤的运行时间更长(尽管如果您可以控制Web服务API,也可以使其面向批处理,这可能会有所帮助),但最终吞吐量可能会更好。在任何情况下,请不要从CPF动作中生成或调用。

答案 1 :(得分:1)

当然,错误处理设计将非常棘手,并且需要权衡取舍。您可能对批次的任何成员都有所有错误,从而导致整个批次的失败:直接的代码可以做到这一点。或者,如果您想知道批次中的所有失败,但仍使批次失败,则可以收集所有单独的错误,然后将其重新传播为单个包装失败,例如在动作的标准try / catch模式中,例如:

current

尽管您可以添加一个可以实现此功能的错误状态的过渡,但这样做确实使棘手地标记单个文档变得棘手:查看批处理错误并将其放在每个引用的文档上。