Drools 3升级至7.69:多条件When子句语法错误修复咨询
Drools 3升级到7.69版本的DRL规则修改方案
问题根源
Drools 7.x对DRL语法的校验更严格,原VMS_TRANSLATION规则的写法存在两个核心问题:
- 错误地将多个
Message条件用||直接拼接,新版本会把这种写法解析为匹配多个不同的Message对象,既不符合实际业务逻辑(原本是要匹配同一个Message对象满足任意一组条件),也触发了语法解析错误。 - 旧版本中用逗号连接约束条件的写法,在新版本里容易引发语法歧义,不符合规范的语法结构。
修改方案
把所有(product, subtask)的组合条件整合到同一个Message约束中:
- 每组(product, subtask)条件内部用
&&显式表示逻辑与(替代旧版本的逗号,避免歧义) - 不同组条件之间用
||表示逻辑或 - 确保整个条件针对同一个Message对象进行匹配,去掉重复的
Message关键字
修改后的完整DRL代码
package rules.event dialect "java" rule "TASK_ARC_CIFF01_XMIT01_EXCEPTION_1000" when message : Message( product == "ARC" && subtask == "MOVE01" ) then exception.evaluate("1000", message); mq.notify(exception, message); end //VMS message translation rules rule "VMS_TRANSLATION" when message : Message( (product == "ISIXSR" && subtask == "BLDPZ1") || (product == "ISIXSR" && subtask == "ECPLD2") || (product == "ISIXSL" && subtask == "FILMV1") || (product == "ISIXSL" && subtask == "MOVE01") || (product == "ISIXRL" && subtask == "MOVE01") || (product == "ISIXRR" && subtask == "MOVE01") || (product == "ISIXER" && subtask == "VALID2") || (product == "ISIXRR" && subtask == "XRFMV1") ) then vmstr.notify(message); end
内容的提问来源于stack exchange,提问作者Bavani S
相关产品推荐
相关产品推荐

