Drools规则then子句多次触发,如何完成when块判断后再执行then
问题1:规则多次触发如何调整为仅执行一次
触发多次的原因
Drools对规则中or连接的条件会拆分为多条独立的匹配路径,每有一条路径匹配成功,就会触发一次then块的执行。你当前有3个条件分支满足,因此会打印三次日志。
解决方法
使用exists关键字包裹整个when条件块,exists的语义是只要工作内存中存在至少一组匹配整体条件的事实,就仅触发一次规则执行,不管有多少个分支匹配成功。修改后的规则如下:
rule "matematikk" when exists ( (Class( code == "MAT1003") or Class( code == "MAT1008")) or (Class( code == "REA3022") or Class( code == "REA3024") or Class( code == "REA3026") or Class( code == "REA3028")) or ((Class(code == "MAT1006") and Class(code == "MAT1010")) or (Class( code == "MAT1001") and Class( code == "MAT1005"))) or (Class(code == "MAT1002") or Class(code == "MAT1007")) ) then logger.info("passed"); end
这里额外给and相关的条件加了括号,避免优先级问题导致逻辑和你预期不符。
问题2:删除or后规则不执行的原因
Drools的when块中,多个模式未显式指定逻辑运算符时,默认是逻辑与关系,即要求所有列出的模式都要在工作内存中同时匹配成功。
你删除所有or之后,规则的匹配条件变为需要同时存在MAT1003、MAT1008、REA3022、REA3024、REA3026、REA3028、MAT1006、MAT1010、MAT1001、MAT1005、MAT1002、MAT1007所有code对应的Class对象,实际场景下不可能同时满足该条件,因此规则不会触发,没有执行结果。
内容的提问来源于stack exchange,提问作者Goozo
相关产品推荐
相关产品推荐

