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

标签 java drools

我正在尝试学习在需要循环执行许多 boolean 表达式的项目中使用流口水。我当前的代码如下。这只是为了测试和学习概念。声明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;
}

最佳答案

规则不是通过调用 Drools 引擎来“执行”的。由 Drools 引擎决定“解雇”哪些规则。只要规则中评估的任何事实没有发生变化,该规则就不会再次被触发。

但是,您可以处置该 session ,创建另一个 session 并再次执行,这可能会导致数据发生一些变化。这个扩展循环将包含一些您未显示的代码,因此我只能在这里概述它:

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

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

关于java - 为什么 drools 规则引擎即使在循环内给出也只执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40378581/

相关文章:

java - 分析 native 方法上的卡住线程

java - 将json数据从android发送到php linux服务器

java - 在java中读取小CSV文件导致内存不足错误

java - drools 中是否有任何 API 仅通过传递值来动态创建 drl 文件?

java - 如何让 Drools (Kie Session) 在 Netbeans Web 项目(无 Maven)中运行?

java - 如何将 Java 静态方法导入 Drools 文件?

java - 谁在 ubuntu 服务器上神秘地向我的进程发送了 SIGKILL

java - 既然可以捕获 Throwables,为什么还要在 Java 中捕获异常?

java - JDBC 字符编码

drools - 关于规则引擎的神话是什么?