Activiti - 停止所有并行流的网关?

时间:2014-02-10 13:13:00

标签: java activiti bpmn

我们正在使用Activiti框架来构建将处理特定消息的分离业务流程。

BPMN有一个符号Parallel Gateway,它允许我们创建“并行”的任务流。但是有没有一个机制(一个网关)来启动并行流,但是只要其中一个并行流完成就会杀掉其他的?

例如:

StartEvent -> ParallelGateway (fork) -> {FlowA, FlowB, FlowC} -> ParallelGateway (join) -> EndEvent

如果FlowB首先完成,则加入网关不得等待其他人完成,停止它们(以便它们不需要执行到最后)并继续到下一个流程(在示例中它是一个EndEvent)。

任何想法如何实现?

修改

找到这个thread但不幸的是,这个解决方案并没有阻止其他流程。

2 个答案:

答案 0 :(得分:1)

您可能希望尝试在嵌入式事务子流程中使用取消结束事件。不过,我从未亲自使用过这个功能。参见:

http://www.activiti.org/userguide/#bpmnCancelEndEvent http://www.activiti.org/userguide/#bpmnBoundaryCancelEvent

我想到的是:

Outer StartEvent - >事务子进程边界 - > Inner StartEvent - > ParallelGateway(fork) - > {FlowA,FlowB,FlowC} - > XorGateway(加入) - >内取消EndEvent - >附加了边界取消事件的事务子流程边界 - >外部EndEvent(序列流来自取消边界事件)

XOR连接将导致第一个令牌到达取消结束事件,从而取消整个事务。显然,这实际上是对“取消”构造的一种“误用”,因为这里的流程总是取消交易,而不仅仅是“规则的例外”。

(从BPMN的角度来看,“终止结束事件”而不是取消结束事件将更好地适应。这样的结束事件实际上只是终止了结束事件放在其中的子进程范围。在这种情况下,流程可以继续没有附加边界取消事件。但是,我不确定Activiti目前是否支持此功能,至少我没有在文档中找到它...!)

答案 1 :(得分:0)

根据定义,AFAIK并行网关实际上并不模拟并发执行,例如,并发运行的线程。相反,执行从第一个开始按顺序运行,直到达到等待状态/结束或并行连接。然后执行引擎按顺序开始另一个执行,依此类推。所以等待似乎是并行执行的固有部分