當前位置:首頁 » 操作系統 » drools源碼

drools源碼

發布時間: 2023-04-30 21:45:58

1. 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這個標准改變了,那麼只要修改這個規則文件,而不用去修改源代碼了

2. Java開源框架是什麼

其實框架很簡單的,你可以認為它是一個工具,甚至一個插件。
框架的作用,就是將一個公用的,常用的技術,封裝起來,
幫你處理一些基礎的東西,可以讓你不用再去寫那些繁瑣的東西。
就拿你要學的struts來說:他本質上也是用java寫的,和我們自己寫的類沒有區別,他實現的東西我們自己也可以實現。
比如接收客戶端的數據,我們是用request.getParameter()來的,但是如果有很多個參數,我們要寫很多個,很麻煩。struts它就幫我們實現,不用我們寫,直接寫個屬性,就可以得到。其實本質還是用request.getParameter()。。
所以你不要再在意框架是什麼東西,等你接觸了就知道了。你把它當做一個工具來用,這就是框架。
前台框架:jQuery
Mvc框架:Struts、spring Mvc
核心框架:Spring
orm框架:Hibernate、Spring JDBC、myBatis。

3. 《Java8實戰》epub下載在線閱讀,求百度網盤雲資源

《Java 8實戰》(厄馬(Raoul-Gabriel Urma))電子書網盤下載免費在線閱讀

鏈接:https://pan..com/s/1Rm1x0GetEFlztgWyPzykgg

提取碼:1234

書名:Java 8實戰

作者:厄馬(Raoul-Gabriel Urma)

譯者:陸明剛

豆瓣評分:9.2

出版社:人民郵電出版社

出版年份:2016-4-1

頁數:349

內容簡介:

本書全面介紹了Java 8 這個里程碑版本的新特性,包括Lambdas、流和函數式編程。有了函數式的編程特性,可以讓代碼更簡潔,同時也能自動化地利用多核硬體。全書分四個部分:基礎知識、函數式數據處理、高效Java 8 編程和超越Java 8,清晰明了地向讀者展現了一幅Java 與時俱進的現代化畫卷。

作者簡介:

作者簡介:

Raoul-Gabriel Urma

劍橋大學計算機科學博士,軟體工程師,演講者,培訓師,Cambridge Coding Academy聯合創始人、CEO。曾與谷歌、eBay、甲骨文和高盛集團等大公司合作,並參與過多個創業項目。撰寫過十餘篇經同行審閱的技術文章,並在國際會議上發表過40多篇演講。

Mario Fusco

Red Hat高級軟體工程師,負責JBoss規則引擎Drools的核心開發。擁有豐富的Java開發經驗,曾領導媒體公司、金融部門等多個行業的企業級項目開發。對函數式編程和領域特定語言等有濃厚興趣,並創建了開放源碼庫lambdaj。

Alan Mycroft

劍橋大學計算機實驗室計算學教授,劍橋大學羅賓遜學院研究員,歐洲編程語言和系統協會聯合創始人,樹莓派基金會聯合創始人和理事。發表過大約100篇研究論文,指導過20多篇博士論文。他的研究主要關注編程語言及其語義、優化和實施。他與業界聯系緊密,曾於學術休假期間在AT&T實驗室和英特爾工作,還創立了Codemist公司,該公司設計了最初的ARM C編譯器Norcroft。

4. 求Rete演算法實現代碼

Rete 在拉丁語中是 」net」 ,有網路的意思。 RETE 演算法可以分為兩部分:規則編譯( rule compilation )和運行時執行( runtime execution )。
編譯演算法描述了規則如何在 Proction Memory 中產生一個有效的辨別網路。用一個非技術性的詞來說,一個辨別網路就是用來過濾數據。方法是通過數據在網路中的傳播來過濾數據。在頂端節點將會有很多匹配的數據。當我們順著網路向下走,匹配的數據將會越來越少。在網路的最底部是終端節點( terminal nodes )。在 Dr Forgy 的 1982 年的論文中,他描述了 4 種基本節點: root , 1-input, 2-input and terminal 。下圖是 Drools 中的 RETE 節點類型:

Figure 1. Rete Nodes
根節點( RootNode )是所有的對象進入網路的入口。然後,從根節點立即進入到 ObjectTypeNode 。 ObjectTypeNode 的作用是使引擎只做它需要做的事情。例如,我們有兩個對象集: Account 和 Order 。如果規則引擎需要對每個對象都進行一個周期的評估,那會浪費很多的時間。為了提高效率,引擎將只讓匹配 object type 的對象通過到達節點。通過這種方法,如果一個應用 assert 一個新的 account ,它不會將 Order 對象傳遞到節點中。很多現代 RETE 實現都有專門的 ObjectTypeNode 。在一些情況下, ObjectTypeNode 被用散列法進一步優化。

Figure 2 . ObjectTypeNodes
ObjectTypeNode 能夠傳播到 AlphaNodes, LeftInputAdapterNodes 和 BetaNodes 。
1-input 節點通常被稱為 AlphaNode 。 AlphaNodes 被用來評估字面條件( literal conditions )。雖然, 1982 年的論文只提到了相等條件(指的字面上相等),很多 RETE 實現支持其他的操作。例如, Account.name = = 「Mr Trout」 是一個字面條件。當一條規則對於一種 object type 有多條的字面條件,這些字面條件將被鏈接在一起。這是說,如果一個應用 assert 一個 account 對象,在它能到達下一個 AlphaNode 之前,它必須先滿足第一個字面條件。在 Dr. Forgy 的論文中,他用 IntraElement conditions 來表述。下面的圖說明了 Cheese 的 AlphaNode 組合( name = = 「cheddar」 , strength = = 「strong」 ):

