You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:05:54