gpt4 book ai didi

java - Drools:AfterMatchFiringEvent 使用 OR 条件多次触发同一规则?

转载 作者:行者123 更新时间:2023-12-02 12:06:43 28 4
gpt4 key购买 nike

我在 DrL 文件中使用以下结构,该文件是使用 org.drools.compiler.lang.api 提供的 RuleDescrBuilder API 构建的。

我触发一个赛后事件来跟踪后端中每个规则的命中数。但是,当输入(谓词)匹配规则 1 中的所有给定条件时,它会为一个输入触发多个 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 没有正确使用,那么使用上述方法构建此类规则集的正确方法是什么?

最佳答案

这是因为 Drools 处理模式之间的 or 运算符的方式。在幕后发生的事情是 Drools 创建了 3 条与原始规则不同的规则:

rule "Rule1:RuleId 1"
salience 2147483647
when
predicate := Predicate( )
eval( policyUtil.evaluate(condition1) )
then
...
end

rule "Rule1:RuleId 2"
salience 2147483647
when
predicate := Predicate( )
eval( policyUtil.evaluate(condition2) )
then
...
end

rule "Rule1:RuleId 3"
salience 2147483647
when
predicate := Predicate( )
eval( policyUtil.evaluate(condition3) )
then
...
end

如您所见,Drools 中的模式之间没有短路 运算符。如果您的所有 eval 都匹配,您不仅会收到 AfterMatchFiredEvent 3 次,规则的 action 部分也会执行 3 次.

避免这种情况的一种可能方法(即使有点 hacky)是使用事实作为标志来避免 action 部分的多次执行:

rule "Rule1:RuleId"
salience 2147483647
when
not RuleExecuted()
predicate := Predicate( )
(
eval( policyUtil.evaluate(condition1) ) or
eval( policyUtil.evaluate(condition2) ) or
eval( policyUtil.evaluate(condition3) )
)
then
...
insert(new RuleExecuted());
end

在此场景中,您的监听器中仍会收到 3 个 BeforeMatchFiredEvent 事件,但只会收到 1 个 AfterMatchFiredEvent。您还将收到 2 个 MatchCancelledEvent 事件。

希望对你有帮助

关于java - Drools:AfterMatchFiringEvent 使用 OR 条件多次触发同一规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858200/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com