我在使用org.drools.compiler.lang.api提供的RuleDescrBuilder API构建的DrL文件中使用以下结构。Drools:AfterMatchFiringEvent触发与OR条件相同的规则多次?
我触发了匹配后事件,以跟踪后端中每个规则的匹配数量。但是,当输入(Predicate)匹配Rule1中的所有给定条件时,它将为一个输入触发多个afterMatchFiredEvents。
import com.objects.Predicate
global com.Util policyUtil
dialect "java"
rule "Rule1:RuleId"
salience 2147483647
when
predicate := Predicate()
(
eval(policyUtil.evaluate(condition1)) or
eval(policyUtil.evaluate(condition2)) or
eval(policyUtil.evaluate(condition3))
then
...
end
rule "defaultRule:defaultRule"
salience 0
when
predicate := Predicate()
then
predicate.setValue1("default1");
predicate.setValue2("Default2");
drools.halt();
end
这是比赛后的事件触发:
public void afterMatchFired(AfterMatchFiredEvent event) {
logger.info("Matching rule Name:: " + event.getMatch().getRule().getName());
updateHitCountForRule(event.getMatch().getRule().getName());
}
这是ruledescbuilder是如何使用的。
RuleDescrBuilder rdb = pdb.newRule();
CEDescrBuilder<?, ?> cedb = rdb.lhs();
cedb = cedb.and();
for(each condition in rule)
cedb.eval().constraint(constraint).end();
问:为什么afterMatchFired多次触发与OR条件相同的规则?我假设eval未被正确使用。如果eval没有被正确使用,那么使用上述方法构建这种规则集的正确方法是什么?
谢谢埃斯特万。我以eval(policyUtil.evaluate(condition1)|| policyUtil.evaluate(condition2)..)的形式在单个EVAL中执行OR条件。这只触发了一个事件并按预期工作。 – Shashank