Java 使用Drools执行反应式规则

Java 使用Drools执行反应式规则,java,drools,Java,Drools,(我对口水有点陌生,如果这是一个简单的问题,请原谅) 我希望使用DROLL来执行规则的执行,这意味着我们可以将“事实”插入到“事件”实例中。但是,我希望它的执行方式是,一旦接收到事件,就可以立即触发规则。但是,如果规则可能依赖于多个事件,我如何配置工作内存来记住以前的事件。考虑一个非常简单的例子: 假设我有以下规则: - when (E1) do A1 - when (E2) do A2 - when (E1,E2) do A3 然后,如果时间进展如下,我希望触发以下规则,例如: -

(我对口水有点陌生,如果这是一个简单的问题,请原谅)

<>我希望使用DROLL来执行规则的执行,这意味着我们可以将“事实”插入到“事件”实例中。但是,我希望它的执行方式是,一旦接收到事件,就可以立即触发规则。但是,如果规则可能依赖于多个事件,我如何配置工作内存来记住以前的事件。考虑一个非常简单的例子:

假设我有以下规则:

 - when (E1) do A1
 - when (E2) do A2
 - when (E1,E2) do A3
然后,如果时间进展如下,我希望触发以下规则,例如:

 - t=1 , E1 happens => A1 fired
 - t=2 , E2 happens => A2 fired + A3 fired
我遇到的问题是,如果每次插入后调用
ksession.fireAllRules()
,工作内存将忘记以前的所有事件。实现我想要的最好的方法是什么?

只要你使用一个,你可能正在做的事情,因为无状态的没有fireAllRules()方法,WM不会忘记所有插入的事实

您表示为“E1发生”的应该是ksession.insert(E1)


您可以使用文档(上面的链接)中给出的示例。

谢谢pgras,我现在已经修复了代码。尽管我现在正试图理解,但规则引擎如何知道不重新触发它已经匹配的规则?因为事实仍然存在。如果这恰好在任何文档中有解释,请阅读……是的,文档中有解释。规则由一组事实激活,当插入一组与规则条件匹配的事实时,将创建激活,然后触发(在fireAllRules()上)。之后,如果您修改一个事实并通知引擎(ksession.modify/update),则将重新创建激活,并且可以重新触发规则。如果您不更改您的事实,那么对于这些事实的组合,规则将被激活并触发一次。