Figure 3. AlphaNodes
Drools 通過散列法優化了從 ObjectTypeNode 到 AlphaNode 的傳播。每次一個 AlphaNode 被加到一個 ObjectTypeNode 的時候,就以字面值( literal value )作為 key ,以 AlphaNode 作為 value 加入 HashMap 。當一個新的實例進入 ObjectTypeNode 的時候,不用傳遞到每一個 AlphaNode ,它可以直接從 HashMap 中獲得正確的 AlphaNode ,避免了不必要的字面檢查。
<!--[if !supportEmptyParas]-->

2-input 節點通常被稱為 BetaNode 。 Drools 中有兩種 BetaNode : JoinNode 和 NotNode 。 BetaNodes 被用來對 2 個對象進行對比。這兩個對象可以是同種類型,也可以是不同類型。
我們約定 BetaNodes 的 2 個輸入稱為左邊( left )和右邊( right )。一個 BetaNode 的左邊輸入通常是 a list of objects 。在 Drools 中,這是一個數組。右邊輸入是 a single object 。兩個 NotNode 可以完成『 exists 』檢查。 Drools 通過將索引應用在 BetaNodes 上擴展了 RETE 演算法。下圖展示了一個 JoinNode 的使用:

Figure 4 . JoinNode

注意到圖中的左邊輸入用到了一個 LeftInputAdapterNode ,這個節點的作用是將一個 single Object 轉化為一個單對象數組( single Object Tuple ),傳播到 JoinNode 節點。因為我們上面提到過左邊輸入通常是 a list of objects 。
<!--[if !supportEmptyParas]-->
Terminal nodes 被用來表明一條規則已經匹配了它的所有條件( conditions )。 在這點,我們說這條規則有了一個完全匹配( full match )。在一些情況下,一條帶有「或」條件的規則可以有超過一個的 terminal node 。
Drools 通過節點的共享來提高規則引擎的性能。因為很多的規則可能存在部分相同的模式,節點的共享允許我們對內存中的節點數量進行壓縮,以提供遍歷節點的過程。下面的兩個規則就共享了部分節點:

這里我們先不探討這兩條 rule 到的是什麼意思,單從一個直觀的感覺,這兩條 rule 在它們的 LHS 中基本都是一樣的,只是最後的 favouriteCheese ,一條規則是等於 $cheddar ,而另一條規則是不等於 $cheddar 。下面是這兩條規則的節點圖:

Figure 5 . Node Sharing
從圖上可以看到,編譯後的 RETE 網路中, AlphaNode 是共享的,而 BetaNode 不是共享的。上面說的相等和不相等就體現在 BetaNode 的不同。然後這兩條規則有各自的 Terminal Node 。
<!--[if !supportEmptyParas]-->
RETE 演算法的第二個部分是運行時( runtime )。當一個應用 assert 一個對象,引擎將數據傳遞到 root node 。從那裡,它進入 ObjectTypeNode 並 沿著網路向下傳播。當數據匹配一個節點的條件,節點就將它記錄到相應的內存中。這樣做的原因有以下幾點:主要的原因是可以帶來更快的性能。雖然記住完全或 部分匹配的對象需要內存,它提供了速度和可伸縮性的特點。當一條規則的所有條件都滿足,這就是完全匹配。而只有部分條件滿足,就是部分匹配。(我覺得引擎 在每個節點都有其對應的內存來儲存滿足該節點條件的對象,這就造成了如果一個對象是完全匹配,那這個對象就會在每個節點的對應內存中都存有其映象。)
2. Leaps 演算法:
Proction systems 的 Leaps 演算法使用了一種「 lazy 」方法來評估條件( conditions )。一種 Leaps 演算法的修改版本的實現,作為 Drools v3 的一部分,嘗試結合 Leaps 和 RETE 方法的最好的特點來處理 Working Memory 中的 facts 。
古典的 Leaps 方法將所有的 asserted 的 facts ,按照其被 asserted 在 Working Memory 中的順序( FIFO ),放在主堆棧中。它一個個的檢查 facts ,通過迭代匹配 data type 的 facts 集合來找出每一個相關規則的匹配。當一個匹配的數據被發現時,系統記住此時的迭代位置以備待會的繼續迭代,並且激發規則結果( consequence )。當結果( consequence )執行完成以後,系統就會繼續處理處於主堆棧頂部的 fact 。如此反復。

rule
when
Cheese( $chedddar : name == " cheddar " )
$person : Person( favouriteCheese != $cheddar )
then
System.out.println( $person.getName() + " does likes cheddar " );
end

rule
when
Cheese( $chedddar : name == " cheddar " )
$person : Person( favouriteCheese == $cheddar )
then
System.out.println( $person.getName() + " likes cheddar " );
end

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/icefishchwd/archive/2007/01/22/1489668.aspx

熱點內容
取票人的密碼是什麼 發布:2024-05-20 08:21:43 瀏覽:962
天貓帳號密碼應輸入什麼 發布:2024-05-20 08:16:26 瀏覽:272
plsql異常處理 發布:2024-05-20 07:54:47 瀏覽:542
dreamweaver上傳網頁 發布:2024-05-20 07:51:24 瀏覽:462
拍攝車的分鏡頭腳本 發布:2024-05-20 07:50:15 瀏覽:137
mg名爵最高配置是哪個 發布:2024-05-20 07:45:11 瀏覽:376
輔助官網源碼 發布:2024-05-20 07:31:48 瀏覽:866
androidbutton的屬性 發布:2024-05-20 07:18:58 瀏覽:637
查找重復欄位的sql 發布:2024-05-20 07:18:17 瀏覽:303
我的世界創造房子伺服器 發布:2024-05-20 06:48:36 瀏覽:818