1

如何为 drools 无状态会话设置全局变量。

假设两个线程访问同一个会话,但为每个线程设置了一个全局变量 customer 数组列表,其中包含新的数组列表。第二个线程的数组列表是否替换了全局变量客户的第一个线程的数组列表。

StatelessKnowledgeSession 类文档似乎就是这种情况:

StatelessKnowledgeSessions 支持全局变量,范围有多种。我将首先介绍非命令方式,因为命令的范围仅限于特定的执行调用。全局变量可以通过三种方式解决。StatelessKnowledgeSession 支持 getGlobals(),它返回一个 Globals 实例。这些全局变量为所有执行调用共享,因此在这些情况下要特别注意可变全局变量——因为通常执行调用可以在不同的线程中同时执行。Globals 还支持委托,它增加了解析全局变量的第二种方法。setGlobal(String, Object) 的调用实际上将在内部集合上设置,如果添加了一个,则此内部集合中的标识符将优先于提供的委托。如果在内部 Collection 中找不到标识符,它将检查委托 Globals,

http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html

我对吗?

4

2 回答 2

0

虽然我不能给你一个完全可靠的答案(因为我没有测试过这个),但我会说你是对的,因为

  1. StatelessKnowledgeSession的引擎盖下,Drools 使用 a StatefulKnowledgeSessionand 在有状态会话中,我希望调用setGlobal(...)覆盖先前调用的值。

  2. Globals 存放在“globals store”中;这个全局存储是特定于会话的,这意味着如果您实现使用不同线程同时访问同一个会话,一个线程将覆盖另一个线程的全局存储 - 无论哪个线程setGlobal(...)最后执行。

于 2013-03-13T14:52:56.807 回答
0

我可以确认 - 全局变量存储在线程之间的共享内存中。

我们使用全局来存储每次执行的结果,发现当多个线程同时执行时,我们偶尔会得到错误的结果,因为另一个线程在前一个线程检索到值之前就跳入并覆盖了全局。

于 2018-11-13T22:14:40.217 回答