java为什么Camunda试图在错误的进程引擎中执行任务侦听器?
我有三个使用共享数据库的Camunda引擎:
核心工作流中有starter_wrapper_process.bpmn。这个过程开始于核心过程中定义的WrapperProcess.bpmn。最后,WrapperProcess.bpmn
从domain-hello-world
引擎启动DomainProcess.bpmn
什么时候
WrapperProcess.bpmn
开始{}和 DomainProcess.bpmn
完成(即执行返回到WrapperProcess.bpmn
)
我想在域进程开始之前和结束之后执行一段代码
这段代码必须位于core-processes
中,domain-hello-world
的开发人员必须能够创建和运行他们的流程,而不必考虑这段代码
因此,活动Start domain process
有两个任务侦听器(tab 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
在它的底部,你会看到一个^{
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
活动没有帮助(commit)
更新2:我试图在所有进程(commit)的所有活动中设置async-before
和async-after
。我仍然会犯同样的错误
更新3:作为一种解决方法,我将终端侦听器移动到调用活动之后的一个事件
# 1 楼答案
如果执行在错误的类加载器(这里是域进程)中启动和运行,则会发生此错误。 a) 确保将流程引擎配置为支持部署 b) 如果这还不够,请尝试将域进程的“结束前异步”事件更改为“结束后异步” c) 一种解决方法是在调用活动上设置async after,并将调用活动上的end listen更改为后续序列流上的take listener