繁体   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