当前位置: 首页 > 知识库问答 >
问题:

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

庞瀚
2023-03-14

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

BPMN有一个符号并行网关,它允许我们创建“并行”的任务流。但是是否有一种机制(网关)可以启动并行流,但一旦其中一个并行流完成,它就会杀死其他机制(网关)?

例如:

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

如果流B首先完成,则加入网关不得等待其他流完成,停止它们(这样它们就不需要执行到底),然后继续下一个流(在本例中,它是EndEvent)。

有什么想法如何实现吗?

编辑

找到此线程,但不幸的是,此解决方案不会阻止其他流。

共有2个答案

相温文
2023-03-14

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

阮炯
2023-03-14

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

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

我想的是:

外部启动事件-

异或连接将导致第一个令牌到达取消结束事件,从而取消整个事务。显然,这实际上有点“误用”了“取消”的构造,因为流在这里总是会取消事务,而不仅仅是作为“规则的例外”。

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

 类似资料:
  • 用Docker容器创建一个干净的石板的最佳方法是什么?很多时候,我觉得从头开始比较容易,但是我有一堆容器,我不确定它们的状态是什么,那么当我运行时,它就不让我运行了,因为docker容器可能还在使用中。

  • 问题内容: 我有一个看起来像这样的代码: 问题是,一旦执行,在关闭弹出的窗口之前,什么都不会发生。 如何继续运行代码? 问题答案: 那是有意的。您要做的是在调用app.exec()之前使用信号/插槽,Qt类中的代码或生成线程。 信号和插槽是您与Qt交互的实际方式。基本上,信号是任何“事件”或自定义“事件”,并且可以将插槽视为“事件处理程序”。例如,当某人按下GUI上的按钮时,它会创建一个信号,以寻

  • 我正在尝试处理用户的Backspace按键。我有2个处理程序绑定到一个输入元素。由于无法在onChange事件处理程序中检测按键,因此我必须在onKeyDown中进行。我想在按下backspace时停止onChange事件的传播(并在onKeyDown事件处理程序中处理)。有什么想法如何实现这一点?谢谢!

  • 我之所以要停止这些线程,是因为我需要将这个项目作为一个捆绑包部署到OSGi容器中。一旦包启动,多个线程将永远运行。因此,我需要实现一个destroy()方法来停止所有线程,以控制包的生命周期。 怎么样

  • 我需要做的是能够停止从一个实现runnable的线程类运行的所有线程。这就是我的意思:这里是我的“线程”类的开始: 这就是我如何创建多个线程来执行此操作: m是要创建的线程数。这可能是从50到1000的任何地方。现在我需要做的是突然立刻停止所有的动作。我该怎么做呢?

  • 我有一个问题,我无法通过谷歌搜索找到解决方案。 我有一个库,我正在使用它(不想编辑,除非真的有必要),它允许用户选择一个项目,然后调用我的自定义回调函数来修改该项目,然后继续使用它。 我需要在上面执行一些异步任务,这可能需要一些时间。这将创建一个竞争条件,因为当回调函数完成时,我的异步任务尚未完成,并且库继续其对项的工作。 如何等待我的两个异步任务完成,然后允许这个回调完成? 我唯一能想到的就是每