當前位置:首頁 » 操作系統 » drools資料庫

drools資料庫

發布時間: 2025-06-03 14:21:40

『壹』 Drools規則引擎

Drools規則引擎1.什麼是規則引擎

規則引擎的主要思想是將應用程序中的業務決策部分抽離出來,並使用預定義的語義模塊編寫業務決策,由用戶或開發者在需要時進行配置管理。規則引擎產品有Drools、VisualRules、iLog等。

例如,在信用卡申請業務中,需要根據學歷、收入、是否有房、是否有車判斷是否符合信用卡申請要求以及可以申請的額度是多少。傳統的做法是使用if...else的做法,代碼量大,且不易修改。

規則引擎實現將業務決策從應用程序代碼中分離出來,接收數據輸入,解釋業務規則,並根據業務規則做出業務決策。規則引擎就是一個輸入到輸出的平台。

信用卡申請業務通過規則引擎的處理就變成了這樣:

系統引入規則引擎之後,業務規則不再以程序代碼的方式駐留在系統中,取而代之的是處理規則的規則引擎,業務規則存儲在規則庫中,完全獨立於程序。業務人員可以像管理數據一樣對業務規則進行管理,比如查詢、添加、更改、統計、提交業務規則等。業務規則被載入到規則引擎後,供系統的應用程序調用。

2.規則引擎的優勢

業務代碼與系統代碼分離,實現業務規則的集中管理;

在不重啟服務的情況下,可以隨時對業務規則進行擴展和維護;

可以動態修改業務規則,從而快速響應需求變更;

規則引擎是相對獨立的,只關心業務規則,使得業務分析人員也可以參與編輯、維護系統的業務規則;

減少了硬編碼業務規則的成本和風險;

還可以使用規則引擎提供的規則編輯工具,使復雜的業務規則實現變得簡單。

3.規則引擎的應用場景

業務規則復雜,且經常變動。

(1)風險控制系統--風險貸款、風險評估

(2)反欺詐項目--銀行貸款、徵信驗證

(3)決策平台系統--財務計算

(4)促銷平台系統--滿減、打折、加價購

4.Drools介紹

Drools是一款由JBoss組織提供的基於java語言開發的開源規則引擎,可以將復雜多變的業務規則從硬編碼中解放出來,以規則腳本的形式存放在文件或者指定的存儲介質中(例如存放在資料庫中),使得業務規則的變更不需要修改項目代碼、重啟伺服器就可以在線上環境立即生效。IDEA中集成了Drools的插件,eclipse開發需要單獨安裝Drools 的插件。

Drools API開發步驟:

獲取KieServices

獲取KieContainer

獲取KieSession

插入Fact對象

觸發規則

關閉KieSession

//1.獲取KieServicesKieServices kieServices = KieServices.Factory.get();//2.獲取Kie容器對象KieContainer kieContainer = kieServices.getKieClasspathContainer();//3.從kie容器對象中獲取會話對象KieSession session = kieContainer.newKieSession();//4.創建Fact對象(事實對象)Proct proct = new Proct();proct.setType("diamond");//5.將Proct對象插入到工作內存中去session.insert(proct);//6.激活規則,由drools框架自動進行規則匹配,如果匹配成功,則執行規則session.fireAllRules();//7.關閉sessionsession.dispose();5.規則引擎的構成

working Memory(工作內存)

Rule Base(規則庫)

Inference Engine(推理引擎):Pattern Matcher(匹配器)、Agenda(議程)、Execution Engine(執行引擎)

6.規則引擎執行過程

將初始數據(fact)輸入至工作內存(working Memory)

使用匹配器(Pattern Matcher)將規則庫中的規則(rule)和數據(fact)匹配,匹配成功的放入到議程(Agenda)中

如果執行規則存在沖突,即同時激活了多個規則,將沖突的規則放入沖突集合(沖突是同時匹配了多條規則,不需要自己處理,drools會自動處理)

解決沖突,將激活的規則按順序放入議程(Agenda)

執行議程(Agenda)中的規則,重復2-4,直到執行完畢議程中的所有規則

7.規則文件的構成

package:包名,package對應的不一定是真正的目錄,可以任意寫com.abc,同一個包下的drl文件可以相互訪問

import:用於導入類或者靜態方法

global:全局變數

function:自定義函數

query:查詢

rule end:規則體

8.規則體語法結構rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束9.Drools基礎語法< >= <=>

contains:檢查一個Fact對象的某個屬性值是否包含一個指定的對象值

not contains:檢查一個Fact對象的某個屬性值是否不包含一個指定的對象值

memberOf:判斷一個Fact對象的某個屬性是否在一個或多個集合中

not memberOf:判斷一個Fact對象的某個屬性是否不在一個或多個集合中

matches:判斷一個Fact對象的屬性是否與提供的標準的Java正則表達式進行匹配

not matcher:判斷一個Fact對象的屬性是否不與提供的標準的Java正則表達式進行匹配

10.Drools內置方法

規則文件的RHS部分的主要作用是通過插入、刪除或修改工作內存中的Fact數據,來達到控制規則引擎執行的目的。Drools提供了一些方法可以用來操作工作內存中的數據,操作完成後規則引擎會重新進行相關規則的匹配,原來沒有匹配成功的規則在我們修改數據完成後有可能就會匹配成功了。

(1)update方法

update方法的作用是更新工作內存中的數據,並讓相關的規則重新匹配。更新數據時,要注意防止陷入死循環。

rule "年齡小於十歲"when $student:Student(age<10)then $student:setAge(15)update($student)//update方法用於更新Fact對象,會導致相關規則重新匹配end

(2)insert方法

insert方法的作用是向工作內存中插入數據,並讓相關的規則重新匹配

rule "年齡等於十歲"when $student:Student(age==10)thenStudent s = new Student(); s.setAge(5);insert(s);//insert方法的作用是向工作內存中插入Fact對象,會導致相關規則重新匹配end

(3)retract方法

retract方法的作用是刪除工作內存中的數據,並讓相關的規則重新匹配

rule "年齡等於十歲"when $student:Student(age==10)then retract($student)//retract方法的作用是刪除工作內存中的Fact對象,會導致相關規則重新匹配end11.規則屬性

salience:指定規則執行的優先順序,用數字表示,數字越大優先順序越高。如果不設置,默認從上到下執行

dialect:指定規則使用的語言類型,java或mvel

enabled:指定規則是否啟用,取值為ture或false,默認為true

date-effective:指定規則生效的時間

date-expires:指定規則失效的時間

timer:定時器,指定規則觸發的時間

activation-group:激活分組,同一個組內只能有一個規則觸發

agenda-group:議程分組,只有獲取焦點的組中的規則才有可能觸發。在java代碼中獲得焦點。

session.getAgenda().getAgendaGroup("agenda_group_name").setFocus;

auto-focus:自動獲取焦點,一般結合agenda-group使用,取值為ture或false

no-loop:防止死循環,當規則使用update之類的函數修改了Fact對象時,使當前規則再次被激活從而導致死循環。

12.Drools高級語法

1.global全局變數

global關鍵字用於在規則文件中定義全局變數,它可以讓應用程序的對象在規則文件中能夠被訪問。可以用來為規則文件提供數據或服務。語法結構:global 對象類型 對象名稱。

注意事項:如果對象類型為包裝類時,在一個規則中改變了global的值,那麼只針對當前規則有效,對其他規則中的global不會有影響。如果對象類型為集合類型或者javaBean時,在一個規則中改變了global的值,對java代碼和所有規則都有效。

2.query查詢

query查詢提供了一種查詢working memory中符合約束條件的Fact對象的簡單方法。它僅包含規則文件中的LHS部分,不用指定"when"和"then"部分並且以end結束。具體語法結構如下:

