1. 程式人生 > >看看Drools為我們了什麼事

看看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實戰陸續釋出中………

掃描下方二維碼關注公眾號 ↓↓↓↓↓↓↓↓↓↓