JAVA規則引擎JSR-94筆札
JSR-94 是由JCP(Java Community Process)組織所制定的java規則引擎API的java請求規範。它主要定義了規則引擎在java運行時的一些API,指導各個java規則引擎的廠商可以基於這個API實現規則引擎。當前主流支持這個標準的開源java規則引擎有:Drools、OpenRules、JLisa、JRuleEngine。html
什麼是規則引擎
JSR-94標準描述的是java規則引擎API,那麼什麼是規則引擎呢?對於這個問題,業界沒有一個嚴格的定義;固然,這並不妨礙對它的理解。java
規則的理解,最簡單的一種觀點就是規則是一個if/then的單元;知足某種條件,而後執行某些操做。舉個典型的例子:本店購買衣服若是金額超過300RMB,那麼就享受八折優惠。具體分析這個規則,它須要輸入的是本店購買衣服的金額,它須要知足條件是金額超過300RMB,所要作的是結算時候的金額打八折。固然這樣能夠舉上不少例子,又好比本店優惠券100RMB只能用於衣服售價大於300RMB的服裝;本店服裝售價低於100RMB的服裝,直接減免10RMB不享受其餘優惠等等,再把這些規則放在一塊兒,咱們能夠用規則集來稱呼它。算法
規則引擎的理解,繼續來分析上面簡單的那條規則,對於這條規則的執行它須要輸入數據->判別條件 -> 執行操做 -> 輸出結果
來完成它的功用;若是把這一條規則替換成一個規則集,那麼執行就變成 輸入數據、規則集合 -> 執行知足規則集 -> 輸出結果
;這樣的執行過程就是規則引擎的一個簡單抽象。編程
固然,規則引擎有不少,它們並不是都像以上爲了方便理解而簡單的抽象,甚至規則引擎之間有很大的差異。整體來講,有如下特色:api
- 它提供了一種機制,能夠用於擴展業務和程序的邏輯;
- 它有一種特定的文件格式或者工具或者語法形式,用來編輯規則和規則集從而擴展程序;
- 它常伴有輸入數據併產生輸出結果,每每和程序緊密切合;
最多見的是Forward-chaining類型的規則引擎,並且通常採用的是RETE算法或者相關改進算法來實現。markdown
JSR-94 簡略介紹
JSR-94 是由JCP(Java Community Process)組織所制定的java規則引擎API的java請求規範。標準制定開始於14 Nov, 2000,最後於04 Aug, 2004發佈當前最終版本。該標準集合了IBM、Oracle、BEA Systems等等各個軟件廠商的專家參與制定。它的目的是爲了促進規則引擎技術在java程序中的發展;增長java規則引擎廠商之間的的交流以及標準化工做;讓使用規則引擎的第三方應用更加方便與規範;也爲了簡化規則引擎商對外提供的API。數據結構
這份標準已被Java規則引擎商普遍採用,獲得了承認與支持。oracle
JSR-94 一些概念的定義
Rule(規則)less
通常而言,一個規則包含兩個部分:條件和操做。當條件知足時,就會執行規則定義的操做。由於提供規則引擎的不一樣廠商每每規則定義的結構,規則執行的算法不一樣,因此JSR94標準中不直接定義規則的結構。規則的概念表示的是一個基本單位概念,可做爲一個名字或者描述。dom
Rule Execution Set(規則執行集合)
規則執行集合是指多個規則組成的集合。JSR94也不直接定義規則集合的結構,表示的也只是一個基本單位概念。
Rule Session(規則會話)
Rule Session是指運行時程序與規則引擎之間的鏈接,一個規則會話會關聯一個規則執行集合。一個規則會話,可能會消耗規則引擎的資源,因此當程序再也不使用的時候應該釋放該會話資源。
Stateful Rule Session(全狀態規則會話)
Stateful Rule Session 是指運行程序長時間的同一個規則執行集合進行交互,有記錄會話時的相關狀態、數據信息。
Stateless Rule Session(無狀態規則會話)
Stateless Rule Session 提供的是一種高效、簡單的API來執行規則集合,不記錄會話時的相關數據信息。
JSR-94 API 的相關設計
JSR-94提供的規則引擎相關類和接口都是放在javax.rules 和 javax.rules.admin 這兩個包名下。javax.rules 包主要定義的是規則引擎運行時的相關API,這些API主要提供的是與規則會話直接或者間接相關的API;另一個javax.rules.admin 包提供的是管理規則執行集合相關的API。整體來看就是一個提供的是規則引擎運行接口,另外一個提供的是規則執行集合的管理接口。
規則引擎運行接口,它主要提供瞭如下的幾個功能點:
- 獲取規則引擎廠商提供的 RuleServiceProvider 的實現實例;
- 經過 RuleServiceProvider 獲取到規則運行時的接口 RuleRuntime;
- 經過 RuleRuntime 來建立 規則會話 RuleSession;
- 獲取到註冊的相關資源,而且與 RuleSession 進行交互,其中包括規則執行集合的相關內容;
- 執行規則集合,而且提供結果以及進行相關處理;
- 用 Handle 實例來容許數據對象聯繫到 StatefulRuleSession;
規則執行集合管理接口,主要提供的功能以下:
- 經過 RuleServiceProvider 獲取到規則管理的實例 RuleAdministrator;
- 經過一些java中標準的數據結構類來獲取規則執行集合 RuleExecutionSet,好比:java.io.InputStream、java.lang.String、org.w3c.dom.Element等等;
- 經過URI來管理 RuleRuntime 的規則執行集合;
- 查詢規則執行集合 RuleExecutionSet 中的 Rule 規則;
- set 和 get 應用程序或者引擎廠商的相關特別屬性;
最後,不妨用一段代碼具體來看JSR94一個無狀態規則會話 執行的簡化過程:
//獲取規則引擎廠商提供的RuleServiceProvider 實例 String uri = RuleServiceProviderImpl.RULE_SERVICE_PROVIDER; RuleServiceProviderManager.registerRuleServiceProvider(uri, RuleServiceProviderImpl.class); RuleServiceProvider ruleServiceProvider = RuleServiceProviderManager.getRuleServiceProvider(uri); //獲取RuleAdministrator 和 RuleExectuionSetProvider 實例 HashMap<String, String> properties = new HashMap<String, String>(); RuleAdministrator ruleAdministrator = ruleServiceProvider.getRuleAdministrator(); LocalRuleExecutionSetProvider ruleExecutionSetProvider = ruleAdministrator.getLocalRuleExecutionSetProvider(properties); //建立一個 RuleExecutionSet InputStream inputStream = new ByteArrayInputStream(ruleString.getBytes()); RuleExecutionSet ruleSet = ruleExecutionSetProvider.createRuleExecutionSet(inputStream, properties); RuleRuntime ruleRuntime = ruleServiceProvider.getRuleRuntime(); ruleAdministrator.registerRuleExecutionSet("isArule", ruleSet, properties); //建立一個規則會話,並executeRules StatelessRuleSession ruleSession = (StatelessRuleSession) runtime.createRuleSession("isArule", null, RuleRuntime.STATELESS_SESSION_TYPE); ruleSession.executeRules(Arrays.asList(args));
JSR-94 不足之處
JSR94標準規範定義的API比較簡單,很是靈活;可是它最大的不足在於缺少對於規則定義語言的定義。在它發佈最終版本以後,W3C組織於2005年發起了一份RIF(Rule Interchange Format )標準定義的討論,這份標準定義更加詳細、嚴格些,感興趣能夠翻閱相關資料, 5 February 2013已經發布了第二版,不過 公共承認程度 如今還比不上JSR94這份標準。
相關文獻連接
JavaTM Rule Engine API
JSR-94 - 維基百科,自由的百科全書
Getting Started With the Java Rule Engine API
Java規則引擎與其API(JSR-94)
Guideline: JSR94 - Eclipse
JSR 94 API API
RIF Overview
編程De 小站