为什么 drools 规则引擎即使在循环内给出也只执行一次?

Why does the drools rule engine executes only once even when given inside a loop?

我正在尝试学习 drools,以便在需要循环执行许多布尔表达式的项目中使用。我当前的代码如下。这只是为了测试和学习概念。语句 kSession.fireAllRules(); 应该多次执行规则文件,因为它在 for 循环内,但它只执行一次。我在这里做错了什么?

Java代码

        List outList = new ArrayList<Boolean>();
        kSession.setGlobal("outList", outList);
        List rulesList = new ArrayList<Boolean>();
        kSession.setGlobal("rulesList", rulesList);

        for (int i = 0; i < 10; i++) {

            rule1=!rule1;
            rule2 =!rule2;
            rule3 =!rule3;
            rulesList.clear();
            rulesList.add(rule1);
            rulesList.add(rule2);
            rulesList.add(rule3);

            kSession.insert(droolsIntroduction);
            kSession.fireAllRules();

            boolean result1 = (boolean) outList.get(0);
            boolean result2 = (boolean) outList.get(1);
            boolean result3 = (boolean) outList.get(2);

        }

规则文件:

global String topicLevel
global java.util.List rulesList
global java.util.List outList

rule "Drools Introduction"
when
$droolsIntro : DroolsIntroduction( measurename == "measure1")
then

boolean result1= (boolean)rulesList.get(0) && (boolean)rulesList.get(1)  && (boolean)rulesList.get(2)
boolean result2= result1 && (boolean)rulesList.get(2);
boolean result3= result1 &&  (boolean)rulesList.get(2);
//outList.clear();
outList.add(result1);
outList.add(result2);
outList.add(result3);

end
function String getDefaultIfNull(String topicLevel) {
return topicLevel == null ? "Moderate" : topicLevel;
}

规则不是 "executed" 通过调用 Drools 引擎。由 Drools 引擎决定哪些规则是 "fired"。只要规则中评估的任何事实没有变化,就不会再次触发该规则。

但是,您可以处理该会话,创建另一个会话并再次执行,这可能会导致您的数据发生一些变化。这个扩展循环会包含一些你没有展示的代码,所以我只能在这里画出草图:

for( int i =... ){
    KieSession kSession = ...;
    List outList = new ArrayList<Boolean>();
    kSession.setGlobal("outList", outList);
    List rulesList = new ArrayList<Boolean>();
    kSession.setGlobal("rulesList", rulesList);
    rule1 = ...;
    kSession.insert(droolsIntroduction);
    kSession.fireAllRules();
    boolean result1 = ...;
    kSession.dispose();
}

注意我不确定你是否在正确的轨道上。使用规则引擎不一定能最好地评估许多布尔表达式。