您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何分析Drools規則引擎技術在天梯項目中的應用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
今天主要來給大家分享一下Drools規則引擎的原理與規則配置。在介紹之前,首先給大家介紹一下我行研發的SQL評測優化項目——天梯系統,大數據天梯系統是一款智能分析 SQL 評測工具,不僅可以提高腳本上線效率,降低人員工作量,而且可以針對各種查詢的算力消耗、數據安全及代碼規范,提取代碼特征,及時發現代碼質量、安全、性能等問題,避免太差的 SQL進入生產系統,為系統的穩定與健康運行提供有效保障。天梯系統設計的初衷是用戶可以根據定義的規則,對SQL語句進行評測,以免在生產環境中出問題。天梯系統在開發過程中可以把業務邏輯從硬編碼中解耦,達到修改業務邏輯不更改代碼、不用重新編碼、減少對系統其他功能影響。天梯系統主要由SQL語法解析和SQL評測兩部分組成,在SQL評測階段,用到了Drools規則引擎,它是天梯系統尤為重要的核心部分。Drools規則引擎是否能夠挑起大梁呢?事實證明,它做到了!
Drools是一款基于 Java的開源規則引擎,將復雜多變的規則從硬編碼中解放出來,以規則腳本形式存放在文件中,使得規則的變更不需要修正代碼、重啟機器,就可以立即在線上環境生效。規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,并使用預定義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,并根據業務規則做出業務決策,從而給編程帶來了極大的方便。
Drools規則引擎有什么優點呢?如上圖1所示,可以很直觀的看出來,Drools規則引擎可以將業務規則與業務系統分離,解耦合。同時,Drools可實現自然語言描述規則邏輯,業務人員易于理解。并且可以可視化的規則定制、審批、查詢及管理。有效的提高實現復雜邏輯的代碼的可維護性。在客戶一開始沒有提到要將業務邏輯考慮在內的情況時,也可以在后續定制規則,對于開發者而言,符合組織對敏捷或迭代開發過程的使用。
Drools有這么多優點,那么它的基本工作過程是如何實現呢?之前我們一般的做法都是使用一個接口進行業務的工作,首先要傳進去參數,其次要獲取到接口的實現執行完畢后的結果。Drools在這方面與我們以往的做法不謀而合,Drools也需要傳遞進去數據,用于規則的檢查,調用外部接口,同時還可能需要獲取到規則執行完畢后得到的結果。在Drools中,這個傳遞數據進去的對象是一個普通的JavaBean,一個JavaBean插入到Working Memory(內存存儲)中后的對象稱為Fact對象,Fact對象不是對原來的JavaBean對象進行克隆,而是原來 JavaBean 對象的引用,簡單點,可以把Fact對象理解為規則與應用系統數據交互的橋梁或通道。對于Fact對象其中的屬性,需要提供getter和setter方法,通過getter和setter方法可以方便的對Fact對象進行相關操作。
之后,Fact對象會與當前WorkingMemory當中所有的規則進行匹配,同時返回一個FactHandler對象。FactHandler對象是插入到 WorkingMemory 當中 Fact 對象的引用,通過 FactHandler 對象可以實現對對應的Fact對象通過API進行刪除及修改等操作。
接下來介紹Drools規則引擎規則文件的配置情況,Drools規則引擎配置文件支持多種格式,最基本的是*.drl文件,當然也可以是*.xml的方式,還可以是*.xls或者*.xlsx的方式。看著就很靈活,是吧!在天梯項目中使用的是*.drl文件的格式。
Drools的基礎語法可分為三塊內容,包路徑、引用、規則體;一個最簡單的規則至少要包含包路徑,規則體這兩部分。一個規則文件可以存放多個規則,除此之外,在規則文件當中還可以存放用戶自定義的函數、數據對象及自定義查詢等相關的在規則當中可能會用到的一些對象。簡單的規則文件結構見下圖,
在一個規則體當中when與then中間的部分就是條件部分。這部分可以包含0-n個條件,如果條件部分為空的話,那么引擎會自動添加一個 eval(true)的條件,即條件部分返回true。
結果部分是then和end之間的內容,只有在條件部分所有條件都滿足時該部分才會執行,類似于Java程序中的條件語句。在結果部分里面,提供了一些對當前Working Memory實現快速操作的宏函數或對象,比如insert、update、modify 和retract就可以實現對當前WorkingMemory 中的 Fact 對象進行新增、修改或者是刪除。
Drools規則引擎基本工作過程和規則文件配置基本就是這些內容。接下來自己也動手簡單的實現了Drools的API調用程序,首先創建了一個maven項目,相關文件目錄及代碼見下圖。
在這里著重介紹一下kmodule.xml.
一個kmodule里面可包含多個kbase,每一個kbase都有一個name,可以取任意字符串,但是不能重名。然后有一個packages,可以看到packages里面的字符串其實就是src/main/resources下面的文件夾的名稱,或者叫包名,規則引擎會根據這里定義的包來查找規則定義文件。可以同時定義多個包,以逗號分隔開來就行。每一個kbase下面可以包含多個ksession,在本例中只定義了一個。
每一個ksession有一個name,名字也可以是任意字符串,但是也不能重復。kbase和ksession里面的name屬性是全局不能重復的。kbase和ksession中其實還有很多其它的屬性,每一個kbase下面可以包含多個ksession。
運行時,KieContainer會根據kmodule.xml文件來創建相應的KieModule、KieBase、KieSession對象。其中KieModule和KieBase只會創建一次,而KieSession則有可能創建多次,因為KieSession的創建成本很低,同時KieSession包含了運行時的數據,所以可以銷毀、創建若干次。
項目程序最終執行結果(成功執行):
上述內容就是如何分析Drools規則引擎技術在天梯項目中的應用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。