2012-11-17 294 views
1

如何全局变量Drools的无状态会话设置。全局变量

比方说,两个线程访问同一个会话,但设置一个全局变量客户的ArrayList为每个线程 新的ArrayList。第二个线程的数组列表替换了全局变量客户的第一个线程的数组列表。

这似乎从StatelessKnowledgeSession类文档的情况:

StatelessKnowledgeSessions支持全局,作用域在许多方面。我将首先介绍非命令方式,因为命令的范围是特定的执行调用。全局可以通过三种方式解决。 StatelessKnowledgeSession支持getGlobals(),它返回一个Globals实例。这些全局变量是所有执行调用共享,所以要特别小心,在这些情况下可变的全局变量 - 经常执行的呼叫可以在不同的线程同时执行。 Globals还支持委托,这增加了解决全局性的第二种方法。 setGlobal(字符串,对象)的调用实际上将在内部收集集,在这个内部集合标识符将优先提供的委托,如果添加一个。如果在内部集合中找不到标识符,则会检查委托全局(如果已设置)。

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

对吗?

回答

0

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

  1. StatelessKnowledgeSession的引擎盖下,Drools的使用StatefulKnowledgeSession和在有状态会话,我预料的setGlobal(...)通话将覆盖从先前调用的值。

  2. 全局都在一个“全局店”举行;这个全局存储是特定于会话的,这意味着如果您使用不同的线程同时访问同一个会话,则一个线程将覆盖另一个线程的全局存储 - 最后执行哪个线程的setGlobal(...)