query 查詢的名稱(可選參數)LHSend

3.function函數

function關鍵字用於在規則文件中定義函數,規則體中可以調用定義的function函數。使用函數的好處是可以將業務邏輯集中放置在一個地方,根據需要可以對函數進行修改。

function 返回值類型 函數名(可選參數){//邏輯代碼}

4.LHS語法

(1)復合值限制in/not in

復合值限制是指超過一種匹配值的限制條件,類似於SQL語句中的in關鍵字。

$s:Student(name in ("張三","李四","王五"))$s:Student(name not in ("張三","李四","王五"))

(2)條件元素eval

eval用於規則體的LHS部分,並返回一個Boolean類型的值。語法結構:eval(表達式)

eval(1==1)

(3)條件元素not

not用於判斷working memory中是否存在某個Fact對象,如果不存在則返回true,存在返回true。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束0

(4)條件元素exists

exists與not相反,用於判斷working memory中是否存在某個Fact對象,如果存在則返回true,不存在返回true。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束1

(5)規則繼承

規則之間使用extends關鍵字進行規則部分的繼承,類似於java類之間的繼承。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束2

5.RHS語法

RHS部分需要進行業務處理。在RHS部分Drools提供了一個內置對象,名稱是drools,介紹幾個drools對象的方法。

(1)halt

halt方法的作用是立即終止後面所有規則的執行。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束3

(2)getWorkingMemory

getRule方法的作用是返回工作內存中的對象。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束4

(3)getRule

getRule方法的作用是返回規則對象。

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束513.規則文件編碼規范

所有的規則文件(.drl)應統一放在一個規定的文件夾匯總,如:/rules文件夾

書寫的每一個規則應該盡量加上注釋

同一類型的對象盡量放在一個規則文件中,如所有的Student類型的對象盡量放在一個規則文件中

規則結果部分(RHS)盡量不要有條件語句,盡量不要有復雜的邏輯和深層嵌套

每個規則最好都加上salience屬性,明確執行順序

Drools默認dialect為"java",盡量避免使用dialect "mvel"

14.Spring Boot整合Drools----以信用卡申請為例

創建maven工程creditCardApply,並配置pom.xml

創建resources/application.yml文件

創建entity/CreditCardApply.java實體類

創建resources/rules/CreditCardApply.drl文件

編寫配置類config/DroolsConfig.java

創建RuleService.java

創建RuleController.java

具體代碼如下:

(1)創建maven工程creditCardApply,並配置pom.xml

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束6

(2)創建resources/application.yml文件

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束7

(3)創建entity/CreditCardApply.java實體類

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束8

(4)創建resources/rules/CreditCardApply.drl文件

rule "ruleName"//rule關鍵字,表示規則開始,參數為規則的唯一名稱attributes //規則屬性,是rule與when之間的參數,為可選項when //關鍵字,後面是規則的條件部分LHS//Left Hand Side,是規則的條件部分then //後面跟規則的結果部分RHS//是規則的結果或行為end//表示一個規則的結束9

(5)編寫配置類config/DroolsConfig.java

rule "年齡小於十歲"when $student:Student(age<10)then $student:setAge(15)update($student)//update方法用於更新Fact對象,會導致相關規則重新匹配end0

(6)創建RuleService.java

rule "年齡小於十歲"when $student:Student(age<10)then $student:setAge(15)update($student)//update方法用於更新Fact對象,會導致相關規則重新匹配end1

(7)創建RuleController.java

rule "年齡小於十歲"when $student:Student(age<10)then $student:setAge(15)update($student)//update方法用於更新Fact對象,會導致相關規則重新匹配end2原文:https://juejin.cn/post/7099467623000784926

『貳』 drools的規則實例到底指的是什麼

InfoQ發布了一個關於規則引擎的介紹Real-World Rule Engines,原文

ONJava上也有兩篇文章:

Give Your Business Logic a Framework with Drools

Using Drools in Your Enterprise Java Application

下面總結一下其中的精華:

大多數web和企業Java應用可以分成三個部分:一個和用戶交互的前台, 一個和後台系統,例如資料庫交互的服務層,以及他們中間的業務邏輯。 現在使用框架構建前台和後台系統已經成為普遍共識(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但卻沒有一個標準的方法來構建業務邏輯。一些框架,例如 EJB 和 Spring 只在一個高層實現業務邏輯,但對於我們組織邏輯代碼沒有任何幫助,所以,為什麼沒有一個框架來替換冗繁,易錯的if...then語句呢,這個框架應該和其它前台或後台框架一樣,易於配置,具有可讀性和重用性。下面我們將介紹Drools 規則引擎,這個來解決我們問題的框架。

下面是一個典型的Java業務邏輯的代碼

if ((user.isMemberOf(AdministratorGroup)
&& user.isMemberOf(teleworkerGroup))
|| user.isSuperUser(){

// more checks for specific cases
if((expenseRequest.code().equals("B203")
||(expenseRequest.code().equals("A903")
&&(totalExpenses<200)
&&(bossSignOff> totalExpenses))
&&(deptBudget.notExceeded)) {
//issue payments
} else if {
//check lots of other conditions
}
} else {
// even more business logic
}

這是大多數程序員寫業務邏輯的方法,但是有以下的問題:

如果用戶有另一個選項,例如("C987") ,那麼需要修改上面的代碼,當代碼很長的時候,修改代碼是難於維護的
我們如何保證代碼的正確性,這個代碼只有程序員能夠看到,真正的使用者,業務人員無法看到這個代碼
很多應用程序有相同的業務邏輯,如果某個業務改變了,如何保證其他業務邏輯的一致性
業務邏輯能否不合java語言綁定?
業務邏輯能否用其他的腳本語言。
Java下的規則引擎標准就是JSR94,它的實現主要有Jess Jena Drools

Drools中,一個典型的業務邏輯的配置,如下

<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
xmlns=""
xmlns:java=""
xmlns:xs
=""
xs:schemaLocation
=" rules.xsd
java.xsd">
<!-- Import the Java Objects that we refer
to in our rules -->
<java:import>
java.lang.Object
</java:import>
<java:import>
java.lang.String
</java:import>
<java:import>
net.firstpartners.rp.StockOffer
</java:import>
<!-- A Java (Utility) function we reference
in our rules-->
<java:functions>
public void printStock(
net.firstpartners.rp.StockOffer stock)
{
System.out.println("Name:"
+stock.getStockName()
+" Price: "+stock.getStockPrice()
+" BUY:"
+stock.getRecommendPurchase());
}
</java:functions>
<rule-set>
<!-- Ensure stock price is not too high-->
<rule name="Stock Price Low Enough">
<!-- Params to pass to business rule -->
<parameter identifier="stockOffer">
<class>StockOffer</class>
</parameter>
<!-- Conditions or 'Left Hand Side'
(LHS) that must be met for
business rule to fire -->
<!-- note markup -->
<java:condition>
stockOffer.getRecommendPurchase() == null
</java:condition>
<java:condition>
stockOffer.getStockPrice() < 100
</java:condition>
<!-- What happens when the business
rule is activated -->
<java:consequence>
stockOffer.setRecommendPurchase(
StockOffer.YES);
printStock(stockOffer);
</java:consequence>
</rule>
</rule-set>

一條規則就是rule-set中的rule,如果有很多規則,就要寫很多的rule。

上面規則的意思是判斷股票價格是否小於100,如果100這個標准改變了,那麼只要修改這個規則文件,而不用去修改源代碼了

『叄』 正在學習Drools規則引擎,一直出現空指針問題,想請教一下各位大神

而是在資料庫表中進行配置。因此我們常見的業務邏輯層的開發,並不能先設計出一個數據模型,然後再在此基礎上抽象邏輯。但我們確實解決了業務邏輯層的業務邏輯配置問題。應該說我們的更實用一些。但是我們卻沒法去實現JSR94標准。我們不光處理業務邏輯。
我們以JBoss的Drools為例,再打包成一個規則包,也提到了規則引擎。
在我們的印象中,我們感覺規則引擎就是解決業務邏輯層的實現問題的。因此我們理所當然的覺得工作流中的某個節點的邏輯處理,應該可以用規則引擎來解決。但是也使得規則引擎的應用得到了很大的限制。
首先這種抽象本身需要一個復雜的分析過程,這需要有很強的分析設計能力。另外我們平時具體應用中的業務邏輯層,大量的邏輯都是對實際數據的處理,很多時候還是一個批量數據的處理,甚至有些邏輯需要的參數我們並不能定義在規則中。
因此我們發現Drools等規則引擎很難用,根本不是我們所需要的那樣。有時候我們發現自己做的規則引擎並不是一個規則引擎。因為我們和像Drools這些規則引擎有很大的差別。
我們研究規則引擎也有一段時間了可能很多人還不了解規則引擎是什麼東西,或者不知道規則引擎究竟有什麼用。一個規則包相當於一個智能塊。首先需要將我們具體應用中的業務邏輯做抽象,抽象成一條條規則之後。
但是當我們在使用上述這些規則引擎,卻發現很難和我們實際應用的業務邏輯層的業務邏輯實現相對應。我們都知道工作流引擎,也聽說過JBoss下面有個Drools,或者我們知道 weblogic或者Oracle也有自己的Business Rule,我們可能還聽說過ILOG被IBM收購了,如果我們研究微軟的WWF。當數據傳遞給這個智能塊後,系統會以匹配的方式應用滿足條件的邏輯處理。
當採用這種方式時,應該說邏輯更抽象了,在一個更高的層次加以抽象化的定義,那麼工作流本身的邏輯也應該可以由規則引擎來解決,可能也知道其中有RuleSet等內容。國內的一些web快速開發平台,由於其規則引擎使用了匹配規則的方式來進行,因此在應用這些規則引擎時。另外我們也會覺得,平時項目當中的業務邏輯應該都可以用規則引擎來解決,還把所有業務邏輯層需要處理的操作全部採用規則配置的形式

『肆』 規則引擎drools如何整合spring,drl文件一般放在什麼地方

drl文件可以持久化到資料庫中,然後寫個載入執行的引擎,這樣可以很靈活的結合實際業務。
先寫規則模板,採用velocity解析,通過規則解析後,生產規則文件,規則文件就是drools文件。
規則模板和規則文件統一持久化到資料庫中。

『伍』 drools 我這邊根據需求需要做到可以在web頁面隨意改動規則..我目前想到的辦法是通過java生成drl文件.

試試Drools Guvnor, http://www.jboss.org/drools/drools-guvnor.html

熱點內容
順序功能圖編程 發布:2025-06-05 09:05:59 瀏覽:723
python第四版pdf 發布:2025-06-05 09:01:45 瀏覽:596
test資料庫 發布:2025-06-05 08:45:04 瀏覽:935
信源豆豆伺服器ip是干什麼用的 發布:2025-06-05 08:44:22 瀏覽:446
rar解壓手機版中文版 發布:2025-06-05 08:40:52 瀏覽:350
妖狐解壓的密碼是多少 發布:2025-06-05 08:19:14 瀏覽:59
裁剪機源碼 發布:2025-06-05 08:11:18 瀏覽:732
minecraftlinux 發布:2025-06-05 08:11:17 瀏覽:522
安卓哪個手機運行速度好 發布:2025-06-05 08:06:58 瀏覽:607
linuxeval 發布:2025-06-05 08:06:10 瀏覽:322