Camunda:一次接收多个不同的消息
Camunda: Receive multiple, different messages at once
我目前正在使用 camunda 开发一个有点复杂的工作流程。此工作流的目标是协调不同外部业务流程的执行。其中包括启动、监督和同步这些工作流程。除了同步之外的一切都按预期工作。
示例:
我的示例有一个启动多个子工作流的主工作流。当所有子工作流完成时,主工作流必须知道。每个子工作流都由消息触发,并在执行结束时将消息发送回主工作流。因此,所有子工作流都应该在主工作流中同步。
Xml 可在本站访问:https://pastebin.com/2aj4z0zU
不幸的是,这会导致在主工作流程的阻塞点(第一个并行网关之后的第一个通道)出现大量消息关联异常。我正在使用以下代码关联消息:
this.runtimeService.createMessageCorrelation(messageName)
.processInstanceId(processInstanceId)
.setVariables(payload)
.correlate();
整个工作流是可执行的并且运行时没有错误,但前提是一次执行一个 example_workflow。一个接一个地快速启动多个 example_workflows 会导致每种消息类型随机出现此类异常:
ENGINE-16004 Exception while closing command context: Cannot correlate message 'PROCESS_B_FINISHED': No process definition or execution matches the parameters org.camunda.bpm.engine.MismatchingMessageCorrelationException: Cannot correlate message 'PROCESS_B_FINISHED': No process definition or execution matches the parameters
at org.camunda.bpm.engine.impl.cmd.CorrelateMessageCmd.execute(CorrelateMessageCmd.java:88) ~[camunda-engine-7.14.0.jar!/:7.14.0]
目前使用postgresql数据库会出现关联异常。当我们使用基于 h2 文件的数据库时,相同的工作流运行得更好,但并不完美。所有接收任务都没有配置异步,只有发送任务是(async before + exclusive)。
问题:
这是否已经是在一个工作流中同步多条消息的最佳实践?
使用 postgresql 数据库时出现关联异常的原因可能是什么?
使用的软件:
- spring 引导应用程序 [版本:2.3.4]
- 卡蒙达[版本:7.14.0]
- h2 [版本:1.4.200]
- postgresql [版本:42.2.22]
- 流程模型似乎包含可以 运行 陷入死锁的序列(如果蓝色后面直接跟着绿色怎么办?或黄色?)或者存在竞争条件。如果进程尚未达到消息接收状态,则消息传递将失败(如您共享的错误消息所示)
(如果竞争条件,您在 postgresql 上更频繁地观察 CorellationException 的原因。使用这个外部数据库,一些操作需要稍微多一些时间,增加了竞争条件发生的机会)。
- 流程引擎需要能够将消息匹配到唯一的接收者。如果同一个消息名称有多个潜在的接收者,并且没有提供其他创建唯一匹配的相关标准,那么传递也将失败。您需要为每个实例使用唯一的消息名称,或者更好地使用每个实例唯一的 businessKey 或流程数据作为附加关联标准。这就是为什么当您 运行 多个流程实例时它不起作用的原因。
如@rob2universe 所述post。
,使用此并行消息瓶颈对工作流建模会导致竞争条件
为了解决这个问题,我首先不得不直接关联消息。我通过为每条消息添加一个唯一标识符来做到这一点,这没什么大不了的,因为项目 ID 是在每条消息的有效负载中定义的。其次,我必须为每个接收任务和连接的网关删除所有异步和独占标记。第三,我必须将作业执行器属性重置为默认值。限制池大小和每次采集的作业对工作流执行没有好处。
完成所有这些更改后,我的工作流程现在可以正常运行,没有任何错误。不幸的是,由于所描述的瓶颈,乐观日志记录异常很常见,但工作流引擎处理这些异常而没有进一步的错误。
我目前正在使用 camunda 开发一个有点复杂的工作流程。此工作流的目标是协调不同外部业务流程的执行。其中包括启动、监督和同步这些工作流程。除了同步之外的一切都按预期工作。
示例:
我的示例有一个启动多个子工作流的主工作流。当所有子工作流完成时,主工作流必须知道。每个子工作流都由消息触发,并在执行结束时将消息发送回主工作流。因此,所有子工作流都应该在主工作流中同步。
不幸的是,这会导致在主工作流程的阻塞点(第一个并行网关之后的第一个通道)出现大量消息关联异常。我正在使用以下代码关联消息:
this.runtimeService.createMessageCorrelation(messageName)
.processInstanceId(processInstanceId)
.setVariables(payload)
.correlate();
整个工作流是可执行的并且运行时没有错误,但前提是一次执行一个 example_workflow。一个接一个地快速启动多个 example_workflows 会导致每种消息类型随机出现此类异常:
ENGINE-16004 Exception while closing command context: Cannot correlate message 'PROCESS_B_FINISHED': No process definition or execution matches the parameters org.camunda.bpm.engine.MismatchingMessageCorrelationException: Cannot correlate message 'PROCESS_B_FINISHED': No process definition or execution matches the parameters
at org.camunda.bpm.engine.impl.cmd.CorrelateMessageCmd.execute(CorrelateMessageCmd.java:88) ~[camunda-engine-7.14.0.jar!/:7.14.0]
目前使用postgresql数据库会出现关联异常。当我们使用基于 h2 文件的数据库时,相同的工作流运行得更好,但并不完美。所有接收任务都没有配置异步,只有发送任务是(async before + exclusive)。
问题:
这是否已经是在一个工作流中同步多条消息的最佳实践?
使用 postgresql 数据库时出现关联异常的原因可能是什么?
使用的软件:
- spring 引导应用程序 [版本:2.3.4]
- 卡蒙达[版本:7.14.0]
- h2 [版本:1.4.200]
- postgresql [版本:42.2.22]
- 流程模型似乎包含可以 运行 陷入死锁的序列(如果蓝色后面直接跟着绿色怎么办?或黄色?)或者存在竞争条件。如果进程尚未达到消息接收状态,则消息传递将失败(如您共享的错误消息所示)
(如果竞争条件,您在 postgresql 上更频繁地观察 CorellationException 的原因。使用这个外部数据库,一些操作需要稍微多一些时间,增加了竞争条件发生的机会)。
- 流程引擎需要能够将消息匹配到唯一的接收者。如果同一个消息名称有多个潜在的接收者,并且没有提供其他创建唯一匹配的相关标准,那么传递也将失败。您需要为每个实例使用唯一的消息名称,或者更好地使用每个实例唯一的 businessKey 或流程数据作为附加关联标准。这就是为什么当您 运行 多个流程实例时它不起作用的原因。
如@rob2universe 所述post。
,使用此并行消息瓶颈对工作流建模会导致竞争条件为了解决这个问题,我首先不得不直接关联消息。我通过为每条消息添加一个唯一标识符来做到这一点,这没什么大不了的,因为项目 ID 是在每条消息的有效负载中定义的。其次,我必须为每个接收任务和连接的网关删除所有异步和独占标记。第三,我必须将作业执行器属性重置为默认值。限制池大小和每次采集的作业对工作流执行没有好处。
完成所有这些更改后,我的工作流程现在可以正常运行,没有任何错误。不幸的是,由于所描述的瓶颈,乐观日志记录异常很常见,但工作流引擎处理这些异常而没有进一步的错误。