熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

在你的企業級java應用中使用Drools(圖)

2013-11-23 19:05:41  來源: Java核心技術 

  什麼是Drools
  
  Drools 是一個基於Charles Forgys的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簡直能讓你睡著有多少JEEEJB應用程序只是從網頁提取數據並把它們存入到數據庫中?但開發者真正應該開發和維護的卻是他們應用程序中復雜的商業邏輯這個問題不僅僅適用於將要新應用而且漸漸地也適用於那些長期運行的商業核心應用它們的內部邏輯也需要經常改變而且往往要求在一個非常短的時間內
  
  在以前的文章中用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和JEE應用能做到這一點但一個使用了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頁面是很類似的這個片斷使用了strutsconfigxml配置文件JSP頁面來上傳/顯示數據並且生成WAR文件來進行布署片斷展示了怎樣把規則引擎和web框架集成使用
  
  import javaxservlethttpHttpServletRequest;import javaxservlethttpHttpServletResponse;import orgapachestrutsactionAction;import orgapachestrutsactionActionForm;import orgapachestrutsactionActionForward;import orgapachestrutsactionActionMapping;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)requestgetSession()
  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中的數據相對應的
  userOffersetStockName(request
  getParameterValue(STOCK_NAME));
  userOffersetStockPrice(request
  getParameterValue(STOCK_PRICE));
  userOffersetStockQuantity(request
  getParameterValue(STOCK_QTY));
  //Reset the output value//重置輸出數據
  userOffersetRecommendPurchase(null);//Call the Business Layer//調用商業層
  BusinessLayer       evaluateStockPurchase(userOffer);
  //Forward to the appropriate page //轉向合適的頁面
  if (YESequals(
  testOffergetRecommendPurchase()){
  return mappingfindForward(YES_WEB_PAGE);
  } //otherwise default to the no page//否則指向無此頁面
  return mappingfindForward(NO_WEB_PAGE); }}
  
  這個例子包含了幾個東西經常我們需要的數據是用戶通過好幾個網頁傳來的因此在這一例子中展示了通過session中的StockOffer對象來保存過去以來的數據
  
  下一步如果用戶改變了一些值我們更新StockOffer對象然後我們重置了rcommendPurchase標志用以在調用商業邏輯層之前清除以前的結果最後我們使用商業邏輯層的返回來決定讓用戶轉向哪一頁面
  
  在這一例子中需要注意我們將商業邏輯(買或不買一支股票)與表現層邏輯(決定轉向哪一頁面)分離開來這將使我們可以在不同的應用中重用我們的商
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26263.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.