看看Drools為我們了什麼事
KieServices
該介面提供了很多方法,可以通過這些方法訪問KIE關於構建和執行的相關物件,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等資訊;可以獲取KieRepository物件,利用KieRepository來管理KieModule等。
KieServices就是一箇中心,通過它來獲取的各種物件來完成規則構建、管理和執行等操作。
KieContainer
KieContainer可以理解為是一個KieBase的容器。
KieBase
KieBase可以理解為是一個知識倉庫,包含了若干的規則、流程、方法等,在Drools中主要就是規則和方法,KieBase本身並不包含執行時的資料之類的,如果需要執行規則KieBase中的規則的話,就需要根據KieBase建立KieSession。
KieSession
KieSession就是一個跟Drools引擎打交道的會話,其基於KieBase建立,它會包含執行時資料,包含“事實 Fact”,並對執行時資料事實進行規則運算。我們通過KieContainer建立KieSession是一種較為方便的做法,其實他本質上是從KieBase中創建出來
KieRepository
KieRepository是一個單例物件,它是一個存放KieModule的倉庫,KieModule由kmodule.xml檔案定義(當然不僅僅只是用它來定義)。..
KieProject
KieContainer通過KieProject來初始化、構造KieModule,並將KieModule存放到KieRepository中,然後KieContainer可以通過KieProject來查詢KieModule定義的資訊,並根據這些資訊構造KieBase和KieSession。
ClasspathKieProject
ClasspathKieProject實現了KieProject介面,它提供了根據類路徑中的META-INF/kmodule.xml檔案構造KieModule的能力,也就是我們能夠基於Maven構造Drools元件的基本保障之一。
看看Drools API是如何實現的規則的
KieServices ks =KieServices.Factory.get()
KieServices實際上是一個介面,但是介面中有一個靜態工廠用來得到例項化的KieServicesImpl.
KieContainer kc =ks.getKieClasspathContainer()得到的KieServices 通過呼叫方法讀取配置檔案然後得到Kie容器。
[source code]
public KieContainer getKieClasspathContainer () {
return getKieClasspathContainer( findParentClassLoader() );
}
ClassLoader是類載入器,用來載入Java類到Java虛擬機器。首先根據findParentClassLoader()獲得類載入器,然後把相關的父類介面都放進類載入器中。
接著呼叫getKieClasspathContainer(ClassLoader loader),返回當前存在的KieContainer或者例項化一個KieContainer返回。
例項化新的Container返回:
[source code]
public KieContainer newKieClasspathContainer(ClassLoader classLoader) {
return new KieContainerImpl(new ClasspathKieProject(classLoader, listener), null);
}
ClasspathKieProject主要作用是根據類路徑中的META-INF/kmodule.xml檔案構造KieModule。那它是什麼時候進行構造呢?是在ClasspathKieProject例項化然後傳入KieContainerImpl的建構函式中:
[source code]
public KieContainerImpl(KieProject kProject, KieRepository kr) {
this.kr = kr;
this.kProject = kProject;
kProject.init();//這才是關鍵
}
呼叫的是ClasspathKieProject實現的KieProject的init()方法
[source code]
public void init() {
this.classLoader = createProjectClassLoader(parentCL);
discoverKieModules();
indexParts(kieModules.values(), kJarFromKBaseName);
}
discoverKieModules()
很關鍵的一個方法,他通過兩個路徑KMODULE_JAR_PATH、KMODULE_SPRING_JAR_PATH來查詢相應的META-INF下的kmodule.xml或者是kmodule-spring.xml,通過這兩個配置檔案來構造相應的kieModules。然後將得到的KieModules放入Map
[source code]
String[] configFiles = {KieModuleModelImpl.KMODULE_JAR_PATH,KieModuleModelImpl.KMODULE_SPRING_JAR_PATH};
分析完部分原始碼後,我們再回頭看API的說明
KieSession ksession = kc.newKieSession(“HelloWorldKS”);
KieBase kiebase = kc.getKieBase("kieBase");
[source code]
public KieSession newKieSession(String kSessionName, Environment environment, KieSessionConfiguration conf) {
//傳入的environment、conf都是null。KieSessionConfiguration用法在Drools6新特性中有提到過。
KieSessionModelImpl kSessionModel = (KieSessionModelImpl) getKieSessionModel(kSessionName);
//DO1 驗證是否找到相應的Model
//DO2 驗證生成Model是否是StateFul,預設生成的KieSession都是stateFul
//DO3 找到相應的KieBase
//DO4 根絕KieBase以及KSessionModel生成相應的KieSession
//DO5 放入一個儲存有狀態的KieSession的Map,之後可以在需要的時候先從Map裡面找。
}
下面就是插入值
ksession.insert( message );
[source code]
public FactHandle insert(final Object object) {
return insert( object, /* Not-Dynamic */
null,false,false,null,null );
}
[source code]
public FactHandle insert(final Object object,final Object tmsValue,final boolean dynamic,boolean logical,final RuleImpl rule,final Activation activation) {
checkAlive();
return this.defaultEntryPoint.insert( object,
tmsValue,dynamic,logical,rule,activation );
}
下面是小編的微信轉帳二維碼,小編再次謝謝讀者的支援,小編會更努力的
----請看下方↓↓↓↓↓↓↓
百度搜索 Drools從入門到精通:可下載開源全套Drools教程
深度Drools教程不段更新中:
更多Drools實戰陸續釋出中………
掃描下方二維碼關注公眾號 ↓↓↓↓↓↓↓↓↓↓