Drools 7.57.0.Final模式匹配异常及规则重复触发问题咨询
问题解答
1. 规则匹配异常是否为Drools版本Bug
是,该问题属于Drools 7.44.0.Final到7.57.0.Final版本区间的已知MVEL方言Bug,官方已在7.58.0.Final及后续版本完成修复。
问题根因是该版本区间MVEL表达式在规则LHS(条件侧)做枚举值相等判断时,字节码生成逻辑出现错误,导致validation == Validation.UNKNOWN的判断条件被错误短路,无论枚举实际值是什么都会返回true,因此才会出现validation为FAILED的事实也触发该规则的异常现象。
2. 规则重复触发的原因
该问题是上述Bug的连锁反应:
- 首先salience=20的「无效护照作废签证申请」规则将#1签证申请的validation设为FAILED,modify操作修改事实后触发规则重新评估
- 由于MVEL枚举判断Bug,salience=10的「无校验信息标记为通过」规则错误匹配到validation为FAILED的#1申请,在RHS(执行侧)将其validation修改为PASSED
- 事实再次被修改后,「无效护照作废签证申请」规则的LHS条件(visaApplication.validation != FAILED)再次满足,因此规则被第二次触发,也就出现了两次失效日志。
修复方案
可任选以下一种方式解决:
- 升级Drools版本到7.58.0.Final或更高版本,直接使用官方修复后的版本
- 无需升级版本的前提下,可将规则的dialect从
mvel改为java,或者将枚举判断条件修改为validation.toString() == "UNKNOWN",即可绕过该Bug
复现方式:下载对应项目,将Drools版本改为7.57.0.Final,运行
io.github.aasaru.drools.section06.VisaIssue类,交互时输入5选择对应步骤,询问是否所有护照过期时输入no即可复现上述日志。
内容的提问来源于stack exchange,提问作者trimtosize
相关产品推荐
相关产品推荐

