【问题标题】:is newKieSession thread-safe?newKieSession 是线程安全的吗?
【发布时间】:2023-03-14 14:23:02
【问题描述】:

我们在项目中使用了 Drools kieSessions。许多线程可以创建新的 kieSession。有时线程可能会在创建会话时挂起。因此问题是:

首先

  1. kieContainer.newKieSession 是线程安全操作吗?
  2. 挂起的原因会是脏字或阅读 kie 会话集或类似的东西吗?

【问题讨论】:

    标签: java multithreading thread-safety drools kie


    【解决方案1】:

    我在 drools 文档中找不到任何明确的声明,但我的理解是 KieContainer 是线程安全的,甚至足够智能(有点默默/神奇地)更新自身(或者更确切地说是它包含的 KieBases)。

    出于所有实际目的(调试/阅读源代码),我认为所有 KieContainer.newStatelessKieSession()KieContainer.newKieSession() 方法都是线程安全的。

    我不是 100% 确定 updateToVersion()updateDependencyToVersion() 方法以及通过这些方法更改 kie 容器是否与 KieContainer.newStatelessKieSession()newKieSession() 方法并行工作。

    在我们的应用程序中,我们设法将修改规则(以及模块、基础、会话及其配置)的逻辑与规则评估(使用newKieSession 等方法)分开,到目前为止一切似乎都很好,但我想了解您是如何得出它不是线程安全的结论的。

    【讨论】:

      【解决方案2】:

      正如我在实践中检查的那样

      newKieSession
      

      不是线程安全的操作。

      【讨论】:

      • 我刚刚检查了版本 6.2.0.Final 和 6.3.0.Final - 它仍然不是线程安全的。参考:docs.jboss.org/jbpm/v6.3/javadocs/org/kie/api/…
      • @Eugene 你有没有发现什么不是线程安全的?我正在尝试将 kie 模块/基础/会话/规则配置与规则评估分开,并保持这些活动互斥(通过 ReentrantReadWriteLock)。所以只有一个写线程可以创建新的 kieContainers 而所有规则评估(只读)访问 kieContainer 非同步(使用那些newKieSessionnewStatelessKieSession 方法)..我会在下面发布一个答案..
      猜你喜欢
      • 2021-10-12
      • 2015-04-18
      • 2011-10-07
      • 2012-03-02
      • 2011-10-28
      • 2016-08-24
      • 2011-08-16
      • 2011-09-28
      • 2010-12-14
      相关资源
      最近更新 更多