国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JAVA規(guī)則引擎JSR-94筆札

2019-11-14 22:44:40
字體:
供稿:網(wǎng)友
java規(guī)則引擎JSR-94筆札JAVA規(guī)則引擎JSR-94筆札

JSR-94 是由JCP(Java Community PRocess)組織所制定的java規(guī)則引擎API的java請求規(guī)范。它主要定義了規(guī)則引擎在java運(yùn)行時的一些API,指導(dǎo)各個java規(guī)則引擎的廠商能夠基于這個API實(shí)現(xiàn)規(guī)則引擎。當(dāng)前主流支持這個標(biāo)準(zhǔn)的開源java規(guī)則引擎有:Drools、OpenRules、JLisa、JRuleEngine。


什么是規(guī)則引擎

JSR-94標(biāo)準(zhǔn)描述的是java規(guī)則引擎API,那么什么是規(guī)則引擎呢?對于這個問題,業(yè)界沒有一個嚴(yán)格的定義;當(dāng)然,這并不妨礙對它的理解。

規(guī)則的理解,最簡單的一種觀點(diǎn)就是規(guī)則是一個if/then的單元;滿足某種條件,然后執(zhí)行某些操作。舉個典型的例子:本店購買衣服如果金額超過300RMB,那么就享受八折優(yōu)惠。具體分析這個規(guī)則,它需要輸入的是本店購買衣服的金額,它需要滿足條件是金額超過300RMB,所要做的是結(jié)算時候的金額打八折。當(dāng)然這樣可以舉上很多例子,又比如本店優(yōu)惠券100RMB只能用于衣服售價大于300RMB的服裝;本店服裝售價低于100RMB的服裝,直接減免10RMB不享受其他優(yōu)惠等等,再把這些規(guī)則放在一起,我們可以用規(guī)則集來稱呼它。

規(guī)則引擎的理解,繼續(xù)來分析上面簡單的那條規(guī)則,對于這條規(guī)則的執(zhí)行它需要輸入數(shù)據(jù)->判別條件 -> 執(zhí)行操作 -> 輸出結(jié)果來完成它的功用;如果把這一條規(guī)則替換成一個規(guī)則集,那么執(zhí)行就變成 輸入數(shù)據(jù)、規(guī)則集合 -> 執(zhí)行滿足規(guī)則集 -> 輸出結(jié)果;這樣的執(zhí)行過程就是規(guī)則引擎的一個簡單抽象。

當(dāng)然,規(guī)則引擎有很多,它們并非都像以上為了方便理解而簡單的抽象,甚至規(guī)則引擎之間有很大的差別。總體來說,有以下特點(diǎn):

  • 它提供了一種機(jī)制,可以用于擴(kuò)展業(yè)務(wù)和程序的邏輯;
  • 它有一種特定的文件格式或者工具或者語法形式,用來編輯規(guī)則和規(guī)則集從而擴(kuò)展程序;
  • 它常伴有輸入數(shù)據(jù)并產(chǎn)生輸出結(jié)果,往往和程序緊密切合;

最常見的是Forward-chaining類型的規(guī)則引擎,而且一般采用的是RETE算法或者相關(guān)改進(jìn)算法來實(shí)現(xiàn)。

JSR-94 簡略介紹

JSR-94 是由JCP(Java Community Process)組織所制定的java規(guī)則引擎API的java請求規(guī)范。標(biāo)準(zhǔn)制定開始于14 Nov, 2000,最后于04 Aug, 2004發(fā)布當(dāng)前最終版本。該標(biāo)準(zhǔn)集合了IBM、Oracle、BEA Systems等等各個軟件廠商的專家參與制定。它的目的是為了促進(jìn)規(guī)則引擎技術(shù)在java程序中的發(fā)展;增加java規(guī)則引擎廠商之間的的交流以及標(biāo)準(zhǔn)化工作;讓使用規(guī)則引擎的第三方應(yīng)用更加方便與規(guī)范;也為了簡化規(guī)則引擎商對外提供的API。

這份標(biāo)準(zhǔn)已被Java規(guī)則引擎商廣泛采用,得到了認(rèn)可與支持。

JSR-94 一些概念的定義

Rule(規(guī)則)

一般而言,一個規(guī)則包含兩個部分:條件和操作。當(dāng)條件滿足時,就會執(zhí)行規(guī)則定義的操作。因?yàn)樘峁┮?guī)則引擎的不同廠商往往規(guī)則定義的結(jié)構(gòu),規(guī)則執(zhí)行的算法不同,所以JSR94標(biāo)準(zhǔn)中不直接定義規(guī)則的結(jié)構(gòu)。規(guī)則的概念表示的是一個基本單位概念,可作為一個名字或者描述。

Rule Execution Set(規(guī)則執(zhí)行集合)

規(guī)則執(zhí)行集合是指多個規(guī)則組成的集合。JSR94也不直接定義規(guī)則集合的結(jié)構(gòu),表示的也只是一個基本單位概念。

Rule session(規(guī)則會話)

Rule Session是指運(yùn)行時程序與規(guī)則引擎之間的連接,一個規(guī)則會話會關(guān)聯(lián)一個規(guī)則執(zhí)行集合。一個規(guī)則會話,可能會消耗規(guī)則引擎的資源,所以當(dāng)程序不再使用的時候應(yīng)該釋放該會話資源。

Stateful Rule Session(全狀態(tài)規(guī)則會話)

Stateful Rule Session 是指運(yùn)行程序長時間的同一個規(guī)則執(zhí)行集合進(jìn)行交互,有記錄會話時的相關(guān)狀態(tài)、數(shù)據(jù)信息。

Stateless Rule Session(無狀態(tài)規(guī)則會話)

