为什么 Camunda 会尝试在错误的流程引擎中执行任务侦听器?

Why does Camunda attempt to execute a task listener in the wrong process engine?

我有三个使用共享数据库的 Camunda 引擎:

domain-hello-world 引擎有 starter_wrapper_process.bpmn in core-workflow. This process starts WrapperProcess.bpmn defined in core-processes. Finally, WrapperProcess.bpmn starts DomainProcess.bpmn

  1. WrapperProcess.bpmn 开始 DomainProcess.bpmn
  2. DomainProcess.bpmn完成(即执行returns到WrapperProcess.bpmn),

我想在域进程开始之前和结束之后执行某段代码。

这段代码必须位于 core-processes 中,domain-hello-world 的开发人员必须能够创建和 运行 他们的流程,而无需考虑这段代码。

因此 activity Start domain process 有两个任务侦听器(选项卡 Listeners),它们应该在域进程启动之前和完成之后执行 DomainProcessStartFinishTaskListener

由于此侦听器是从 core-processes 引用并在其中定义的,因此我假设它会 运行 在 core-processes 中(前提是所有引擎 运行 都处于部署感知模式) .

但事实并非如此。

假设我启动了所有三个引擎并通过任务列表启动 Starter Process。在控制台输出中我看到 DomainProcessStartFinishTaskListener.notify 这意味着启动侦听器已成功执行。

接下来,我进入任务列表,完成人工任务。

现在发生了意想不到的事情:domain-hello-world 引擎中的 DomainProcess.bpmn 实例发生了一个事件:

ENGINE-09008 Exception while instantiating class 'org.example.DomainProcessStartFinishTaskListener': ENGINE-09017 Cannot load class 'org.example.DomainProcessStartFinishTaskListener': org.example.DomainProcessStartFinishTaskListener

完整的堆栈跟踪可用 here

在它的底部,你会看到 ClassNotFoundException:

Caused by: org.camunda.bpm.engine.ClassLoadingException: ENGINE-09017 Cannot load class 'org.example.DomainProcessStartFinishTaskListener': org.example.DomainProcessStartFinishTaskListener
    at org.camunda.bpm.engine.impl.util.EngineUtilLogger.classLoadingException(EngineUtilLogger.java:146)
    at org.camunda.bpm.engine.impl.util.ReflectUtil.loadClass(ReflectUtil.java:111)
    at org.camunda.bpm.engine.impl.util.ClassDelegateUtil.instantiateDelegate(ClassDelegateUtil.java:46)
    ... 187 more
Caused by: java.lang.ClassNotFoundException: org.example.DomainProcessStartFinishTaskListener

这是可以理解的 -- org.example.DomainProcessStartFinishTaskListener 是在 core-processes 中定义的(而不是在 domain-hello-world 中)。

我无法理解的是为什么 domain-hello-world 试图执行位于 core-processes 中的 BPMN 文件中引用的任务侦听器。 DomainProcess 不包含任何任务侦听器并且不引用 org.example.DomainProcessStartFinishTaskListener.

我需要如何修改我的代码才能使 org.example.DomainProcessStartFinishTaskListener 始终在 core-processes 中执行(域进程开始之前和结束之后)?

更新 1: 设置 Start domain processasync-after 如下所示 activity 没有帮助(commit.

更新 2: 我试图在所有进程的所有活动中设置 async-beforeasync-after (commit)。我仍然遇到同样的错误。

更新 3: 作为变通方法,我在调用 activity.

后将结束侦听器移至事件

如果执行在错误的 class 加载程序(此处为域进程)中发起并运行,则会发生此错误。 a) 确保您的流程引擎配置为部署感知 b) 如果这还不够,请尝试将域进程的结束事件之前的异步更改为之后的异步 c) 解决方法是在调用 activity 之后设置异步,并将调用 activity 的结束监听更改为后续序列流中的 take 监听器。