drools動態加載規則

前言

前兩篇博客:

  1. 規則引擎及drools的引入
  2. drools集成springboot

第一篇博客介紹了規則引擎的相關概念,以及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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章