Stateless Rule Session 提供的是一種高效、簡單的API來執(zhí)行規(guī)則集合,不記錄會話時的相關(guān)數(shù)據(jù)信息。

JSR-94 API 的相關(guān)設(shè)計(jì)

JSR-94提供的規(guī)則引擎相關(guān)類和接口都是放在javax.rules 和 javax.rules.admin 這兩個包名下。javax.rules 包主要定義的是規(guī)則引擎運(yùn)行時的相關(guān)API,這些API主要提供的是與規(guī)則會話直接或者間接相關(guān)的API;另外一個javax.rules.admin 包提供的是管理規(guī)則執(zhí)行集合相關(guān)的API。總體來看就是一個提供的是規(guī)則引擎運(yùn)行接口,另一個提供的是規(guī)則執(zhí)行集合的管理接口。

規(guī)則引擎運(yùn)行接口,它主要提供了以下的幾個功能點(diǎn):

  • 獲取規(guī)則引擎廠商提供的 RuleServiceProvider 的實(shí)現(xiàn)實(shí)例;
  • 通過 RuleServiceProvider 獲取到規(guī)則運(yùn)行時的接口 RuleRuntime;
  • 通過 RuleRuntime 來創(chuàng)建 規(guī)則會話 RuleSession;
  • 獲取到注冊的相關(guān)資源,并且與 RuleSession 進(jìn)行交互,其中包括規(guī)則執(zhí)行集合的相關(guān)內(nèi)容;
  • 執(zhí)行規(guī)則集合,并且提供結(jié)果以及進(jìn)行相關(guān)處理;
  • 用 Handle 實(shí)例來允許數(shù)據(jù)對象聯(lián)系到 StatefulRuleSession;

規(guī)則執(zhí)行集合管理接口,主要提供的功能如下:

  • 通過 RuleServiceProvider 獲取到規(guī)則管理的實(shí)例 RuleAdministrator;
  • 通過一些java中標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu)類來獲取規(guī)則執(zhí)行集合 RuleExecutionSet,比如:java.io.InputStream、java.lang.String、org.w3c.dom.Element等等;
  • 通過URI來管理 RuleRuntime 的規(guī)則執(zhí)行集合;
  • 查詢規(guī)則執(zhí)行集合 RuleExecutionSet 中的 Rule 規(guī)則;
  • set 和 get 應(yīng)用程序或者引擎廠商的相關(guān)特別屬性;

最后,不妨用一段代碼具體來看JSR94一個無狀態(tài)規(guī)則會話 執(zhí)行的簡化過程:

    //獲取規(guī)則引擎廠商提供的RuleServiceProvider 實(shí)例    String uri = RuleServiceProviderImpl.RULE_SERVICE_PROVIDER;    RuleServiceProviderManager.registerRuleServiceProvider(uri, RuleServiceProviderImpl.class);    RuleServiceProvider ruleServiceProvider = RuleServiceProviderManager.getRuleServiceProvider(uri);    //獲取RuleAdministrator 和 RuleExectuionSetProvider 實(shí)例    HashMap<String, String> properties = new HashMap<String, String>();    RuleAdministrator ruleAdministrator = ruleServiceProvider.getRuleAdministrator();    LocalRuleExecutionSetProvider ruleExecutionSetProvider =                 ruleAdministrator.getLocalRuleExecutionSetProvider(properties);    //創(chuàng)建一個 RuleExecutionSet    InputStream inputStream = new ByteArrayInputStream(ruleString.getBytes());    RuleExecutionSet ruleSet = ruleExecutionSetProvider.createRuleExecutionSet(inputStream, properties);    RuleRuntime ruleRuntime = ruleServiceProvider.getRuleRuntime();    ruleAdministrator.registerRuleExecutionSet("isArule", ruleSet, properties);    //創(chuàng)建一個規(guī)則會話,并executeRules    StatelessRuleSession ruleSession = (StatelessRuleSession) runtime.createRuleSession("isArule", null,                     RuleRuntime.STATELESS_SESSION_TYPE);    ruleSession.executeRules(Arrays.asList(args));
JSR-94 不足之處

JSR94標(biāo)準(zhǔn)規(guī)范定義的API比較簡單,非常靈活;但是它最大的不足在于缺乏對于規(guī)則定義語言的定義。在它發(fā)布最終版本之后,W3C組織于2005年發(fā)起了一份RIF(Rule Interchange Format )標(biāo)準(zhǔn)定義的討論,這份標(biāo)準(zhǔn)定義更加詳細(xì)、嚴(yán)格些,感興趣可以翻閱相關(guān)資料, 5 February 2013已經(jīng)發(fā)布了第二版,不過 公共認(rèn)可程度 現(xiàn)在還比不上JSR94這份標(biāo)準(zhǔn)。

相關(guān)文獻(xiàn)鏈接

JavaTM Rule Engine APIJSR-94 - 維基百科,自由的百科全書Getting Started With the Java Rule Engine APIJava規(guī)則引擎與其API(JSR-94)Guideline: JSR94 - EclipseJSR 94 API APIRIF Overview編程De 小站


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吉木萨尔县| 仙桃市| 佛坪县| 松潘县| 泰兴市| 呼玛县| 长岛县| 蓝田县| 伊宁县| 水富县| 塔城市| 新兴县| 勐海县| 松潘县| 临西县| 万源市| 杭锦后旗| 乌鲁木齐市| 新宁县| 南漳县| 竹北市| 都兰县| 阿巴嘎旗| 类乌齐县| 曲阜市| 炉霍县| 仁布县| 拉萨市| 铁岭县| 太谷县| 梅河口市| 延吉市| 吉木乃县| 榆林市| 灌南县| 分宜县| 阿勒泰市| 老河口市| 桑植县| 定陶县| 南靖县|