电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:94日期:2024-06-12 18:21:33
內容: 在你的企業級java應用中使用Drools作者:Paul Browne08/24/2005 翻譯:simmone版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明原文地址:http://www.onjava.com/pub/a/onjava/2005/08/24/drools.html中文地址:http://www.matrix.org.cn/resource/article/43/43782_Drools.html關鍵詞: Drools J2ee什么是Drools(譯者增加:什么是Drools, 摘自drools.org)Drools 是一個基于Charles Forgy's的Rete算法的,專為Java語言所設計的規則引擎。Rete算法應用于面向對象的接口將使基于商業對象的商業規則的表達更為自然。Drools是用Java寫的,但能同時運行在Java和.Net上。DroolsDrools 被設計為可插入式的語言實現。目前規則能用Java, Python和Groovy實現。更為重要的是,Drools提供了聲明式程序設計(Declarative Programming),并且使用域描述語言(Domain Specific Languages (DSL))-專為你的問題域定義了某種模式的Xml, 它已經足夠靈活到可以用來描述你的問題域。DSLs包含的XML元素(Element)和屬性(Attribute)代表了問題域中各種要素。(原文開始)這段時間企業級Java簡直能讓你睡著。有多少J2EE-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加到你的開發工具箱中意味著現在你可以“一路到底的使用框架來構建你的應用程序。圖1顯示了這樣的一個應用 圖1. 用于Java應用的框架這篇文章將基于我們已經了解的Drools框架的功能,這些功能可以讓我們構建這樣的一個應用。]我什么時候應該使用規則引擎?“如果你有一把錘子,那所有的東西都看起來都像釘子,這句話在軟件工程領域幾乎成了陳詞濫調了。雖然規則引擎能解決我們的許多問題,但確實值得認真考慮一下規則引擎對我們的企業級Java應用是否合適。需要問的問題有:● 我的應用程序有多復雜?對于那些只是把數據從數據庫中傳入傳出,并不做更多事情的應用程序,最好不要使用規則引擎。但是,當在Java中有一定量的商業邏輯處理的話,可以考慮Drools的使用。這是因為很多應用隨著時間的推移越來越復雜,而Drools可以讓你輕松應對這一切。● 我的應用的生命周期有多久?這個問題的正確答案往往是“令人驚訝的長――還記得那些認為他們的程序不會茍活到2000年的大型機的程序員嗎?使用規則引擎將會在中長期得到好處。像這篇文章所展示的那樣,甚至原型都能從Drools與靈活方法的組合中獲益,讓“原型系統轉化成生產系統。● 我的應用需要改變嗎?唯一能確定的是你的需求將會改變,無論是在開發過程中或是在開發完成以后。Drools使用一個或多個簡單易配的XML文件幫你來應對這一切。那么性能呢?如果你正在寫一個企業級應用,很有可能它會擴展到成百(如果不是成千)的用戶。你已經知道現有的Java和J2EE應用能做到這一點,但一個使用了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標志用以在調用商業邏輯層之前清除以前的結果。最后我們使用商業邏輯層的返回來決定讓用戶轉向哪一頁面。在這一例子中,需要注意我們將商業邏輯(買或不買一支股票)與表現層邏輯(決定轉向哪一頁面)分離開來。這將使我們可以在不同的應用中重用我們的商業規則。另外,看一下狀態信息(用戶已經告知我們的東西)是存儲在Session中的StockOffer對象中的,并沒有在商業層中。這樣就保證了商業層的無狀態性,這將使整個應用更具擴展性和性能。集成規則引擎與數據庫層到目前為止,我們的應用已經有一個web表現層和一個商業層的規則引擎,但還沒有方法與數據庫進行交互。這一節的例子將展示如何實現。我們的例子是基于數據訪問對象(DAO)模式的,它把所有與數據庫(或后端數據源)交互的代碼包裝在了一個可插入,可配置的類中。同樣的,這一例子一樣適用于其它持久性框 架,比如Hibernate和Cayenne。關于如何組織數據導有幾個要點:● 應該只有商業層與數據層交互。如果表現層(前端)需要一些數據,它首先應通過商業層。這將使我們的代碼更容易組織和閱讀。● 盡可能地,我們應讓我們的數據層無狀態-我們應該在其它的地方存放客戶端數據(比如:web前端的session,就像前面的例子)。這不同于我們可以在這一層做的數據緩存。兩者的區別在于狀態信息經常是用戶定義的,而我們在數據層緩存的數據應該是整個應用共享的。這樣的層次提升了性能。● 我們應該讓商業邏輯決定數據是否需要――如不需要,提取數據的調用就不應該執行。為了實現我們簡單的數據訪問對象,我們創建三個新對象:StockNameDao, DaoImplementation,和 DaoFactoryStockNameDao是一個定義了兩個方法的接口:getStockName()返回一個我們可以處理的股票名稱的列表,isOnStockList()檢查一個給定的股票是否在處理列表中。我們的商業層在需要這些信息時會調用這些方法。DaoImplementation是StockNameDao的一個實現。這里的數據是硬編碼的,但我們可以通過查詢數據庫或通過像Bloomberg這樣的web service提取信息。DaoFactory我們用來生成合適的StockNameDao實例。不直接創建對象而使用這一小驟的好處在于,它充許我們在運行時刻決定使用哪一個DAO實現(這是像Spring這樣的框架特別擅長的).一個factory(工廠)可以返回多種類型的DAO(比如:StockNameDao, StockPriceDao, StockHistoryDao),這意味著我們可以通過我們的DaoFactory,讓規則自己決定需要什么數據和DAO.這是StockNameDao接口:/** * Defines a Data Access Object - a non data * source specific way of obtaining data. * 定義一個數據存取對象-一種非數據源獲取數據的方法 */ public interface StockNameDao { /** * Get a list of stock names for the application * @return String[] array of stock names * 得到一個股票名字的列表 * 返回股票名稱的String[]數組 */ public String [] getStockNames(); /** * Check if our stock is on the list * 檢查股票是否在列表中 * @param stockName * @return */ public boolean isOnStockList(String stockName);}And here's the DaoImplementation:這是DaoImplementation:/** * Concrete Definition of a Data Access Object * 數據存取對象的具體定義 */ public class DaoImplementation implements StockNameDao { /** * Constructor with package level access only * to encourage use of factory method * 這里的構造器只是讓你使用工廠(factory)方法 */ DaoImplementation(){} /** * Get a list of stock names for the app. * This is a hard coded sample * normally we would get this from * a database or other datasource. * 得到一個股票名字的列表,這只是一個硬編碼的例子,一般來  * 說我們應該從數據庫或其它數據源取得數據 * @return String[] array of stock names */ public String[] getStockNames() { String[] stockNames= {'XYZ','ABC','MEGACORP','SOMEOTHERCOMPANY'}; return stockNames; } /** * Check if our stock is on the list * 檢查我們的股票是否在列表中 * @param stockName * @return true / false as appropriate */ public boolean isOnStockList(String stockName){ //Get our list of stocks //獲取股票列表 String stockList[] = getStockNames(); //Loop and see if our stock is on it// done this way for clarity . not speed!//循環看股票是否存在,這樣做是為了清晰不是速度! for (int a=0; a
標簽: Java
相關文章:
主站蜘蛛池模板: 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 江西自考网-江西自学考试网| 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 江西自考网 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 鲁网 - 山东省重点新闻网站,山东第一财经门户 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 礼堂椅厂家|佛山市艺典家具有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 客服外包专业服务商_客服外包中心_网萌科技 | 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 |