溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

發(fā)布時(shí)間:2022-01-05 18:43:13 來(lái)源:億速云 閱讀:177 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

今天主要來(lái)給大家分享一下Drools規(guī)則引擎的原理與規(guī)則配置。在介紹之前,首先給大家介紹一下我行研發(fā)的SQL評(píng)測(cè)優(yōu)化項(xiàng)目——天梯系統(tǒng),大數(shù)據(jù)天梯系統(tǒng)是一款智能分析 SQL 評(píng)測(cè)工具,不僅可以提高腳本上線效率,降低人員工作量,而且可以針對(duì)各種查詢的算力消耗、數(shù)據(jù)安全及代碼規(guī)范,提取代碼特征,及時(shí)發(fā)現(xiàn)代碼質(zhì)量、安全、性能等問(wèn)題,避免太差的 SQL進(jìn)入生產(chǎn)系統(tǒng),為系統(tǒng)的穩(wěn)定與健康運(yùn)行提供有效保障。天梯系統(tǒng)設(shè)計(jì)的初衷是用戶可以根據(jù)定義的規(guī)則,對(duì)SQL語(yǔ)句進(jìn)行評(píng)測(cè),以免在生產(chǎn)環(huán)境中出問(wèn)題。天梯系統(tǒng)在開(kāi)發(fā)過(guò)程中可以把業(yè)務(wù)邏輯從硬編碼中解耦,達(dá)到修改業(yè)務(wù)邏輯不更改代碼、不用重新編碼、減少對(duì)系統(tǒng)其他功能影響。天梯系統(tǒng)主要由SQL語(yǔ)法解析和SQL評(píng)測(cè)兩部分組成,在SQL評(píng)測(cè)階段,用到了Drools規(guī)則引擎,它是天梯系統(tǒng)尤為重要的核心部分。Drools規(guī)則引擎是否能夠挑起大梁呢?事實(shí)證明,它做到了!

Drools是一款基于 Java的開(kāi)源規(guī)則引擎,將復(fù)雜多變的規(guī)則從硬編碼中解放出來(lái),以規(guī)則腳本形式存放在文件中,使得規(guī)則的變更不需要修正代碼、重啟機(jī)器,就可以立即在線上環(huán)境生效。規(guī)則引擎由推理引擎發(fā)展而來(lái),是一種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來(lái),并使用預(yù)定義的語(yǔ)義模塊編寫(xiě)業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)業(yè)務(wù)規(guī)則做出業(yè)務(wù)決策,從而給編程帶來(lái)了極大的方便。

如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

Drools規(guī)則引擎有什么優(yōu)點(diǎn)呢?如上圖1所示,可以很直觀的看出來(lái),Drools規(guī)則引擎可以將業(yè)務(wù)規(guī)則與業(yè)務(wù)系統(tǒng)分離,解耦合。同時(shí),Drools可實(shí)現(xiàn)自然語(yǔ)言描述規(guī)則邏輯,業(yè)務(wù)人員易于理解。并且可以可視化的規(guī)則定制、審批、查詢及管理。有效的提高實(shí)現(xiàn)復(fù)雜邏輯的代碼的可維護(hù)性。在客戶一開(kāi)始沒(méi)有提到要將業(yè)務(wù)邏輯考慮在內(nèi)的情況時(shí),也可以在后續(xù)定制規(guī)則,對(duì)于開(kāi)發(fā)者而言,符合組織對(duì)敏捷或迭代開(kāi)發(fā)過(guò)程的使用。

Drools有這么多優(yōu)點(diǎn),那么它的基本工作過(guò)程是如何實(shí)現(xiàn)呢?之前我們一般的做法都是使用一個(gè)接口進(jìn)行業(yè)務(wù)的工作,首先要傳進(jìn)去參數(shù),其次要獲取到接口的實(shí)現(xiàn)執(zhí)行完畢后的結(jié)果。Drools在這方面與我們以往的做法不謀而合,Drools也需要傳遞進(jìn)去數(shù)據(jù),用于規(guī)則的檢查,調(diào)用外部接口,同時(shí)還可能需要獲取到規(guī)則執(zhí)行完畢后得到的結(jié)果。在Drools中,這個(gè)傳遞數(shù)據(jù)進(jìn)去的對(duì)象是一個(gè)普通的JavaBean,一個(gè)JavaBean插入到Working Memory(內(nèi)存存儲(chǔ))中后的對(duì)象稱為Fact對(duì)象,F(xiàn)act對(duì)象不是對(duì)原來(lái)的JavaBean對(duì)象進(jìn)行克隆,而是原來(lái) JavaBean 對(duì)象的引用,簡(jiǎn)單點(diǎn),可以把Fact對(duì)象理解為規(guī)則與應(yīng)用系統(tǒng)數(shù)據(jù)交互的橋梁或通道。對(duì)于Fact對(duì)象其中的屬性,需要提供getter和setter方法,通過(guò)getter和setter方法可以方便的對(duì)Fact對(duì)象進(jìn)行相關(guān)操作。

