Drools 8.33决策表编译错误求助:fill对象无法解析
Drools 8.33决策表编译失败问题排查
我无法理解为何Drools(v8.33)编译我的决策表失败,错误指向规则#6,运行时输出如下:
Rule Compilation error : [Rule name='O6'] fill cannot be resolved fill cannot be resolved fill cannot be resolved fill cannot be resolved fill cannot be resolved fill cannot be resolved
我怀疑问题在于规则#6的LHS仅包含Capacity条件,未定义“Exec Broker”中的fill对象,导致RHS动作无法访问该对象。有趣的是错误信息打印了6次(对应每个规则),但移除规则#6后决策表可正常编译运行。请问规则#6的Exec Broker应配置什么内容,或如何让fill对象在所有动作和条件中可用?

问题原因与解决办法
核心原因
规则#6的LHS(条件部分)未声明fill对象的绑定,而RHS(动作部分)直接引用了fill变量,导致编译时无法解析该变量。其他规则大概率在“Exec Broker”列中定义了fill的绑定(比如fill: Fill()这类声明),但规则#6遗漏了该步骤,触发编译错误。
具体解决方式
- 为规则#6补充fill对象绑定:在规则#6的“Exec Broker”列中添加与其他规则一致的
fill对象声明,例如fill: Fill()(具体语法需匹配你的业务对象类型)。这样LHS会将对应类型的对象绑定到fill变量,RHS就能正常访问该对象。 - 全局声明fill对象(不推荐):若需让
fill在所有规则中通用,可将其声明为全局变量,但会破坏规则封装性,仅适合特殊场景:- 在DRL文件或决策表全局配置区添加:
global com.yourpackage.Fill fill; - 在会话初始化时设置全局变量:
kSession.setGlobal("fill", new Fill());
- 在DRL文件或决策表全局配置区添加:
错误信息重复6次的说明
这是因为Drools编译时会校验规则的每一条动作语句,规则#6的RHS中有6处引用fill的动作,因此每处都会抛出一次“fill无法解析”的错误,最终显示6条重复信息。
内容的提问来源于stack exchange,提问作者Michael Starkie
相关产品推荐
相关产品推荐

