簡體   English   中英

Drools無狀態會話中的全局變量

[英]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

我對嗎?

盡管我不能給您一個完全可靠的答案(因為我尚未測試過),但我會說您是對的,因為

  1. StatelessKnowledgeSession的支持下,Drools使用StatefulKnowledgeSession ,在有狀態會話中,我希望setGlobal(...)的調用會覆蓋先前調用的值。

  2. Globals存放在“ globals商店”中; 此全局存儲是特定於會話的,這意味着如果您實現了使用不同線程同時訪問同一會話,則一個線程將覆蓋另一個線程的全局存儲-哪個線程的setGlobal(...)最后執行。

我可以確認-全局變量存儲在線程之間的共享內存中。

我們使用一個全局變量來存儲每次執行的結果,發現當多個線程同時執行時,我們偶爾會得到錯誤的結果,因為另一個線程跳入並覆蓋了全局變量,而前一個線程已檢索到該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM