Drools规则逗号前无空格不触发 加空格反而触发异常原因咨询
Drools规则条件中逗号无前置空格导致规则不触发问题解析
该现象由Drools规则引擎的词法解析逻辑缺陷导致,与Kafka数据源、业务数据内容无关。
复现场景
两种写法唯一差异为约束条件中逗号前是否存在空格,执行结果完全不同:
- 无法触发打印的写法
// Case 1: 无异常输出 when App( AppId == $inputId, source == "APP_STORE" ) then System.out.println("Exception Caught!");
- 正常触发打印的写法
// Case 2: 正常输出异常信息 when App( AppId == $inputId , source == "APP_STORE" ) then System.out.println("Exception Caught!");
根因说明
Drools 7.73.0之前的版本使用JavaCC实现规则词法解析,在处理模式(Pattern)内部的多约束分隔逻辑时存在边界识别bug:
当逗号分隔符直接紧贴前序约束表达式的末尾(二者之间无空格、制表符等任意空白字符),且逗号后直接接换行时,解析器不会将该逗号识别为两个约束的分隔标记,反而会将其与前后token做错误拼接,导致最终解析出的匹配条件和预期逻辑不一致,无法匹配到符合条件的事实对象,then块逻辑自然不会执行。
当逗号前存在至少一个空白字符时,解析器可以正确识别逗号的分隔作用,AppId == $inputId和source == "APP_STORE"两个约束会被独立拆分,匹配逻辑符合预期,命中后正常执行打印。
规避方案
- 编写Drools规则时统一遵循编码规范,所有逗号分隔符前后保留一个空格,避免分隔符紧贴表达式内容
- 若当前使用的Drools版本低于7.73.0.Final,可升级到该版本及以上,官方已经修复了该词法解析bug
- 规则上线前通过单元测试覆盖匹配场景,避免格式问题导致规则漏触发
内容的提问来源于stack exchange,提问作者ChiliPowder
相关产品推荐
相关产品推荐

