JAVA規則引擎JSR-94筆札

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 小站

相關文章
相關標籤/搜索