主要问题是关于 static 字段和 singleton 实例(用于配置等)-是一个进程的实例在不同的环境中运行线程,像通常的servlet请求一样?
如果深入了解-不同 @ProcessApplication
是否可以在一个JVM中运行并且会看到相同的单例?我不这么认为。我完全知道他们的类不会互相看到,并且可以具有相同的名称(因为使用不同的classLoader?)
尚未找到有关Camunda的这些重要主题的任何有意义的信息,将不胜感激。
答案 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处理相应的应用程序并由相应的应用程序类加载器加载。
希望这会有所帮助。