轉載至:https://blog.csdn.net/wo541075754/article/details/75004575
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的類型。 |