之后,F(xiàn)act對(duì)象會(huì)與當(dāng)前WorkingMemory當(dāng)中所有的規(guī)則進(jìn)行匹配,同時(shí)返回一個(gè)FactHandler對(duì)象。FactHandler對(duì)象是插入到 WorkingMemory 當(dāng)中 Fact 對(duì)象的引用,通過(guò) FactHandler 對(duì)象可以實(shí)現(xiàn)對(duì)對(duì)應(yīng)的Fact對(duì)象通過(guò)API進(jìn)行刪除及修改等操作。

接下來(lái)介紹Drools規(guī)則引擎規(guī)則文件的配置情況,Drools規(guī)則引擎配置文件支持多種格式,最基本的是*.drl文件,當(dāng)然也可以是*.xml的方式,還可以是*.xls或者*.xlsx的方式??粗秃莒`活,是吧!在天梯項(xiàng)目中使用的是*.drl文件的格式。

Drools的基礎(chǔ)語(yǔ)法可分為三塊內(nèi)容,包路徑、引用、規(guī)則體;一個(gè)最簡(jiǎn)單的規(guī)則至少要包含包路徑,規(guī)則體這兩部分。一個(gè)規(guī)則文件可以存放多個(gè)規(guī)則,除此之外,在規(guī)則文件當(dāng)中還可以存放用戶自定義的函數(shù)、數(shù)據(jù)對(duì)象及自定義查詢等相關(guān)的在規(guī)則當(dāng)中可能會(huì)用到的一些對(duì)象。簡(jiǎn)單的規(guī)則文件結(jié)構(gòu)見(jiàn)下圖,

如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

在一個(gè)規(guī)則體當(dāng)中when與then中間的部分就是條件部分。這部分可以包含0-n個(gè)條件,如果條件部分為空的話,那么引擎會(huì)自動(dòng)添加一個(gè) eval(true)的條件,即條件部分返回true。

結(jié)果部分是then和end之間的內(nèi)容,只有在條件部分所有條件都滿足時(shí)該部分才會(huì)執(zhí)行,類似于Java程序中的條件語(yǔ)句。在結(jié)果部分里面,提供了一些對(duì)當(dāng)前Working Memory實(shí)現(xiàn)快速操作的宏函數(shù)或?qū)ο?,比如insert、update、modify 和retract就可以實(shí)現(xiàn)對(duì)當(dāng)前WorkingMemory 中的 Fact 對(duì)象進(jìn)行新增、修改或者是刪除。

Drools規(guī)則引擎基本工作過(guò)程和規(guī)則文件配置基本就是這些內(nèi)容。接下來(lái)自己也動(dòng)手簡(jiǎn)單的實(shí)現(xiàn)了Drools的API調(diào)用程序,首先創(chuàng)建了一個(gè)maven項(xiàng)目,相關(guān)文件目錄及代碼見(jiàn)下圖。

如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

在這里著重介紹一下kmodule.xml.

  1. 一個(gè)kmodule里面可包含多個(gè)kbase,每一個(gè)kbase都有一個(gè)name,可以取任意字符串,但是不能重名。然后有一個(gè)packages,可以看到packages里面的字符串其實(shí)就是src/main/resources下面的文件夾的名稱,或者叫包名,規(guī)則引擎會(huì)根據(jù)這里定義的包來(lái)查找規(guī)則定義文件。可以同時(shí)定義多個(gè)包,以逗號(hào)分隔開(kāi)來(lái)就行。每一個(gè)kbase下面可以包含多個(gè)ksession,在本例中只定義了一個(gè)。

  2. 每一個(gè)ksession有一個(gè)name,名字也可以是任意字符串,但是也不能重復(fù)。kbase和ksession里面的name屬性是全局不能重復(fù)的。kbase和ksession中其實(shí)還有很多其它的屬性,每一個(gè)kbase下面可以包含多個(gè)ksession。

  3. 運(yùn)行時(shí),KieContainer會(huì)根據(jù)kmodule.xml文件來(lái)創(chuàng)建相應(yīng)的KieModule、KieBase、KieSession對(duì)象。其中KieModule和KieBase只會(huì)創(chuàng)建一次,而KieSession則有可能創(chuàng)建多次,因?yàn)镵ieSession的創(chuàng)建成本很低,同時(shí)KieSession包含了運(yùn)行時(shí)的數(shù)據(jù),所以可以銷毀、創(chuàng)建若干次。

項(xiàng)目程序最終執(zhí)行結(jié)果(成功執(zhí)行):

如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用

上述內(nèi)容就是如何分析Drools規(guī)則引擎技術(shù)在天梯項(xiàng)目中的應(yīng)用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI