在Drools 6中成功执行规则后退出

在Drools 6中成功执行规则后退出,drools,Drools,我有一个对象,如下所示: class License{ private field1; private field2; private boolean active; private String activeMessage; private boolean processed = false; //Getter and setter methods } 我要做的是,根据field1和field2的值,我需要设置isActive标志和相应的消息

我有一个对象,如下所示:

class License{
    private field1;
    private field2;
    private boolean active;
    private String activeMessage;
    private boolean processed = false;

    //Getter and setter methods
}
我要做的是,根据field1和field2的值,我需要设置isActive标志和相应的消息。但是,如果field1或field2的规则被触发,我需要停止规则处理。也就是说,我只需要执行一条成功的规则

我在一篇帖子上读到,使用ksession.fireAllRules(1)可以解决这个问题。但是fireAllRules()方法在Drools 6中不可用。我也试着放一个回音;每个规则末尾的语句。那也帮不了我

最后,我向我的对象添加了一个名为processed的额外字段。因此,每当我执行任何规则时,我都会将processed标志设置为true。如果已经设置了标志,那么我不执行任何规则。这是我的规则文件:

rule "Check field1"
    when
        $obj : License(getField1() == "abc" && isProcessed() == false)
    then
        System.out.println("isProcessed >>>>>> "+$obj.isProcessed());
        $obj.setActive(true);
        $order.setActiveMessage("...");
        $order.setProcessed(true);
end


rule "Check field2"
    when
        $obj : License(getField2() == "def" && isProcessed() == false)
    then
        System.out.println("isProcessed >>>>>> "+$obj.isProcessed());
        $obj.setActive(true);
        $order.setActiveMessage("...");
        $order.setProcessed(true);
end
然而,我看到即使现在我的两条规则都被解雇了。当我尝试打印isProcessed()的值时,它会显示true,即使我只在isProcessed()为false时输入规则

这就是我对drools引擎的称呼:

kieService = KieServices.Factory.get();
kContainer = kieService.getKieClasspathContainer();
kSession = kContainer.newStatelessKieSession();
kSession.execute(licenseObj);
这不仅仅是2条规则,我有很多规则,所以通过更改drl文件中规则的顺序来控制规则的执行不是一个选项。这里发生了什么?我怎样才能解决这个问题?我有点不喜欢流口水,所以我可能错过了一些东西


谢谢。

您的问题包含许多错误

在Drools 6中,
fireAllRules
已经消失,这绝对不是真的。您可能已经查看了javadoc索引,在接口
StatefulRuleSession
中的包
org.kie.api.runtime.rule
中找到了此方法的四(4!)个重载版本

通过组合触发约束,您可以轻松避免仅触发两个规则中的一个的问题:

rule "Check field1 and field2"
when
    $lic: License(getField1() == "abc" || getField2() == "def" )
    //...
then
    $lic.setXxx(...);
end
您抱怨说,尽管在事实中设置了
processed
标志,但您的两条规则都会触发。在这里,您缺少一个基本点(Drools参考手册中有介绍),即在更改事实数据时通知引擎的必要性。您应该在规则的右侧使用
modify

但即使这样也不够好。每当由于某些属性而进行更新时,应添加一个约束,以避免反复运行更新。你可能写过:

rule "Check field1 and field2"
when
    $lic: License(getField1() == "abc" || getField2() == "def",
                  ! active )
    //...
then
    modify( $lic ){ setActive( true ) }
end

你甚至可以用两个不同的规则来写,每个字段一个,并且这些规则中只有一个会触发…

你的问题包含许多错误

在Drools 6中,
fireAllRules
已经消失,这绝对不是真的。您可能已经查看了javadoc索引,在接口
StatefulRuleSession
中的包
org.kie.api.runtime.rule
中找到了此方法的四(4!)个重载版本

通过组合触发约束,您可以轻松避免仅触发两个规则中的一个的问题:

rule "Check field1 and field2"
when
    $lic: License(getField1() == "abc" || getField2() == "def" )
    //...
then
    $lic.setXxx(...);
end
您抱怨说,尽管在事实中设置了
processed
标志,但您的两条规则都会触发。在这里,您缺少一个基本点(Drools参考手册中有介绍),即在更改事实数据时通知引擎的必要性。您应该在规则的右侧使用
modify

但即使这样也不够好。每当由于某些属性而进行更新时,应添加一个约束,以避免反复运行更新。你可能写过:

rule "Check field1 and field2"
when
    $lic: License(getField1() == "abc" || getField2() == "def",
                  ! active )
    //...
then
    modify( $lic ){ setActive( true ) }
end
你甚至可以用两个不同的规则来写,每个字段一个,这些规则中只有一个会触发…

Thx,modify($lic)完成了这个技巧。我的印象是事实数据是按顺序传递给规则的,因此更新规则内的数据也会反映到其他规则中。我无法合并这些规则,因为我正在每个规则中执行许多其他操作。我发布的代码只是一个示例。Thx,modify($lic)成功了。我的印象是事实数据是按顺序传递给规则的,因此更新规则内的数据也会反映到其他规则中。我无法合并这些规则,因为我正在每个规则中执行许多其他操作。我发布的代码只是一个示例。