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



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

<

Java代码/strong>

        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;
}

规则不会通过调用Drools引擎来"执行"。由Drools引擎来决定哪些规则将被"取消"。只要在规则中计算的任何事实没有改变,该规则就不会再次被触发。

但是,您可以处理会话,创建另一个会话并再次执行,可能在您的数据中有一些变化。这个扩展的循环将包括一些您没有展示的代码,所以我只能在这里概述它:

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();
}

我不确定你是否在正确的轨道上。使用规则引擎计算许多布尔表达式不一定是最好的。

最新更新