如何为drools无状态会话设置全局变量。
假设有两个线程访问同一个会话,但设置了一个全局变量customer arraylist 每个线程的新arraylist。第二个线程的arraylist是否替换了全局变量customer的第一个线程的arraylist。
StatelessKnowledgeSession类文档似乎就是这种情况:
StatelessKnowledgeSessions支持全局变量,其范围有很多种。我将首先介绍非命令方式,因为命令的作用域是特定的执行调用。 Globals可以通过三种方式解决。 StatelessKnowledgeSession支持getGlobals(),它返回一个Globals实例。这些全局变量是为所有执行调用共享的,因此在这些情况下要特别注意可变全局变量 - 因为执行调用通常可以在不同的线程中同时执行。 Globals还支持一个委托,它增加了第二种解决全局变量的方法。调用setGlobal(String,Object)实际上将在内部Collection上设置,如果添加了一个,则此内部Collection中的标识符将优先于提供的委托。如果在内部Collection中找不到标识符,则会检查委托Globals(如果已设置)。
http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html
我是对的吗?
答案 0 :(得分:0)
虽然我不能给你一个完全可靠的答案(因为我没有测试过这个),但我会说你是对的,因为
在StatelessKnowledgeSession
的引擎下,Drools使用StatefulKnowledgeSession
并且在有状态会话中,我希望setGlobal(...)
的调用覆盖之前调用的值
Globals被置于“全球商店”;这个全局存储是特定于会话的,这意味着如果你使用不同的线程同时访问同一个会话,一个线程将覆盖另一个线程的全局存储 - 最后执行的setGlobal(...)
线程。
答案 1 :(得分:0)
我可以确认-全局变量存储在线程之间的共享内存中。
我们使用一个全局变量来存储每次执行的结果,发现当多个线程同时执行时,我们偶尔会得到错误的结果,因为另一个线程在检索上一个线程之前跳入并覆盖了全局变量值。