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。