Camunda BPM的JavaDelegate类是否应该是线程安全的?

Dan*_*ndt 9 java concurrency multithreading thread-safety camunda

主要问题是关于静态字段和单例实例(对于配置等) - 是一个进程在不同线程运行的实例,就像通常的servlet请求一样?

如果看得更深 - 在一个JVM中执行不同的 @ProcessApplication运行并看到相同的单例?我不这么认为.我确切地知道他们的类没有看到对方并且可以有相同的名称(因为不同的classLoaders?)

没有找到关于Camunda这些重要主题的任何有意义的信息,将非常感谢您的回答.

isu*_*u89 5

回到过程中,我对我们的一个场景有同样的问题,并阅读这里提到的用于servlet容器的Javadoc.提取Javadoc,

调用语义

当调用{@link #execute(java.util.concurrent.Callable)}方法时,servlet进程应用程序将当前Thread的上下文类加载器修改为加载此类的应用程序提供的子类的类加载器.这允许,

  • 使用流程应用程序的类加载器解析{@link JavaDelegate}实现的流程引擎

这几乎可以解释您想要了解的所有内容,因为该行为与Web容器的运行方式非常相似.如果您想知道其他容器实现的行为,可以检查此包中各自的Javadoc .


回答你的问题:

是的.JavaDelegate在同一个流程应用程序中访问的共享资源需要线程安全性.根据文档(见下文),每次执行任务时,他们都会创建一个新的委托实例.

注意!

每次执行委托类引用活动时,都将创建此类的单独实例.这意味着每次执行一个活动时,都会使用该类的另一个实例来调用execute(DelegateExecution).

因此,由于多次调用,在任何时候都可能有许多委托实例正在运行Process Definitions.因此,如果他们正在访问共享资源,那么他们需要进行同步(线程安全),因为共享资源(静态单例)是流程应用程序的本地资源,并由相应的应用程序类加载器根据上面的调用语义 Javadoc 加载.

希望这可以帮助.

  • 确切地说,除了这个进程之外,Camunda 的作业执行器 (https://docs.camunda.org/manual/7.6/user-guide/process-engine/the-job-executor/) 同时执行。 (2认同)