一、規則引擎Droolsjava
- 具備一個易於訪問企業策略
- 易於調整以及易於管理的開源業務規則引擎
- 符合業內標準,速度快、效率高
- Drools是一個基於java的規則引擎,開源的
- 能夠將複雜多變的規則從硬編碼中解放出來
- 以規則腳本的形式存放在文件中
- 使得規則的變動不須要修正代碼重啓機器就能夠當即在線上環境生效
二、KnowledgeBuilderless
- 用來在業務代碼當中收集已經編寫好的規則
- 對這些規則文件進行編譯
- 最終產生一批編譯好的規則包(KnowledgePackage)給其它的應用程序使用
- hasErrors()方法獲得編譯規則過程當中發現規則是否有錯誤
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("test.drl", Test.class),ResourceType.DRL);
if(kbuilder.hasErrors()){
System.out.println("規則中存在錯誤,錯誤消息以下:");
KnowledgeBuilderErrors kbuidlerErrors=kbuilder.getErrors();
for(Iterator iter=kbuidlerErrors.iterator();iter.hasNext();){
System.out.println(iter.next());
}
}
Collection<KnowledgePackage> kpackage=kbuilder.getKnowledgePackages();//產生規則包的集合
三、KnowledgeBaseide
- Drools 提供的用來收集應用當中知識(knowledge)定義的知識庫對象
- 能夠包含普通的規則(rule)、規則流(rule flow)、函數定義(function)、用戶自定義對象(type model)等
KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
- 帶配置KnowledgeBaseConfiguration
KnowledgeBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
kbConf.setProperty( "org.drools.sequential", "true");
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConf);
四、StatefulKnowledgeSession函數
- 規則編譯完成以後,接下來就須要使用一個 API 使編譯好的規則包文件在規則引擎當中運行起來
- Drools5 當中提供了兩個對象與規則引擎進行交互:StatefulKnowledgeSession和 StatelessKnowledgeSession
StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();
statefulKSession.setGlobal("globalTest", new Object());//設置一個global對象
statefulKSession.insert(new Object());//插入一個fact對象
statefulKSession.fireAllRules();
statefulKSession.dispose();
- StatefulKnowledgeSession 將規則當中須要使用的 fact 對象插入進去
- 將規則當中須要用到的 global 設置進去
- 調用 fireAllRules()方法觸發全部的規則執行
- 調用 dispose()方法將內存資源釋放。
五、StatelessKnowledgeSession工具
- 與 StatefulKnowledgeSession 相仿,用來接收業務數據、執行規則的
- 對 StatefulKnowledgeSession 作了包裝
- 在使用 StatelessKnowledgeSession 對象時不須要再調用 dispose()方法釋放內存資源
StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();
ArrayList list=new ArrayList();
list.add(new Object());
list.add(new Object());
statelessKSession.execute(list);
六、Fact 對象oop
- 將一個普通的JavaBean插入到規則的WorkingMemory當中後的對象
- 規則能夠對 Fact 對象進行任意的讀寫操做
- 當一個 JavaBean 插入到WorkingMemory 當中變成 Fact 以後
- Fact 對象不是對原來的 JavaBean 對象進行 Clon,而是原來 JavaBean 對象的引用
七、規則ui
(1)規則文件編碼
- 一個標準的規則文件就是一個以「.drl」結尾的文本文件
- 一個標準的文本文件,因此能夠經過一些記事本工具對其進行打開、查看和編輯
- 規則是放在規則文件當中的,一個規則文件能夠存放多個規則
- 規則文件當中還能夠存放用戶自定義的函數、數據對象及自定義查詢等相關在規則當中可能會用到的一些對象
- 一個標準的規則文件的結構代碼清單以下:
![](http://static.javashuo.com/static/loading.gif)
- package 是對於規則文件中規則的管理只限於邏輯上的管理,而無論其在物理上的位置如何
(2)規則語言code
- 規則是在規則文件當中編寫
- 要編寫一個規則首先須要先建立一個存放規則的規則文件
- 一個規則文件能夠存放若干個規則
- 每個規則經過規則名稱來進行標識
- 一個標準規則的結構:
![](http://static.javashuo.com/static/loading.gif)
- 一個規則一般包括三個部分:屬性部分(attribute)、條件部分(LHS)和結果部分(RHS)
- 三個部分都是可選的
(3)條件部分又被稱之爲 Left Hand Side,簡稱爲 LHS對象
- 由一個或多個條件組成,條件又稱之爲 pattern(匹配模式)
- 多個 pattern之間用可使用 and 或 or 來進行鏈接
- 同時還可使用小括號來肯定 pattern 的優先級
- 多個約束的鏈接,能夠採用「&&」(and)、「||」(or)和「,」(and)來實現
- 「,」與「&&」和「||」不能混合使用
- 十二種類型的比較操做符
- 分別是:>、>=、<、<=、= =、!=、contains、not contains、memberof、not memberof、matches、not matches
(4)結果部分又被稱之爲 Right Hand Side,簡稱爲 RHS
- 在 RHS 裏面,提供了一些對當前 Working Memory 實現快速操做的宏宏函數或對象
- 好比 insert/insertLogical、update 和 retract 就能夠實現對當前 Working Memory中的 Fact 對象進行新增、刪除或者是修改
(5)規則的屬性共有 13 個
- 分別是:activation-group、agenda-group、auto-focus、date-effective、date-expires、dialect、
- duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when
(6)函數是定義在規則文件當中一代碼塊
- 做用是將在規則文件當中若干個規則都會用到的業務操做封裝起來,實現業務代碼的複用,減小規則編寫的工做量
function void/Object functionName(Type arg...) {
/*函數體的業務代碼*/
}
- 業務代碼的書寫採用的是標準的 Java 語法
- 沒有可見範圍的設定,而 Java 當中能夠經過 public、private 之類來設置方法的可見範圍
(7)查詢是 Drools 當中提供的一種根據條件在當前的 WorkingMemory 當中查找 Fact 的方法
- 在 Drools 當中查詢可分爲兩種:一種是不須要外部傳入參數;一種是須要外部傳入參數
無參數查詢
- 查詢以 query 關鍵字開始,以 end 關鍵字結束
- 在 package 當中一個查詢要有惟一的名稱
- 查詢的內容就是查詢的條件部分
- 條件部份內容的寫法與規則的 LHS 部分寫法徹底相同
//調用查詢
QueryResults queryResults=statefulSession.getQueryResults("testQuery");
for(QueryResultsRow qr:queryResults){
Customer cus=(Customer)qr.get("customer");
//打印查詢結果
System.out.println("customer name :"+cus.getName());
}
statefulSession.dispose();
參數查詢
- 和不帶參數的查詢相比,惟一不一樣以外就是在查詢名稱後面多了一個用括號括起來的輸入參數
- 查詢可接收多個參數,多個參數之間用「,」分隔,每一個參數都要有對應的類型聲明
(8)對象定義
- 能夠定義兩種類型的對象:一種是普通的類型 Java Fact 的對象;另外一種是用來描述 Fact 對象或其屬性的元數據對象
Fact 對象定義
declare Address
city : String
addressName : String
end
元數據定義
- 採用的是「@」符號開頭,後面是元數據的屬性名(屬性名能夠是任意的)
- 而後是括號,括號當中是該元數據屬性對應的具體值(值是任意的)