您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java規(guī)則引擎有什么優(yōu)點”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Java規(guī)則引擎有什么優(yōu)點”吧!
規(guī)則引擎是一種根據(jù)規(guī)則中包含的指定過濾條件,判斷其能否匹配運行時刻的實時條件來執(zhí)行規(guī)則中所規(guī)定的動作的引擎。
規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應(yīng)用程序中的組件,實現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策。
規(guī)則引擎具體執(zhí)行可以分為接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,業(yè)務(wù)決策三個過程。
聲明式編程。規(guī)則引擎允許你描述做什么而不是如何去做,規(guī)則比編碼更容易閱讀。
邏輯與數(shù)據(jù)分離。數(shù)據(jù)保存在系統(tǒng)對象中,邏輯保存在規(guī)則中。打破了面向?qū)ο笙到y(tǒng)中將數(shù)據(jù)和邏輯耦合起來的局面。由于邏輯保存在規(guī)則中,將來邏輯發(fā)生改變時更容易被維護。通過將邏輯集中在一個或數(shù)個清晰的規(guī)則文件中,取代了之前分散在代碼中的局面。
速度及可測量性。Rete算法、Leaps算法,以及由此衍生出來的Drools的Rete、Leaps算法,提供了對系統(tǒng)數(shù)據(jù)對象非常有效率的匹配。這些算法經(jīng)過了大量實際考驗的證明。
知識集中化。通過使用規(guī)則,將建立一個可執(zhí)行的規(guī)則庫。這意味著規(guī)則庫代表著現(xiàn)實中的業(yè)務(wù)策略的唯一對應(yīng),理想情況下可讀性高的規(guī)則還可以被當作文檔使用。
解釋機制。通過將規(guī)則引擎的決斷與決斷的原因一起記錄下來,規(guī)則系統(tǒng)提供了很好的“解釋機制”。
易懂的規(guī)則。通過建立對象模型以及DSL(域定義語言),可以用接近自然語言的方式來編寫規(guī)則。這讓非技術(shù)人員與領(lǐng)域?qū)<铱梢杂盟麄冏约旱倪壿媮砝斫庖?guī)則(因為程序的復(fù)雜性已經(jīng)被隱藏起來了) 。
相對于業(yè)務(wù)系統(tǒng),規(guī)則引擎可以認為是一個獨立于業(yè)務(wù)系統(tǒng)的模塊,負責(zé)一些規(guī)則的計算等。一般來說,規(guī)則引擎主要應(yīng)用在下面的場景中:
風(fēng)控模型配置,風(fēng)控規(guī)則的設(shè)置。
用戶積分等配置,如日常操作引起積分變化等。
簡單的離線計算,各類數(shù)據(jù)量比較小的統(tǒng)計等。
注意事項:規(guī)則引擎作為一個單獨模塊,有其自身的笨重與復(fù)雜,并不是所有相關(guān)業(yè)務(wù)系統(tǒng)都需要引入規(guī)則引擎。
必須建立一些數(shù)據(jù)模型。
考慮規(guī)則的沖突、優(yōu)先級等。
控制規(guī)則的復(fù)雜度,以免給規(guī)則配置人員增加過多的學(xué)習(xí)成本。
由此可見,對于一些時間周期短、規(guī)則復(fù)雜且不常變更的項目,規(guī)則引擎并不十分適用。
通常情況下,Java規(guī)則引擎內(nèi)部由下面幾個部分構(gòu)成:工作內(nèi)存(Working Memory)即工作區(qū),用于存放被引擎引用的數(shù)據(jù)對象集合;規(guī)則執(zhí)行隊列,用于存放被激活的規(guī)則執(zhí)行實例;靜態(tài)規(guī)則區(qū),用于存放所有被加載的業(yè)務(wù)規(guī)則,這些規(guī)則將按照某種數(shù)據(jù)結(jié)構(gòu)組織,當工作區(qū)中的數(shù)據(jù)發(fā)生改變后,引擎需要迅速根據(jù)工作區(qū)中的對象現(xiàn)狀,調(diào)整規(guī)則執(zhí)行隊列中的規(guī)則執(zhí)行實例。Java規(guī)則引擎的結(jié)構(gòu)示意圖如圖1所示。
圖1 規(guī)則引擎執(zhí)行結(jié)構(gòu)圖
當引擎執(zhí)行時,會根據(jù)規(guī)則執(zhí)行隊列中的優(yōu)先順序逐條執(zhí)行規(guī)則執(zhí)行實例,由于規(guī)則的執(zhí)行部分可能會改變工作區(qū)的數(shù)據(jù)對象,從而會使隊列中的某些規(guī)則執(zhí)行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實例進入隊列。于是就產(chǎn)生了一種“動態(tài)”的規(guī)則執(zhí)行鏈,形成規(guī)則的推理機制。這種規(guī)則的“鏈式”反應(yīng)完全是由工作區(qū)中的數(shù)據(jù)驅(qū)動的。
以下項目均為開源,超鏈接中均有其github鏈接,上面有更為詳盡的使用例子。表1 為綜合對比結(jié)果。
表 1規(guī)則引擎綜合對比
| 適用場景 | 優(yōu)點 | 缺點 | 活躍性 | 綜合評估 |
Drools | 決業(yè)務(wù)代碼和業(yè)務(wù)規(guī)則分離;適用于大型應(yīng)用系統(tǒng) | 性能高 可整合 可維護 | 學(xué)習(xí)成本高 | 文檔全 持續(xù)更新 流行 |
五星 |
MVEL | 使用表達式語言定義規(guī)則 | 靈活,性能高,無類型限制 | 資料少 | Github更新少 | 三星 |
Easy Rules | 使用表達式語言定義規(guī)則 | 易學(xué),基于POJO,支持復(fù)合規(guī)則,方式多樣 | Github維護者少 | 最新版本今年4月發(fā)布 | 四星 |
Aviator | 各種表達式的動態(tài)求值 | 高性能;輕量級;支持多種類型 | Github維護者少 | 資料齊,例子多 | 四星 |
Drools是專注于解決業(yè)務(wù)代碼和業(yè)務(wù)規(guī)則分離的引擎。Drools 規(guī)則是在 Java 應(yīng)用程序上運行的,其要執(zhí)行的步驟順序由代碼確定,Drools 規(guī)則引擎將業(yè)務(wù)規(guī)則轉(zhuǎn)換成執(zhí)行樹。具體結(jié)構(gòu)見圖2。
圖2 Drools流程圖
優(yōu)點:非?;钴S的社區(qū)支持;易用;快速的執(zhí)行速度;在 Java 開發(fā)人員中流行;與 Java Rule Engine API(JSR 94)兼容。
MVEL是一個功能強大的基于Java應(yīng)用程序的表達式語言。作為一個表達式語言,旨在更高的效率,例如:直接支持集合、數(shù)組和字符串匹配等操作以及正則表達式。 MVEL用于執(zhí)行使用Java語法編寫的表達式。
與Java不同,MVEL是動態(tài)類型(帶有可選分類),也就是說在源文件中是沒有類型限制的。一條MVEL表達式,簡單的可以是單個標識符,復(fù)雜的則可能是一個充滿了方法調(diào)用和內(nèi)部集合創(chuàng)建的龐大的布爾表達式。
目前最新的版本是2.0,具有以下特性:
(1)動態(tài)JIT優(yōu)化器。當負載超過一個確保代碼產(chǎn)生的閾值時,選擇性地產(chǎn)生字節(jié)代碼,這大大減少了內(nèi)存的使用量。新的靜態(tài)類型檢查和屬性支持,允許集成類型安全表達;
(2) 錯誤報告改善,包括行和列的錯誤信息;
(3) 新的腳本語言特征。MVEL2.0 包含函數(shù)定義,如:閉包,lambda定義,標準循環(huán)構(gòu)造(for, while, do-while, do-until…)。;
(4) 改進的集成功能。迎合主流的需求,MVEL2.0支持基礎(chǔ)類型的個性化屬性處理器,集成到JIT中;
(5) 集成不良,字節(jié)碼生成編譯時間慢,還增加了可擴展性問題;不用字節(jié)碼生成運行時執(zhí)行非常慢。
Easy Rules 是一款 Java 規(guī)則引擎,easy-rules首先集成了mvel表達式,后續(xù)可能集成SpEL的一款輕量級規(guī)則引擎,Easy Rules 提供了規(guī)則抽象來創(chuàng)建帶有條件和操作的規(guī)則,以及運行一組規(guī)則來評估條件和執(zhí)行操作的RulesEngine API。
easy rules有以下特性:輕量級框架;學(xué)習(xí)成本低;基于POJO;為定義業(yè)務(wù)引擎提供有用的抽象和簡便的應(yīng)用;從原始的規(guī)則組合成復(fù)雜的規(guī)則。它主要包括幾個主要的類或接口:Rule,RulesEngine,RuleListener,F(xiàn)acts ,以及幾個主要的注解:@Action,@Condition,@Fact,@Priority,@Rule
Aviator是一個高性能、輕量級的java語言實現(xiàn)的表達式求值引擎,主要用于各種表達式的動態(tài)求值。Aviator的設(shè)計目標是輕量級和高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小。
但是Aviator的語法受到限制,它不是一門完整的語言,而只是語言的一小部分集合。其次,Aviator的實現(xiàn)思路與其他輕量級的求值器很不相同,其他求值器一般都是通過解釋的方式運行,而Aviator則是直接將表達式編譯成Java字節(jié)碼,交給JVM去執(zhí)行。其主要特點如下:
(1)支持大部分運算操作符,包括算術(shù)操作符、關(guān)系運算符、邏輯操作符、正則匹配操作符(=~)、三元表達式?: ,并且支持操作符的優(yōu)先級和括號強制優(yōu)先級,具體請看后面的操作符列表;
(2)支持函數(shù)調(diào)用和自定義函數(shù);
(3)支持正則表達式匹配,類似Ruby、Perl的匹配語法,并且支持類Ruby的$digit指向匹配分組。自動類型轉(zhuǎn)換,當執(zhí)行操作的時候,會自動判斷操作數(shù)類型并做相應(yīng)轉(zhuǎn)換,無法轉(zhuǎn)換即拋異常;
(4)支持傳入變量,支持類似a.b.c的嵌套變量訪問;
(5)性能優(yōu)秀;
(6)Aviator的限制,沒有if else、do while等語句,沒有賦值語句,僅支持邏輯表達式、算術(shù)表達式、三元表達式和正則匹配,沒有位運算符。
到此,相信大家對“Java規(guī)則引擎有什么優(yōu)點”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。