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 数据库时出现关联异常的原因可能是什么?

使用的软件:

  • 流程模型似乎包含可以 运行 陷入死锁的序列(如果蓝色后面直接跟着绿色怎么办?或黄色?)或者存在竞争条件。如果进程尚未达到消息接收状态,则消息传递将失败(如您共享的错误消息所示)

(如果竞争条件,您在 postgresql 上更频繁地观察 CorellationException 的原因。使用这个外部数据库,一些操作需要稍微多一些时间,增加了竞争条件发生的机会)。

  • 流程引擎需要能够将消息匹配到唯一的接收者。如果同一个消息名称有多个潜在的接收者,并且没有提供其他创建唯一匹配的相关标准,那么传递也将失败。您需要为每个实例使用唯一的消息名称,或者更好地使用每个实例唯一的 businessKey 或流程数据作为附加关联标准。这就是为什么当您 运行 多个流程实例时它不起作用的原因。

如@rob2universe 所述post。

,使用此并行消息瓶颈对工作流建模会导致竞争条件

为了解决这个问题,我首先不得不直接关联消息。我通过为每条消息添加一个唯一标识符来做到这一点,这没什么大不了的,因为项目 ID 是在每条消息的有效负载中定义的。其次,我必须为每个接收任务和连接的网关删除所有异步和独占标记。第三,我必须将作业执行器属性重置为默认值。限制池大小和每次采集的作业对工作流执行没有好处。

完成所有这些更改后,我的工作流程现在可以正常运行,没有任何错误。不幸的是,由于所描述的瓶颈,乐观日志记录异常很常见,但工作流引擎处理这些异常而没有进一步的错误。