Camunda BPM 的 JavaDelegate 类 应该是线程安全的吗?
Should JavaDelegate classes for Camunda BPM be thread safe?
主要问题是关于 static 字段和 singleton 实例(用于配置等)- 是 一个进程 运行像往常一样在不同的线程中运行 servlet 请求?
如果看得更深一些 - 在一个 JVM 中执行 不同 @ProcessApplication
运行 会看到相同的单例吗?我不这么认为。我确切地知道他们 类 看不到对方并且可以有相同的名字(因为不同的类加载器?)
尚未找到关于这些关于 Camunda 的重要主题的任何有意义的信息,将不胜感激您的回答。
我之前对我们的一个场景也有同样的问题,并阅读了他们的 Javadoc as mentioned here 以了解 servlet 容器。正在提取 Javadoc,
Invocation Semantics
When the {@link #execute(java.util.concurrent.Callable)} method is
invoked, the servlet process application modifies the context
classloader of the current Thread to the classloader that loaded the
application-provided subclass of this class. This allows,
- the process engine to resolve {@link JavaDelegate} implementations using the classloader of the process application
这几乎解释了您想知道的一切,因为其行为与 Web 容器的运行方式非常相似。如果您想了解其他容器实现的行为方式,可以查看 classes in this package.
各自的 Javadocs
回答你的问题:
是。 JavaDelegate
在同一进程应用程序中访问的共享资源需要线程安全。根据documentation(见下文)他们每次要执行任务时都会创建一个新的委托实例。
Note!
Each time a delegation class referencing activity is executed, a
separate instance of this class will be created. This means that each
time an activity is executed there will be used another instance of
the class to call execute(DelegateExecution).
因此,由于 Process Definitions
的多次调用,任何时候都可能有许多委托实例处于活动状态 运行。因此,如果他们正在访问共享资源,那么他们需要同步(线程安全),因为共享资源(static 或 singleton) 对于进程应用程序是本地的,并由相应的应用程序类加载器根据上面的 Invocation Semantics Javadoc.
加载
希望对您有所帮助。
主要问题是关于 static 字段和 singleton 实例(用于配置等)- 是 一个进程 运行像往常一样在不同的线程中运行 servlet 请求?
如果看得更深一些 - 在一个 JVM 中执行 不同 @ProcessApplication
运行 会看到相同的单例吗?我不这么认为。我确切地知道他们 类 看不到对方并且可以有相同的名字(因为不同的类加载器?)
尚未找到关于这些关于 Camunda 的重要主题的任何有意义的信息,将不胜感激您的回答。
我之前对我们的一个场景也有同样的问题,并阅读了他们的 Javadoc as mentioned here 以了解 servlet 容器。正在提取 Javadoc,
Invocation Semantics
When the {@link #execute(java.util.concurrent.Callable)} method is invoked, the servlet process application modifies the context classloader of the current Thread to the classloader that loaded the application-provided subclass of this class. This allows,
- the process engine to resolve {@link JavaDelegate} implementations using the classloader of the process application
这几乎解释了您想知道的一切,因为其行为与 Web 容器的运行方式非常相似。如果您想了解其他容器实现的行为方式,可以查看 classes in this package.
各自的 Javadocs回答你的问题:
是。 JavaDelegate
在同一进程应用程序中访问的共享资源需要线程安全。根据documentation(见下文)他们每次要执行任务时都会创建一个新的委托实例。
Note!
Each time a delegation class referencing activity is executed, a separate instance of this class will be created. This means that each time an activity is executed there will be used another instance of the class to call execute(DelegateExecution).
因此,由于 Process Definitions
的多次调用,任何时候都可能有许多委托实例处于活动状态 运行。因此,如果他们正在访问共享资源,那么他们需要同步(线程安全),因为共享资源(static 或 singleton) 对于进程应用程序是本地的,并由相应的应用程序类加载器根据上面的 Invocation Semantics Javadoc.
希望对您有所帮助。