Drools决策表输出异常求助:需将空白条件纳入规则
Drools决策表空白单元格处理及规则执行异常解决方案
一、解决空白单元格被忽略的问题
Drools决策表默认会忽略空白的CONDITION单元格,需根据空白的实际语义手动配置:
- 若空白表示匹配属性为Null/空值:在空白单元格填写
== null(通用类型)或isEmpty()(字符串类型) - 若空白表示不限制该条件(匹配任意值):在空白单元格填写
eval(true),部分Drools版本也支持用-替代
注意:CONDITION列的表头表达式需支持动态条件,示例写法为$fact: YourFactClass( {CONDITION} ),而非固定的$fact: YourFactClass(field == {CONDITION}),这样才能识别单元格中的完整条件逻辑。
二、处理TASK NAME/COUNTRY列重复值的问题
- 直接使用决策表的合并单元格功能,将重复值的单元格合并,Drools会自动为每一行生成包含该值的规则,既避免手动重复输入,又保证规则完整性
- 检查生成的DRL文件,确认合并后的每一行都生成了独立规则;若出现多行合并为单条规则的情况,需调整决策表的规则生成模板
三、解决规则执行结果异常的问题
1. 调整规则优先级(Salience)
Drools默认按决策表行顺序设置规则优先级,第一行规则salience值最高(最先执行)。若fireAllRules()返回第六行结果,大概率是第六行规则执行后覆盖了之前规则对事实对象的修改:
- 在决策表中新增
SALIENCE列,为需要优先执行的规则设置更高数值(例如第一行设为10,第六行设为1) - 尽量保证规则条件互斥,避免多个规则同时匹配同一个事实对象
2. 验证事实对象匹配逻辑
- 确认传入KieSession的事实对象属性值,完全符合对应规则的条件(例如CONDITION列空白对应的属性是否确实为Null,TASK NAME/COUNTRY的值是否与决策表一致)
- 使用
session.fireAllRules(new DebugAgendaEventListener())打印规则触发日志,查看哪些规则被触发,定位匹配异常的具体原因
3. 检查DRL生成内容
编译决策表后,务必查看生成的DRL文件:
- 确认每一行决策表都生成了对应的
rule块 - 检查CONDITION单元格内容是否被正确转译为DRL条件,例如空白单元格是否生成了
eval(true)或== null的逻辑
内容的提问来源于stack exchange,提问作者Prashant Ghule
相关产品推荐
相关产品推荐

