如何为drools无状态会话设置全局变量。
假设两个线程访问同一个会话,但为每个线程设置一个全局变量customer arraylist和新的arraylist。对于全局变量customer,第二个线程的arraylist是否替换第一个线程的arraylist。
这似乎是Stateless知识库类留档的情况:
无状态KnowledgeSessions支持全局,其作用域有多种方式。我将首先介绍非命令方式,因为命令的作用域是特定的执行调用。全局变量有三种解决方法。无状态KnowledgeSession支持getGlobals(),它返回一个Globals实例。这些全局变量对于所有执行调用都是共享的,因此在这些情况下要特别小心可变全局变量,因为执行调用通常可以在不同的线程中同时执行。Globals还支持委托,这增加了解析Globals的第二种方法。调用setGlobal(字符串、对象)实际上将在内部集合上设置,如果添加了一个,则此内部集合中的标识符将优先于提供的委托。如果在内部集合中找不到标识符,那么它将检查委托全局变量(如果已设置)。
http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html
我说得对吗?
我可以确认-全局变量存储在线程之间的共享内存中。
我们使用全局存储每次执行的结果,发现当多个线程同时执行时,我们偶尔会得到错误的结果,因为另一个线程在前一个线程检索到该值之前跳入并重写了全局。
虽然我不能给你一个完全可靠的答案(因为我还没有测试过这个),但我想说你是对的,因为
>
在Stateless知识点会话
的引擎盖下,Drools使用Stateful知识点会话
,并且在有状态会话中,我预计setGlobal(...)
的调用会覆盖之前调用的值。
Globals存放在“Globals商店”;这个全局存储是特定于会话的,这意味着如果您使用不同的线程同时访问同一个会话,那么一个线程将覆盖另一个线程的全局存储-无论哪个线程的setGlobal(…)
最后执行。
需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。
我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一
null null 如果进入房间的人是教师,则输入打印教师。 如果进入房间的人数超过30人,请通知我。 如果学生已上了超过20个小时的课,则更新状态为已完成。 现在我想要1和3组合在一起。 类似:4。如果有属性状态完成的学生进入教室,请通知老师。 现在,正如我前面所说的,这两个事件是分开的。所以在两个不同的规则中处理它更容易。但是当我想创建一个规则,它是规则4中1和3的组合,那么我必须验证一个进入
Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果
我们正在尝试使用Drool作为我们的规则引擎服务。我们到目前为止所做的如下 部署的工作台7.2.final 已部署的KIE服务器7.2.0。final 配置了一些数据对象、规则,将更改部署到KIE服务器,我们可以使用rest API执行规则 无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,仅此而已)。但是使用无状态时,我们必须牺牲Drools有状态会话提供的许多重要特性。 我们
由于它来自官方的Drools文档,因此可以使用查询从无状态会话中获取结果。 在下面的示例中,Get People是一个drools查询,它基本上返回一个对象或一个无状态的对象列表(!)一场 在我的项目中,我需要获取在无状态Kie会话中创建的对象,因此我创建了一个查询: CustomerProfileResponse对象正在RHS中构造和创建: 我编写了以下代码来在批处理模式下执行命令,并查询得到的