如何在最终事件发生时停止循环事件?

时间:2016-10-12 18:07:11

标签: activiti bpmn camunda business-process

我对BPMN 2.0(Camunda)的世界很陌生。我需要建模一个非常复杂的工作流程,如下所述。任何帮助都非常感谢!

单个进程有一个“事件循环”,它从外部系统捕获任务事件,然后异步提交任务以执行到外部系统,并通过POST休息回调机制等待其完成状态。任何数量的此类任务事件都可以进入,直到收到标记任务列表结束的特定消息。此时,主进程应检查所有异步提交的任务是否已完成或等待仍在运行的任务完成。如果任何任务失败,则应将整个过程标记为失败。

2 个答案:

答案 0 :(得分:0)

您可以使用activiti的接收任务来实现此目的。

http://www.activiti.org/userguide/#bpmnReceiveTask

我有类似的情况,在我的工作流程中,我们不得不等待来自外部应用程序的输入。您可以使用等待任务,然后当您收到该数据时,您必须明确地发出此任务的信号,以便执行进入下一阶段。

答案 1 :(得分:0)

这种情况非常类似于我们在我们客户处实施的情况。

但是,您需要以不同的方式考虑问题。 Camunda或它的前身引擎(Activiti)都没有能力处理我喜欢的术语和耐用性#34;消息。 A"耐用"消息是一个将在引擎内持续存在的消息,直到引擎到来并查找它为止。通常,如果您使用的是pub / sob消息平台(如JMS),这不是问题。但是如果你通过http通过tcp进行通信,那么这可能很麻烦,因为MESSAGES可能会丢失/丢失。

所以,我假设(根据你的描述)你计划使用http over tcp。

因此,为了确保您不会丢失消息,您需要放弃"循环"范例。通过循环,您无法保证当消息进入时,流程实例将在接收任务中等待。

因此,您应该考虑单个"实例"而不是使用循环。由消息启动事件触发的进程,消息启动事件将包含一个业务数据密钥,该密钥充当相关实例之间的相关性。

基本流程如下:

enter image description here

请注意,流程非常简单,接收消息,进行异步调用并等待成功消息,然后结束。

有一个决策网关确定传入消息是否是列表任务的结束。如果检测到这种情况,我们分支,使用相同的相关键查询活动实例,并等待实例ti失败或完成。如果完成,则最终任务流程实例完成并更新相应的审计跟踪。

如果完成实例任何失败,那么"最终任务" instance处理错误条件。