2014-09-12 182 views
3

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

首先

  1. 是kieContainer.newKieSession线程安全的操作?
  2. 悬挂的原因可能是一个肮脏的文字或阅读kie会议的集合或类似的东西?

回答

2

正如我在实践中检验

newKieSession 

是不是线程安全的操作。

+0

我刚刚检查了版本6.2.0.Final和6.3.0.Final - 它仍然不是线程安全的。参考:https://docs.jboss.org/jbpm/v6.3/javadocs/org/kie/api/KieBase.html#newKieSession() – 2015-12-15 11:23:36

+0

你链接到KieBase类,而不是KieContainer .. – Sebastian 2016-02-16 16:20:45

+0

@Eugene确实你发现什么不是线程安全的?我试图从规则评估中分离kie模块/基本/会话/规则配置,并保持这些活动互斥(通过ReentrantReadWriteLock)。因此,只有写入线程可以创建新的kieContainers,而所有规则评估(只读)访问kieContainer非同步(使用'newKieSession','newStatelessKieSession'方法)..我发布下面的答案.. – Sebastian 2016-02-16 16:52:32

1

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

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

我不是100%肯定的updateToVersion()updateDependencyToVersion()方法以及是否通过并联这些作品与KieContainer.newStatelessKieSession()newKieSession()方法改变纪伊容器。

在我们的应用程序中,我们设法从规则评估(使用newKieSession等方法)中修改规则(以及模块,基础,会话及其配置)的逻辑,到目前为止似乎没有问题,但我想了解你是如何得出结论的,它不是线程安全的。