有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么Camunda试图在错误的进程引擎中执行任务侦听器?

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

核心工作流中有starter_wrapper_process.bpmn。这个过程开始于核心过程中定义的WrapperProcess.bpmn。最后,WrapperProcess.bpmndomain-hello-world引擎启动DomainProcess.bpmn

什么时候

  1. WrapperProcess.bpmn开始{}和
  2. DomainProcess.bpmn完成(即执行返回到WrapperProcess.bpmn

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

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

因此,活动Start domain process有两个任务侦听器(tab Listeners),它们应该在域进程开始之前和结束之后执行DomainProcessStartFinishTaskListener

Image showing BPMN diagram in Camunda Modeler with the start and end task listener settings

由于这个监听器是从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

Incident in domain-hello-world engine

完整堆栈跟踪可用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 processasync-after活动没有帮助(commit

Start domain process activity with async-after set to true

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

更新3:作为一种解决方法,我将终端侦听器移动到调用活动之后的一个事件

Fragment of a new diagram


共 (1) 个答案

  1. # 1 楼答案

    如果执行在错误的类加载器(这里是域进程)中启动和运行,则会发生此错误。 a) 确保将流程引擎配置为支持部署 b) 如果这还不够,请尝试将域进程的“结束前异步”事件更改为“结束后异步” c) 一种解决方法是在调用活动上设置async after,并将调用活动上的end listen更改为后续序列流上的take listener