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

时间:2018-11-29 15:44:11

标签: java multithreading concurrency thread-safety camunda

主要问题是关于 static 字段和 singleton 实例(用于配置等)-是一个进程的实例在不同的环境中运行线程,像通常的servlet请求一样?

如果深入了解-不同 @ProcessApplication是否可以在一个JVM中运行并且会看到相同的单例?我不这么认为。我完全知道他们的类不会互相看到,并且可以具有相同的名称(因为使用不同的classLoader?)

尚未找到有关Camunda的这些重要主题的任何有意义的信息,将不胜感激。

1 个答案:

答案 0 :(得分:5)

我回来时对于我们的一种情况也有同样的问题,并阅读了他们的Javadoc as mentioned here作为servlet容器。提取Javadoc,

  

调用语义

     

当{@link #execute(java.util.concurrent.Callable)}方法为   调用后,servlet流程应用程序将修改上下文   当前线程的类加载器到加载了该类的类加载器   应用程序提供的此类的子类。

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

这几乎解释了您想知道的所有内容,因为其行为与Web容器的运行方式非常相似。如果您想了解其他容器实现的行为,可以检查classes in this package的相应Javadocs。


回答您的问题:

JavaDelegate在同一流程应用程序中访问的共享资源需要线程安全。根据{{​​3}}(请参阅下文),每次执行任务时,它们都会创建一个新的委托实例

  

注意!

     

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

因此,由于Process Definitions的多次调用,随时都有许多活动的委托实例在运行。因此,如果他们正在访问共享资源,则需要对其进行同步(线程安全),因为共享资源( static singleton )是本地的。根据上述 Invocation Semantics Javadoc处理相应的应用程序并由相应的应用程序类加载器加载。

希望这会有所帮助。