什麼是Drools Drools 是一個基於Charles Forgy
s的Rete算法的
專為Java語言所設計的規則引擎
Rete算法應用於面向對象的接口將使基於商業對象的商業規則的表達更為自然
Drools是用Java寫的
但能同時運行在Java和
Net上
Drools Drools 被設計為可插入式的語言實現
目前規則能用Java
Python和Groovy實現
更為重要的是
Drools提供了聲明式程序設計(Declarative Programming)
並且使用域描述語言(Domain Specific Languages (DSL))-專為你的問題域定義了某種模式的Xml
它已經足夠靈活到可以用來描述你的問題域
DSLs包含的XML元素(Element)和屬性(Attribute)代表了問題域中各種要素
這段時間企業級Java簡直能讓你睡著
有多少J
EE
EJB應用程序只是從網頁提取數據並把它們存入到數據庫中?但開發者真正應該開發和維護的卻是他們應用程序中復雜的商業邏輯
這個問題不僅僅適用於將要新應用
而且漸漸地
也適用於那些長期運行的商業核心應用
它們的內部邏輯也需要經常改變
而且往往要求在一個非常短的時間內
在以前的文章中
用Drools讓你的商業邏輯使用框架
我介紹了Drools框架
展示了它如何用來組織復雜的商業邏輯
Drool用一組簡單的
眾所周知的事物替換了許多纏雜的if…then表達式
如果你經歷過和商業客戶的會議
並為他們提出的想要實現的東西的復雜程度搞得頭痛
或許你應該考慮一下像Drools這樣的規則引擎了
這篇文章將向你展示如何在企業級Java應用中使用Drools
一路到底的框架 大多數開發者都有自己喜愛的框架
無特定順序
它們包括表現層框架(Struts
JSF
Cocoon和Spring)
持久化框架(JDO
Hibernate
Cayenne and Entity Beans)以及結構框架(EJB
又是Spring
Pico和Excalibur)
還有其它很多
每種框架都各有所長
給開發者提供子許多
即開即用
的功能
使用框架來部署應用意味著你避免了許多讓人厭煩的細節
讓你集中注意力到關鍵之處
到目前為直
在框架所能做的事中仍然有一個缺口
那就是商業邏輯沒有框架
像EJB和Spring這樣的工具雖好
但它們卻幾乎沒有提及怎麼組織你的那些if …then語句
把Drools加到你的開發工具箱中意味著現在你可以
一路到底
的使用框架來構建你的應用程序
圖
顯示了這樣的一個應用
圖 用於Java應用的框架 這篇文章將基於我們已經了解的Drools框架的功能
這些功能可以讓我們構建這樣的一個應用
]
我什麼時候應該使用規則引擎? 如果你有一把錘子
那所有的東西都看起來都像釘子
這句話在軟件工程領域幾乎成了陳詞濫調了
雖然規則引擎能解決我們的許多問題
但確實值得認真考慮一下規則引擎對我們的企業級Java應用是否合適
需要問的問題有
● 我的應用程序有多復雜?對於那些只是把數據從數據庫中傳入傳出
並不做更多事情的應用程序
最好不要使用規則引擎
但是
當在Java中有一定量的商業邏輯處理的話
可以考慮Drools的使用
這是因為很多應用隨著時間的推移越來越復雜
而Drools可以讓你輕松應對這一切
● 我的應用的生命周期有多久?這個問題的正確答案往往是
令人驚訝的長
――還記得那些認為他們的程序不會苟活到
年的大型機的程序員嗎?使用規則引擎將會在中長期得到好處
像這篇文章所展示的那樣
甚至原型都能從Drools與靈活方法的組合中獲益
讓
原型系統
轉化成生產系統
● 我的應用需要改變嗎?唯一能確定的是你的需求將會改變
無論是在開發過程中或是在開發完成以後
Drools使用一個或多個簡單易配的XML文件幫你來應對這一切
那麼性能呢? 如果你正在寫一個企業級應用
很有可能它會擴展到成百(如果不是成千)的用戶
你已經知道現有的Java和J
EE應用能做到這一點
但一個使用了Drools的應用對這一壓力的表現如何?答案是
令人吃驚的好
大多數開發者只是因為不願
失控
而依賴於他人的代碼(比如
某種框架)
想想這個
Drools不僅可以讓你的應用和
傳統
的編程方法一樣快
甚至可以更快
看下面
● 避免糟糕的代碼
Drools引導開發者去做
正確的事
你可以確定你正在寫的代碼是好的
但你的開發伙伴呢?你可以同樣這樣說嗎?使用框架可以讓你更輕松地寫出更快
更好的代碼
● 優化過的框架
你有多少次看見商業邏輯重復地從數據庫中提取相同的信息
從而降低了整個應用的速度?如果正確使用的話
Drools不僅僅能夠記住信息
而且還能記住以往使用該信息進行測試的結果
從而大幅提升應用的速度
● Rete算法
很多次我們並不是真正需要使用
if
條件
被Drools實現的Rete算法
可以用一個優化的方法替換掉所有的
if…then
表達式
需要重點提及的是
Rete算法在使用更多的內存來降低運行時延遲方面作了折衷
當然這在現代的應用服務器中並不是一個問題
我們也並不推薦你在移動手機上使用Drools!
我們到哪裡了? 在我們上一篇文章中
我們寫了一個基於Drools引擎的簡單的股票交易程序
我們實現了不同的商業規則
展示了我們可以如何迅速地改變規則去適應商業需求
並且JUnit測試給了我們高度自信可以確認系統確實是像我們設想的那樣運作的
但是這個應用幾乎沒有用戶介面
而且用硬編碼代替了數據庫
為了把我們的程序提升到企業級的水平
我們需要增加兩個主要的東西
● 某種用戶介面
最理想的是基於標准的Web表現層的框架
● 一個數據存取對象(DAO)讓Drools與數據庫(或其它後端)交互
從現有表現框架中實現規則引擎 大多數企業級Java應用是通過Web介面進行交互的
其中最被廣泛使用的Web表現層框架是Apache的Struts
理想的結果是
我們寫的應用可以從表現層知道它下面的應用層
而不是通過相反的方向
它的好處在於不僅僅可以使我們將來變換其它的表現層(比如Ajax或web service界面)
而且意味著示例代碼可以非常容易地應用於其它像Spring的框架
下面的代碼片斷演示了始何從Web表現層調用商業邏輯(通過規則引擎)
並根據返回結果顯示不同的頁面
這一例子中
我們使用了一個Struts行為
但其代碼是和使用其它表現層框架甚至一個Servlet或一個Jsp頁面是很類似的
這個片斷使用了struts
config
xml配置文件
JSP頁面來上傳/顯示數據
並且生成WAR文件來進行布署
片斷展示了怎樣把規則引擎和web框架集成使用
import javax
servlet
http
HttpServletRequest;import javax
servlet
http
HttpServletResponse;import org
apache
struts
action
Action;import org
apache
struts
action
ActionForm;import org
apache
struts
action
ActionForward;import org
apache
struts
action
ActionMapping;import BusinessLayer;/** * Sample Struts action with Pseudocode * 使用偽代碼的Struts行為示例 */public class SampleStrutsAction extends Action{ /** * Standard Struts doPerfom method * 標准的Struts doPerform方法 */ public ActionForward doPerform(
ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws InvalidEntryPointException {//Local Variables//本地變量
StockOffer userOffer =null;
//Get any previous values from the session//從session取得以前的數據
userOffer=(StockOffer)request
getSession()
getAttribute(
PREVIOUS_STOCK_OFFER
);
//create this object if it is null//如為null則創建新對象
if (null==userOffer){
userOffer = new StockOffer();
}//Update with the incoming values //用上送的數據更新//These values match those on the form
//這些數據是與form中的數據相對應的
userOffer
setStockName(request
getParameterValue(
STOCK_NAME
));
userOffer
setStockPrice(request
getParameterValue(
STOCK_PRICE
));
userOffer
setStockQuantity(request
getParameterValue(
STOCK_QTY
));
//Reset the output value//重置輸出數據
userOffer
setRecommendPurchase(null);//Call the Business Layer//調用商業層
BusinessLayer
evaluateStockPurchase(userOffer);
//Forward to the appropriate page //轉向合適的頁面
if (
YES
equals(
testOffer
getRecommendPurchase()){
return mapping
findForward(
YES_WEB_PAGE
);
} //otherwise default to the no page//否則指向無此頁面
return mapping
findForward(
NO_WEB_PAGE
); }}
這個例子包含了幾個東西
經常
我們需要的數據是用戶通過好幾個網頁傳來的
因此在這一例子中展示了通過session中的StockOffer對象來保存過去以來的數據
下一步
如果用戶改變了一些值
我們更新StockOffer對象
然後我們重置了rcommendPurchase標志用以在調用商業邏輯層之前清除以前的結果
最後我們使用商業邏輯層的返回來決定讓用戶轉向哪一頁面
在這一例子中
需要注意我們將商業邏輯(買或不買一支股票)與表現層邏輯(決定轉向哪一頁面)分離開來
這將使我們可以在不同的應用中重用我們的商
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26263.html