为什么 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();
}
注意我不确定你是否在正确的轨道上。使用规则引擎不一定能最好地评估许多布尔表达式。
我正在尝试学习 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();
}
注意我不确定你是否在正确的轨道上。使用规则引擎不一定能最好地评估许多布尔表达式。