我們在我們的項目中使用了Drools kieSessions。許多線程可以創建新的kieSession。有時線程會在創建會話時掛起。因此,問題:是newKieSession線程安全的?
首先
- 是kieContainer.newKieSession線程安全的操作?
- 懸掛的原因可能是一個骯髒的文字或閱讀kie會議的集合或類似的東西?
我們在我們的項目中使用了Drools kieSessions。許多線程可以創建新的kieSession。有時線程會在創建會話時掛起。因此,問題:是newKieSession線程安全的?
首先
正如我在實踐中檢驗
newKieSession
是不是線程安全的操作。
我在drools文檔中找不到任何明確的聲明,但我的理解是KieContainer
是線程安全的,甚至足夠智能(有點默默地/神奇地)更新自己(或者更確切地說它包含的KieBases)。
對於所有的實際目的(調試/閱讀源代碼),我認爲所有的KieContainer.newStatelessKieSession()
和KieContainer.newKieSession()
方法都是線程安全的。
我不是100%肯定的updateToVersion()
和updateDependencyToVersion()
方法以及是否通過並聯這些作品與KieContainer.newStatelessKieSession()
和newKieSession()
方法改變紀伊容器。
在我們的應用程序中,我們設法從規則評估(使用newKieSession
等方法)中修改規則(以及模塊,基礎,會話及其配置)的邏輯,到目前爲止似乎沒有問題,但我想了解你是如何得出結論的,它不是線程安全的。
我剛剛檢查了版本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
你鏈接到KieBase類,而不是KieContainer .. – Sebastian 2016-02-16 16:20:45
@Eugene確實你發現什麼不是線程安全的?我試圖從規則評估中分離kie模塊/基本/會話/規則配置,並保持這些活動互斥(通過ReentrantReadWriteLock)。因此,只有寫入線程可以創建新的kieContainers,而所有規則評估(只讀)訪問kieContainer非同步(使用'newKieSession','newStatelessKieSession'方法)..我發佈下面的答案.. – Sebastian 2016-02-16 16:52:32