【问题标题】:Should JavaDelegate classes for Camunda BPM be thread safe?Camunda BPM 的 JavaDelegate 类应该是线程安全的吗?
【发布时间】:2018-11-29 15:44:11
【问题描述】:

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

如果看得更深——不同 @ProcessApplication 在一个 JVM 中运行并且会看到相同的单例吗?我不这么认为。我确切地知道他们的类看不到彼此并且可以具有相同的名称(因为不同的类加载器?)

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

【问题讨论】:

  • 请添加更多描述和插图。

标签: java multithreading concurrency thread-safety camunda


【解决方案1】:

我回来时对我们的一个场景有同样的问题,并阅读了他们的Javadoc as mentioned here 以获取 servlet 容器。提取Javadoc,

调用语义

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

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

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


回答你的问题:

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

注意!

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

因此,由于Process Definitions 的多次调用,在任何时候都可能有许多委托实例正在运行。因此,如果它们正在访问共享资源,那么它们需要被同步(线程安全),因为共享资源(staticsingleton)对于根据上述Invocation Semantics Javadoc 处理应用程序并由相应的应用程序类加载器加载。

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多