Drools是否支持运行时添加/修改规则(含决策表场景)
Drools运行时规则更新问题解答
Drools完全支持运行时添加或修改规则(包括.drl文件和决策表),你遇到的问题根源是仅重建KieSession无法加载更新后的规则——因为KieSession依赖的KieBase还是基于旧规则构建的,必须通过更新KieContainer或重新构建KieBase才能生效。
以下是解决问题的具体方案:
1. 使用KieScanner实现规则自动更新
如果你的规则资源(决策表/DRL文件)存放在Maven仓库或指定目录,KieScanner可以定期扫描资源变化,自动更新KieContainer,后续新建的KieSession会自动使用新规则。示例代码:
KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId("com.yourgroup", "drools-rules", "1.0.0-SNAPSHOT"); KieContainer kieContainer = kieServices.newKieContainer(releaseId); KieScanner kieScanner = kieServices.newKieScanner(kieContainer); // 设置扫描间隔(单位:毫秒),示例为10秒扫描一次 kieScanner.start(10000);
2. 手动触发规则更新
如果不需要自动扫描,可在修改规则后手动触发KieContainer更新,再创建新的KieSession:
// 修改规则资源后,调用updateToLatestVersion更新KieContainer kieContainer.updateToLatestVersion(); // 新建KieSession,此时会使用更新后的规则 KieSession kieSession = kieContainer.newKieSession();
注意:已创建的旧KieSession不会自动同步新规则,必须创建新的KieSession才能生效。
3. 本地决策表的手动重载方案
如果决策表是本地Excel文件,修改后需确保重新加载文件资源,避免缓存影响:
KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); // 重新读取修改后的决策表文件 File dtFile = new File("src/main/resources/decision-table.xls"); kfs.write(ResourceFactory.newFileResource(dtFile)); // 重新构建规则 KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); // 检查构建错误 if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) { throw new RuntimeException("规则构建失败: " + kieBuilder.getResults().toString()); } // 创建新的KieContainer,后续基于它创建的KieSession将使用新规则 KieContainer newKieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
内容的提问来源于stack exchange,提问作者abhijeet ghadge
相关产品推荐
相关产品推荐

