Drools学习专栏三
程序员文章站
2022-05-28 11:54:59
...
drools动态加载规则
前言
前两篇博客:
第一篇博客介绍了规则引擎的相关概念,以及drools的引入。
第二篇博客中,集成springboot给出了第一个demo,在第二篇博客中,通过配置kmodule.xml文件,编写drl文件,完成了第一个规则。
针对某些场景,比如规则语言动态存储在数据库里面的情形,就需要动态加载规则了。
drools版本:7.19.0.Final。
方式一:使用KieHelper封装类
drools提供了封装好的KieHelper类,通过以下几行代码实现了KieSession的构建:
String rule = "package com.example;\r\n";
rule+="import com.example.service.*;\r\n";
rule+="rule \"rule1\"\r\n";
rule += "when\r\n";
rule += "\t Message(status == \"1\")";
rule += "\r\nthen\r\n";
rule +="\tSystem.out.println(\"hello\");";
rule += "end\r\n";
KieHelper helper = new KieHelper();
helper.addContent(rule, ResourceType.DRL);
KieSession kSession = helper.build().newKieSession();
其中rule为字符串,可以从数据库读取。
使用这种方式的优点在于代码简单,重要的代码只有三行,缺点是无法对编译规则错误时的提示进行个性化的处理。推荐使用以下不借助封装类的实现方式。
方式二:不使用KieHelper封装类
/**
* 由从数据库里面读出的drl构建KieSession
* @param drl
* @return
* @throws UnsupportedEncodingException
*/
public static KieSession getKieSessionFromDrl(String drl) throws UnsupportedEncodingException {
KieSession tempKieSession = null;
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
kb.add(ResourceFactory.newByteArrayResource(drl.getBytes("utf-8")), ResourceType.DRL);
if (kb.hasErrors()) {
String errorMessage = kb.getErrors().toString();
System.out.println("规则语法异常---\n"+errorMessage);
return;
}
InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addPackages(kb.getKnowledgePackages());
tempKieSession = kBase.newKieSession();
return tempKieSession;
}
可以抽象异常,将错误信息抛到上层,最终通过接口返回给前端。
结语
在下一篇博客中,将介绍一些drools的demo。
下一篇: JDOM解析xml文件