Drools 规则引擎 动态读取规则(三)
程序员文章站
2022-05-28 11:16:47
...
在上一篇中,大概说了一下kmodule的配置方式,这种配置方式其实略显复杂,不如通过数据库读取来的简单。
不过,基于kmodule的配置方式,让我们这些刚学习的人,能更好地了解到drools的机智。在有了一定理解的基础上,现在就学习一下如何实现动态读取规则。
动态读取非常简单,不需要kmodule配置文件,也不需要drl文件,只需要把drl文件的内容,保存到比如数据库中,然后使用以下代码即可
KieSession kSession = null;
try {
// 从数据库根据code查规则
String rule = "这里从数据库取出规则内容";
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
kb.add(ResourceFactory.newByteArrayResource(rule.getBytes("utf-8")), ResourceType.DRL);
// 检查规则正确性
KnowledgeBuilderErrors errors = kb.getErrors();
for (KnowledgeBuilderError error : errors) {
logger.error("规则文件正确性有误:{}", error);
return Result.buildFail(null, "规则文件正确性有误");
}
InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addPackages(kb.getKnowledgePackages());
// 执行规则
kSession = kBase.newKieSession();
kSession.insert(fact);
kSession.fireAllRules();
} catch (Exception e) {
logger.error("规则执行异常:{}", e);
} finally {
if (null != kSession)
kSession.dispose();
}
要注意的是,kbase创建的成本较高,而ksession成本低,所以drools给kbase设计了缓存机制,在第一次启动时可能会耗费一点点时间,第二次调用时,就会从缓存中读取,直接实例化ksession。
推荐阅读
-
Drools 5.2 发布:开源的业务规则引擎
-
drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)
-
SpringBoot整合Drools规则引擎动态生成业务规则的实现
-
Drools规则引擎-Drools入门案例
-
开源力量公开课第70期:新一代规则引擎Drools概览
-
规则引擎Visual Rules Solution开发基础教程【连载14】--VisualRules接口调用(三)
-
规则引擎Visual Rules Solution开发基础教程【连载14】--VisualRules接口调用(三)
-
规则引擎Drools的资料整理
-
Spring Boot中使用Drools规则引擎
-
Drools规则引擎-判断集合(List)是否包含集合