Drools 7.15.Final KieSession多入口点事件自动删除调试求助
Drools 7.15.Final 入口点事件异常丢失排查建议
基础配置核查
- 确认事件过期策略配置:检查规则文件、kmodule.xml中是否为对应事件类型配置了
@expires注解,或者全局设置了事件默认过期时间;重点核查滑动时间窗口、长度窗口类规则的配置,这类规则触发后会自动清理超出窗口范围的事件 - 核实KieSession运行模式:确认KieSession是否配置为STREAM流模式,仅流模式下会自动触发事件过期清理逻辑,CLOUD模式默认不会主动删除已插入的Fact
- 排查显式Fact回收逻辑:检查业务代码中是否存在定时调用
entryPoint.retract()的批量清理逻辑,或者规则的RHS执行段写了删除对应入口点所有Fact的逻辑
运行时调试手段
- 开启Drools核心调试日志:调整日志配置,将
org.drools.core包的日志级别设为DEBUG,重点跟踪EntryPointImpl、FactHandle相关的插入、删除日志,所有Fact的retract操作都会留下明确日志,可直接定位删除操作的触发时机和触发方 - 注册工作内存监听器:通过
kieSession.addEventListener()注册自定义WorkingMemoryEventListener,重写objectRetracted方法,在方法中打印被删除Fact的类型、所属入口点、当前线程栈信息,直接定位删除操作的调用来源 - 单入口点孤立验证:临时注释其他入口点的配置,仅保留出问题的单个入口点做压测验证,排查是否是多入口点共享会话资源时出现的竞态问题,或是不同入口点的规则存在交叉删除Fact的逻辑
版本&异常兜底排查
- 验证版本兼容性:Drools 7.15.Final属于7.x早期版本,存在多入口点场景下Fact计数异常、过期事件清理范围超出预期的已知问题,可将相同的规则和配置在7.74.1.Final这类7.x终版上运行验证,判断是否是版本固有bug
- 确认计数异常真实性:通过
entryPoint.getFactHandles()遍历获取所有真实存在的Fact实例,对比返回的计数1是否和实际实例数一致,排除只是计数统计错误、实际Fact并未丢失的情况
内容的提问来源于stack exchange,提问作者Prog_G
相关产品推荐
相关产品推荐

