【java規則引擎】drools6.5.0中kie的概論

Love Lenka發表於2017-07-04

什麼是KIE?

KIE是jBoss裡面一些相關專案的統稱,下圖就是KIE代表的一些專案,其中我們比較熟悉的就有jBPM和Drools。

這些專案都有一定的關聯關係,並且存在一些通用的API,比如說涉及到構建(building)、部署(deploying)和載入 (loading)等方面的,這些API就都會以KIE作為字首來表示這些是通用的API。前面看到的一些KieServices、 KieContainer、KieSession類就都是KIE的公共API。

總的來說,就是jBoss透過KIE將jBPM和Drools等相關專案進行了一個整合,統一了他們的使用方式。像KieServices這些KIE類就是整合後的結果,在Drools中這樣使用,在jBPM裡面也是這樣使用。

3、KIE專案生命週期

一個Drools應用專案其實就是一個KIE專案,KIE的生命週期其實就是Drools和jBPM這些專案的生命週期。

KIE專案生命週期包含:編寫(Author)、構建(Build)、測試(Test)、部署(Deploy)、使用(Utilize)、執行(Run)、互動(Work)、管理(Manage)。

  1. 編寫:編寫就是編寫規則檔案或者流程檔案;
  2. 構建:就是構建一個可以釋出部署的元件,在KIE中就是構建一個jar檔案;
  3. 測試:在部署到應用程式之前需要對規則或者流程進行測試;
  4. 部署:就是將jar部署到應用程式,KIE利用Maven倉庫來進行釋出和部署;
  5. 使用:就是載入jar檔案,並透過KieContainer對jar檔案進行解析,然後建立KieSession;
  6. 執行:系統透過KieSession物件的API跟Drools引擎進行互動,執行規則或者流程;
  7. 互動:使用者透過命令列或者UI跟引擎進行互動;
  8. 管理:管理KieSession或者KieContainer物件。

4、KIE & Maven

透過前面的知識我們瞭解到Drools工程其實就是一個Maven工程,有著Maven工程標準的結構,然後Drools在這個基礎上也定義了一個自己的儲存結構:

drools的標準儲存結構就是在src/main/resources資料夾下面儲存規則檔案(包括DRL檔案和Excel檔案),然後在META-INF資料夾下面建立一個kmodule.xml檔案用來儲存規則定義宣告。

Drools專案最終都是打包成jar然後進行釋出部署的(KIE專案生命週期提到的),這樣定義工程結構和打包釋出方式的根本原因就是——Maven!

上圖描述了KIE專案(包括Drools)的打包、釋出、部署過程,就是一個KIE專案按照上面定義的工程結構進行設計開發,然後透過mvn deploy命令釋出到Maven倉庫,然後應用程式可以透過mvn install將釋出好的jar包下載安裝到本地應用程式中,最後透過KieServices等API就可以直接使用這些釋出好的規則了。

為什麼我們寫的JUnit Test類裡面驅動一個規則的程式碼非常簡單,就是因為Drools定義了上面的一套規範,按照規範來編寫、釋出、部署規則之後就可以確保以最簡單的方式來使用Drools等KIE專案。這也是慣例優於配置的一種體現。

所以我們說一個Drools專案工程就是一個Maven專案工程,或者說一個KIE專案工程就是一個Maven工程。

KIE也提供了一種策略,能夠讓應用程式在執行時,能夠動態監測Maven倉庫中Drools專案jar元件的版本更新情況,然後可以根據配置動態更新Drools釋出包,實現熱插拔功能,這個是透過KieScanner API實現的。

 

編碼方式實現

 1 public class KieFileSystemTest {
 2 
 3     @Test
 4     public void test() {
 5         KieServices kieServices = KieServices.Factory.get();
 6         KieResources resources = kieServices.getResources();
 7         KieModuleModel kieModuleModel = kieServices.newKieModuleModel();//1
 8 
 9         KieBaseModel baseModel = kieModuleModel.newKieBaseModel(
10                 "FileSystemKBase").addPackage("rules");//2
11         baseModel.newKieSessionModel("FileSystemKSession");//3
12         KieFileSystem fileSystem = kieServices.newKieFileSystem();
13 
14         String xml = kieModuleModel.toXML();
15         System.out.println(xml);//4
16         fileSystem.writeKModuleXML(xml);//5
17 
18         fileSystem.write("src/main/resources/rules/rule.drl", resources
19                 .newClassPathResource("kiefilesystem/KieFileSystemTest.drl"));//6
20 
21         KieBuilder kb = kieServices.newKieBuilder(fileSystem);
22         kb.buildAll();//7
23         if (kb.getResults().hasMessages(Level.ERROR)) {
24             throw new RuntimeException("Build Errors:\n"
25                     + kb.getResults().toString());
26         }
27         KieContainer kContainer = kieServices.newKieContainer(kieServices
28                 .getRepository().getDefaultReleaseId());
29 
30         assertNotNull(kContainer.getKieBase("FileSystemKBase"));
31         KieSession kSession = kContainer.newKieSession("FileSystemKSession");
32 
33         kSession.fireAllRules();
34     }
35 }
View Code

 

相關文章