OptaPlanner/Drools多accumulate sum触发ClassCastException问题咨询
问题结论
你的DRL规则写法完全符合规范,不存在语法或逻辑错误,该异常是Drools v7.55.0.Final 版本的原生Bug导致的。
根因说明
该Bug出现在Drools对accumulate节点多聚合函数的变量绑定处理逻辑中:当你在accumulate内部引用了外部模式绑定变量(本例中是$ccc即ConferenceConstraintConfiguration实例)的方法返回值作为聚合参数时,Drools的动态字节码生成器会错误混淆外部变量类型和accumulate内部匹配的事实类型,进而触发错误的类型强转。
只保留1个sum函数时,生成的字节码刚好避开了类型错位的代码分支,所以可以正常运行。
解决方案
你可以根据实际场景选择任意一种修复方式:
- 方案1:升级依赖版本。该Bug已在Drools v7.57.0.Final及后续版本修复,对应适配的OptaPlanner版本为v8.10.0.Final及之后,直接升级OptaPlanner核心依赖即可,无需修改现有规则代码。
- 方案2:旧版本兼容变通。如果暂时不能升级框架版本,可以把
accumulate拆分为两个独立的accumulate节点分别计算两个sum值,或者把外部方法调用的结果提前绑定到规划实体的临时字段,即可避开该类型转换问题。 - 方案3:改用Constraint Streams API。使用OptaPlanner原生提供的Constraint Streams API编写评分逻辑,无需依赖DRL规则,从根源上避免Drools规则引擎的底层Bug,同时后续框架升级的兼容性也更强。
内容的提问来源于stack exchange,提问作者Ryan Moser
相关产品推荐
相关产品推荐

