Java 降低lhs和rhs中变量的不同值

Java 降低lhs和rhs中变量的不同值,java,drools,Java,Drools,我有两条规则 rule "test1" when $cr: MyContext(flag1 == 1) then System.out.println("<---- Test1 start ---->"); $cr.setFlag1(10); System.out.println("<---- Test1 end ---->");

我有两条规则

rule "test1"
    when
        $cr: MyContext(flag1 == 1)
    then
        System.out.println("<---- Test1 start ---->");
        $cr.setFlag1(10);
        System.out.println("<---- Test1 end ---->");
    end
规则“test1”
什么时候
$cr:MyContext(flag1==1)
然后
System.out.println(“”);
$cr.setFlag1(10);
System.out.println(“”);
结束
规则“test2”显著性-1
什么时候
$cr:MyContext($flag1:flag1==1)
然后
System.out.println(“”);
System.out.println($flag1);
System.out.println(“”);
结束
在规则1中,我正在检查变量MyContext.flag1是否为1。既然这是真的,我就把它改成10。 在规则2中,我正在检查变量MyContext.flag1是否为1。 我没想到这个规则会执行,因为flag1是10

但令人惊讶的是,它执行并将flag1打印为10


在规则2的LHS和将flag1打印为10的RHS中,如何评估flag1==1为真?

最初,Drools评估必须根据工作记忆中的事实触发两条规则。因此,解雇规则的议程是(根据您的突出程度):

  • 等待被触发的规则“test1”
  • 规则“test2”正在等待被激发
你错过的是,如果你不这么说,议程就不会被修改。 在您的案例中,触发规则“test1”,然后将其从议程中删除,议程的新状态为:

  • 规则“test2”正在等待被激发
那么接下来会发生什么,规则“test2”被触发,因为您更改了您的事实,drools打印它的新值,即10。所以这种行为是正常的

在规则“test1”中修改后,您需要调用update($cr),这意味着:根据我的事实使用所有规则更新议程($cr)。
结果是Drools现在将从其议程中删除规则“test2”。

最初,Drools评估必须根据您工作记忆中的事实触发两条规则。因此,解雇规则的议程是(根据您的突出程度):

  • 等待被触发的规则“test1”
  • 规则“test2”正在等待被激发
你错过的是,如果你不这么说,议程就不会被修改。 在您的案例中,触发规则“test1”,然后将其从议程中删除,议程的新状态为:

  • 规则“test2”正在等待被激发
那么接下来会发生什么,规则“test2”被触发,因为您更改了您的事实,drools打印它的新值,即10。所以这种行为是正常的

在规则“test1”中修改后,您需要调用update($cr),这意味着:根据我的事实使用所有规则更新议程($cr)。
结果是Drools现在将从其议程中删除规则“test2”。

当您启动Drools规则时,框架将在工作内存中获取您的规则输入,并确定哪些规则匹配。然后对这些规则匹配进行排序(根据显著性或自然顺序),然后按顺序激发

因此,当您启动规则时,“test1”和“test2”被确定为匹配项。然后Drools会首先触发“test1”,然后触发“test2”

如果您希望Drools重新评估规则匹配,则需要“告诉”框架您已对工作内存进行了更改。为此,您有以下内置方法:

方法 解释
插入
把一个新的事实放入工作记忆中。
删除
收回
从工作内存中删除一些信息(对象)。
更新
更新/替换工作内存中的事实。
修改
在工作记忆中更改事实内部的字段。
当您触发drools规则时,框架会在工作内存中接收您的规则输入,并确定哪些规则匹配。然后对这些规则匹配进行排序(根据显著性或自然顺序),然后按顺序激发

因此,当您启动规则时,“test1”和“test2”被确定为匹配项。然后Drools会首先触发“test1”,然后触发“test2”

如果您希望Drools重新评估规则匹配,则需要“告诉”框架您已对工作内存进行了更改。为此,您有以下内置方法:

方法 解释
插入
把一个新的事实放入工作记忆中。
删除
收回
从工作内存中删除一些信息(对象)。
更新
更新/替换工作内存中的事实。
修改
在工作记忆中更改事实内部的字段。
谢谢你的描述性回答!谢谢你的描述性回答!
rule "test2" salience -1
    when
        $cr: MyContext($flag1: flag1 == 1)
    then
        System.out.println("<---- Test2 start ---->");
        System.out.println($flag1);
        System.out.println("<---- Test2 end ---->");
    end