《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]。