为什么 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。
当
WrapperProcess.bpmn
开始 DomainProcess.bpmn
和
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 process
的 async-after
如下所示 activity 没有帮助(commit.
更新 2: 我试图在所有进程的所有活动中设置 async-before
和 async-after
(commit)。我仍然遇到同样的错误。
更新 3: 作为变通方法,我在调用 activity.
后将结束侦听器移至事件
如果执行在错误的 class 加载程序(此处为域进程)中发起并运行,则会发生此错误。
a) 确保您的流程引擎配置为部署感知
b) 如果这还不够,请尝试将域进程的结束事件之前的异步更改为之后的异步
c) 解决方法是在调用 activity 之后设置异步,并将调用 activity 的结束监听更改为后续序列流中的 take 监听器。
我有三个使用共享数据库的 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。
当
WrapperProcess.bpmn
开始DomainProcess.bpmn
和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 process
的 async-after
如下所示 activity 没有帮助(commit.
更新 2: 我试图在所有进程的所有活动中设置 async-before
和 async-after
(commit)。我仍然遇到同样的错误。
更新 3: 作为变通方法,我在调用 activity.
后将结束侦听器移至事件如果执行在错误的 class 加载程序(此处为域进程)中发起并运行,则会发生此错误。 a) 确保您的流程引擎配置为部署感知 b) 如果这还不够,请尝试将域进程的结束事件之前的异步更改为之后的异步 c) 解决方法是在调用 activity 之后设置异步,并将调用 activity 的结束监听更改为后续序列流中的 take 监听器。