Drools知识库中如何实现仅执行KieBase内指定drl文件的规则
Drools指定部分DRL文件规则执行解决方案
以下方案均基于Drools 7.4版本实现,无需重复构建KieBase,运行时开销极低:
方案1:使用AgendaFilter动态过滤规则(无需修改DRL代码,推荐)
- 原理:Drools在执行匹配成功的规则前,会调用AgendaFilter的
accept方法校验,只有返回true的规则才会被执行。我们可以通过校验规则所属的DRL资源文件名,实现仅执行指定文件的规则。 - 适配你示例代码的修改如下:
import org.kie.api.runtime.rule.AgendaFilter; import org.kie.api.runtime.rule.Match; import org.kie.api.definition.rule.Rule; import org.kie.api.command.CommandFactory; // 省略你原有构建KieBase的代码 Applicant ap=new Applicant("",18); StatelessKieSession kieSession = kbase.newStatelessKieSession(); // 定义本次需要执行的DRL文件名集合 Set<String> allowedDrLs = Collections.singleton("applicant.drl"); kieSession.execute(Arrays.asList( CommandFactory.newInsert(ap), CommandFactory.newFireAllRules(new AgendaFilter() { @Override public boolean accept(Match match) { Rule rule = match.getRule(); // 获取规则所属DRL文件的路径,可根据实际存储格式调整匹配逻辑 String resourcePath = rule.getResource().getSourcePath(); // 匹配文件名是否在允许列表内 return allowedDrLs.stream().anyMatch(resourcePath::endsWith); } }) ));
- 适用场景:动态生成大量DRL、无法修改DRL文件内容的场景,灵活性最高。
方案2:按DRL文件配置规则分组(执行效率更高)
- 原理:在生成DRL文件时,给每个DRL文件头部统一配置
agenda-group属性,同一个文件的所有规则默认归属同一分组,执行时仅激活指定分组即可。 - 操作步骤:
- 在applicant.drl文件头部添加配置:
agenda-group "applicant.drl" // 原有import、规则定义逻辑保持不变- 在applicant2.drl文件头部添加配置:
agenda-group "applicant2.drl"- 执行时指定要激活的分组:
StatelessKieSession kieSession = kbase.newStatelessKieSession(); // 仅激活applicant.drl对应的规则组 kieSession.getAgenda().getAgendaGroup("applicant.drl").setFocus(); kieSession.execute(ap); - 适用场景:可控制DRL生成逻辑的场景,执行效率高于AgendaFilter方案。
方案3:预构建分场景KieBase
- 原理:服务启动时,将规则按业务场景、用户维度等划分,分别构建独立的小KieBase缓存,执行时直接获取对应维度的KieBase创建会话即可。
- 适用场景:规则分组维度固定、无频繁新增分组的场景,运行时效率最高。
内容的提问来源于stack exchange,提问作者Utesting
相关产品推荐
相关产品推荐

