1. 程式人生 > >《Drools7.0.0.Final規則引擎教程》第3章 3.2 KIE API解析

《Drools7.0.0.Final規則引擎教程》第3章 3.2 KIE API解析

3.2.4 KieServices

該介面提供了很多方法,可以通過這些方法訪問KIE關於構建和執行的相關物件,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等資訊;可以獲取KieRepository物件,利用KieRepository來管理KieModule等。
KieServices就是一箇中心,通過它來獲取的各種物件來完成規則構建、管理和執行等操作。
示例demo:

// 通過單例建立KieServices
KieServices kieServices = KieServices.Factory.get();
// 獲取KieContainer
KieContainer kieContainer = kieServices.getKieClasspathContainer(); // 獲取KieRepository KieRepository kieRepository = kieServices.getRepository();

這裡寫圖片描述

3.2.5 KieContainer

可以理解KieContainer就是一個KieBase的容器。提供了獲取KieBase的方法和建立KieSession的方法。其中獲取KieSession的方法內部依舊通過KieBase來建立KieSession。

// 通過單例建立KieServices
KieServices kieServices = KieServices.Factory.get(); // 獲取KieContainer KieContainer kieContainer = kieServices.getKieClasspathContainer(); // 獲取KieBase KieBase kieBase = kieContainer.getKieBase(); // 建立KieSession KieSession kieSession = kieContainer.newKieSession("session-name");

這裡寫圖片描述

3.2.6 KieBase

KieBase就是一個知識倉庫,包含了若干的規則、流程、方法等,在Drools中主要就是規則和方法,KieBase本身並不包含執行時的資料之類的,如果需要執行規則KieBase中的規則的話,就需要根據KieBase建立KieSession。

// 獲取KieBase
KieBase kieBase = kieContainer.getKieBase();
KieSession kieSession = kieBase.newKieSession();
StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();

這裡寫圖片描述

3.2.7 KieSession

KieSession就是一個跟Drools引擎打交道的會話,其基於KieBase建立,它會包含執行時資料,包含“事實Fact”,並對執行時資料實時進行規則運算。通過KieContainer建立KieSession是一種較為方便的做法,其本質上是從KieBase中創建出來的。KieSession就是應用程式跟規則引擎進行互動的會話通道。
建立KieBase是一個成本非常高的事情,KieBase會建立知識(規則、流程)倉庫,而建立KieSession則是一個成本非常低的事情,所以KieBase會建立快取,而KieSession則不必。
這裡寫圖片描述

3.2.8 KieRepository

KieRepository是一個單例物件,它是存放KieModule的倉庫,KieModule由kmodule.xml檔案定義(當然不僅僅只是用它來定義)。

// 通過單例建立KieServices
KieServices kieServices = KieServices.Factory.get();
// 獲取KieRepository
KieRepository kieRepository = kieServices.getRepository();

這裡寫圖片描述

3.2.9 KieProject

KieContainer通過KieProject來初始化、構造KieModule,並將KieModule存放到KieRepository中,然後KieContainer可以通過KieProject來查詢KieModule定義的資訊,並根據這些資訊構造KieBase和KieSession。

3.2.10 ClasspathKieProject

ClasspathKieProject實現了KieProject介面,它提供了根據類路徑中的META-INF/kmodule.xml檔案構造KieModule的能力,是基於Maven構造Drools元件的基本保障之一。意味著只要按照前面提到過的Maven工程結構組織我們的規則檔案或流程檔案,只用很少的程式碼完成模型的載入和構建。

3.2.11 kmodule.xml

kmodule的簡單配置規則在上面的例項中已經簡單介紹,下面具體介紹具體的配置。

kbase的屬性:

屬性名 預設值 合法的值 描述
name none any KieBase的名稱,這個屬性是強制的,必須設定。
includes none 逗號分隔的KieBase名稱列表 意味著本KieBase將會包含所有include的KieBase的rule、process定義製品檔案。非強制屬性。
packages all 逗號分隔的字串列表 預設情況下將包含resources目錄下面(子目錄)的所有規則檔案。也可以指定具體目錄下面的規則檔案,通過逗號可以包含多個目錄下的檔案。
default false true, false 表示當前KieBase是不是預設的,如果是預設的話,不用名稱就可以查詢到該KieBase,但是每一個module最多隻能有一個KieBase。
equalsBehavior identity identity,equality 顧名思義就是定義“equals”(等於)的行為,這個equals是針對Fact(事實)的,當插入一個Fact到Working Memory中的時候,Drools引擎會檢查該Fact是否已經存在,如果存在的話就使用已有的FactHandle,否則就建立新的。而判斷Fact是否存在的依據通過該屬性定義的方式來進行的:設定成 identity,就是判斷物件是否存在,可以理解為用==判斷,看是否是同一個物件; 如果該屬性設定成 equality的話,就是通過Fact物件的equals方法來判斷。
eventProcessingMode cloud cloud, stream 當以雲模式編譯時,KieBase將事件視為正常事實,而在流模式下允許對其進行時間推理。
declarativeAgenda disabled disabled,enabled 這是一個高階功能開關,開啟後規則將可以控制一些規則的執行與否。

ksession的屬性:

屬性名 預設值 合法的值 描述
name none any KieSession的名稱,該值必須唯一,也是強制的,必須設定。
type stateful stateful, stateless 定義該session到底是有狀態(stateful)的還是無狀態(stateless)的,有狀態的session可以利用Working Memory執行多次,而無狀態的則只能執行一次。
default false true, false 定義該session是否是預設的,如果是預設的話則可以不用通過session的name來建立session,在同一個module中最多隻能有一個預設的session。
clockType realtime realtime,pseudo 定義時鐘型別,用在事件處理上面,在複合事件處理上會用到,其中realtime表示用的是系統時鐘,而pseudo則是用在單元測試時模擬用的。
beliefSystem simple simple,defeasible, jtms 定義KieSession使用的belief System的型別。

後語

你的支援是我努力的最大動力!此係列課程正在持續更新中,相關討論QQ(593177274)已經建立,歡迎大家加入討論。如有疑問可以留言也可以傳送本人郵箱[email protected]
這裡寫圖片描述