我们正在使用Activiti框架来构建将处理特定消息的分离业务流程。
BPMN有一个符号Parallel Gateway
,它允许我们创建“并行”的任务流。但是有没有一个机制(一个网关)来启动并行流,但是只要其中一个并行流完成就会杀掉其他的?
例如:
StartEvent -> ParallelGateway (fork) -> {FlowA, FlowB, FlowC} -> ParallelGateway (join) -> EndEvent
如果FlowB
首先完成,则加入网关不得等待其他人完成,停止它们(以便它们不需要执行到最后)并继续到下一个流程(在示例中它是一个EndEvent)。
任何想法如何实现?
修改
找到这个thread但不幸的是,这个解决方案并没有阻止其他流程。
答案 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)