[英]Global Variable in Drools stateless session
如何為Drools無狀態會話設置全局變量。
假設有兩個線程訪問同一會話,但為每個線程設置了一個全局變量客戶arraylist,並帶有新的arraylist。 第二個線程的arraylist是否代替全局變量customer的第一個線程的arraylist。
從StatelessKnowledgeSession類文檔中可以看到這種情況:
StatelessKnowledgeSessions支持全局范圍,其范圍有多種。 我將首先介紹非命令方式,因為命令的作用域是特定的執行調用。 全局變量可以通過三種方式解決。 StatelessKnowledgeSession支持getGlobals(),該函數返回Globals實例。 這些全局變量是為所有執行調用共享的,因此在這種情況下,請特別注意可變全局變量-因為執行調用通常可以在不同線程中同時執行。 Globals還支持委托,這增加了第二種解決Globals的方法。 setGlobal(String,Object)的調用實際上是在一個內部Collection上設置的,如果添加了一個,則此內部Collection中的標識符將優先於提供的委托。 如果在內部集合中找不到標識符,則它將檢查委托全局變量(如果已設置)。
http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html
我對嗎?
盡管我不能給您一個完全可靠的答案(因為我尚未測試過),但我會說您是對的,因為
在StatelessKnowledgeSession
的支持下,Drools使用StatefulKnowledgeSession
,在有狀態會話中,我希望setGlobal(...)
的調用會覆蓋先前調用的值。
Globals存放在“ globals商店”中; 此全局存儲是特定於會話的,這意味着如果您實現了使用不同線程同時訪問同一會話,則一個線程將覆蓋另一個線程的全局存儲-哪個線程的setGlobal(...)
最后執行。
我可以確認-全局變量存儲在線程之間的共享內存中。
我們使用一個全局變量來存儲每次執行的結果,發現當多個線程同時執行時,我們偶爾會得到錯誤的結果,因為另一個線程跳入並覆蓋了全局變量,而前一個線程已檢索到該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.