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

Spring創建一個簡單的工作流引擎(圖)

2013-11-23 20:16:09  來源: Java開源技術 

  摘要
  
  spring是支持控制反轉編程機制的一個相對新的框架本文把spring作為簡單工作流引擎將它用在了更加通用的地方在對工作流簡單介紹之後將要介紹在基本工作流場景中基於Spring的工作流API的使用(個英文單詞; //)
  
  許多JEE應用程序要求在一個和主機分離的上下文中執行處理過程在許多情況下這些後台的進程執行多個任務一些任務依賴於以前任務的狀態由於這些處理任務之間存在相互依賴的關系使用一套基於過程的方法調用常常不能滿足要求開發人員能夠利用Spring來容易地將後台進程分離成活動的集合Spring容器連接這些活動並將它們組織成簡單的工作流
  
  在本文中簡單工作流被定義成不需要用戶干預以一定順序執行的任意活動的集合然而我們並不建議將這種方式代替存在的工作流框架在一些場景中需要更多的用戶交互例如基於用戶輸入而進行的轉向連接或傳輸這時比較好的方法是配用一個單獨的開源或者商業的工作流引擎一個開源項目已經成功地將更復雜的工作流設計集成到spring中(參加OSWorkflow)
  
  如果你手上的工作流任務是簡單的那麼與功能完備的獨立工作流框架相比簡單工作流的策略就會變得有意義特別地如果已經使用了spring這種快速實現可以保證時間不會變得更加漫長此外考慮到spring輕量級的控制反轉容器的特點spring在資源負載上減少了資源負載
  
  這篇文章簡短地從編程主題的角度介紹工作流通過使用工作流的概念spring被用來作為驅動工作流引擎的框架然後討論了生產部署選項現在讓我們從工作流的設計模式和相關背景信息來介紹簡單工作流的思想吧
  
  簡單工作流
  
  工作流模型是一個早在年代就有人開始研究的主題許多開發者都試圖創建工作流模型規范WHM van der Aalst等人寫了《工作流模型》白皮書(月)它成功地提煉出一組設計模式這些設計模式准確地將大多數通用的工作流場景建模當中最普通的工作流模式是順序模式 (Sequence pattern)順序工作流模式滿足了簡單工作流的設計原則並且由一組順序執行的活動組成
  
  UML(統一建模語言)活動圖通常被用來作為一個機制對工作流建模顯示了一個基本的使用標准UML活動圖對順序工作流過程的建模過程
  
 

  
順序工作流模式

  
  順序工作流是一個在JEE中流行的標准工作流模式JEE應用程序在後台線程中通常需要一些順序發生的事件或者異步事件中的活動圖描述了一個簡單的工作流用來通知感興趣的旅行者他們感興趣的目的地的機票價格已經下降的事件
  
 

  
機票價格下降的簡單工作流

  
  圖中的航線工作流負責創建和發送動態的email通知過程中的每一步表示了一個活動(activity)在工作流處於活動之前一些額外事件必須發生在這個例子中事件是飛行路線費率的減少
  
  讓我們來簡要的看一下航線工作流的業務邏輯如果第一個活動找不到對費率減少通知感興趣的用戶那麼整個工作流就被取消如果發現了感興趣的用戶那麼接下來的活動繼續執行隨後一個XSL(擴展樣式表)轉換生成消息內容之後記錄審計信息 (audit information)最後工作流試圖通過SMTP服務器發送這個消息如果這個任務沒有錯誤地完成便在日志中記錄成功的信息進程結束但是如果在和SMTP服務器通訊時發生了錯誤一個特別的錯誤處理例程將要管理這些錯誤錯誤處理代碼將會試著去重新發送消息
  
  考慮這個航線的例子一個明顯的問題是你怎麼樣有效地將順序處理過程分解為單獨的活動?這個問題被spring巧妙的處理了下面讓我們快速地討論spring的反轉控制框架
  
  控制反轉
  
  Spring通過使用spring容器來負責控制對象之間的依賴關系使得我們不再對對象之間的依賴負責 這種依賴關系的實現就是大家所知道的控制反轉(IoC)或依賴注射參見Martin Fowlers Inversion of Control Containers and the Dependency Injection Pattern( 月)得到關於控制反轉和依賴注射的更加深入的討論通過管理對象之間的依賴關系spring就不需要那些只是為了使類能夠相互協作而將對象粘合的代碼
  
  作為spring beans的工作流組件
  
  在進一步討論之前現在是簡要介紹spring中主要概念的恰當時候接口ApplicationContext是從接口BeanFactory繼承的它被用來作為在spring容器內實際的控制實體和容器
  
  ApplicationContext負責對一組作為spring beans的一組bean的初始化配置和生命期管理我們通過裝配在一個基於XML的配置文件中的spring beans來配置ApplicationContext這個配置文件說明了spring beans互相協作的本質特點這樣用spring的術語來說與其他spring beans交互的spring beans就被叫著協作者(collaborators)缺省情況下spring beans是作為單例存在於ApplicationContext中的但是單例的屬性能夠被設置為false從而有效地改變他們在spring中調用原型模式時的行為
  
  回到我們的例子在飛機票價下降的時候一個SMTP發送例程的抽象就被裝配在工作流過程例子中的最後的活動(例子代碼可以在 Resources中得到)由於是第個活動我們命名它為activity要發送消息activity就要求一個代理協作者和一個錯位處理句柄
  
  <bean id=activity    class=orgiocworkflowtestsequenceratedropSendMessage>   <property name=delegate>     <ref bean=smtpSenderDelegate></ref>   </property>   <property name=errorHandler>     <ref bean=mailErrorHandler/>   </property>  </bean>
  
  將工作流組件實施成spring beans產生了兩個令人喜悅的結果就是容易進行單元測試和很大程度上可重用能力IoC容器的特點明顯地提供了有效的單元測試使用像spring這樣的Ioc容器在測試期間協作者之間的依賴能夠容易的用假的替代者替代在這個航線的例子中能夠容易地從唯一的測試ApplicationContext中檢索出像activity活動這樣的spring bean用一個假的SMTP代理SMTP服務器就有可能單獨地測試activity
  
  第二個意外的結果可重用能力是通過像XSL轉換這樣的工作流活動實現的一個被抽象成工作流活動的XSL轉換現在能夠被任何處理XSL轉換的工作流所重用
  
  裝配工作流
  
  在提供的API中(從Resources下載)spring控制了一些操作者以一種工作流的方式交互關鍵接口如下
  
  Activity: 封裝了工作流中一個單步業務邏輯
  ProcessContext:在工作流活動之間傳遞具有ProcessContext類型的對象實現了這個接口的對象負責維護對象在工作流轉換中從一個活動轉換到另一個活動的狀態
  ErrorHandler: 提供錯誤處理的回調方法
  Processor: 描述一個作為主工作流線程的執行者的bean
  
  下面從例子源碼中摘錄的代碼是將航線例子裝配為簡單工作流過程的spring bean的配置
  
  <! Airline rate drop as a simple sequence workflow process >  <bean id=rateDropProcessor class=orgiocworkflowSequenceProcessor >   <property name=activities>     <list>      <ref bean=activity/><!Build recipients>      <ref bean=activity/><!Construct DOM tree>      <ref bean=activity/><!Apply XSL Transform>      <ref bean=activity/><!Write Audit Data>      <ref bean=activity/><!Attempt to send message>     </list>   </property>   <property name=defaultErrorHandler>     <ref bean=defaultErrorHandler></ref>   /property>   <property name=processContextClass>     <value>orgiocworkflowtestsequenceratedropRateDropContext</value>   </property>  </bean>
  
  SequenceProcessor類是一個對順序模式建模的具體子類個活動被連接到工作流處理器工作流處理器將順序執行這個活動
  
  與大多數過程式後台進程相比工作流的解決方案真正的突出了高度強壯的錯誤處理錯誤處理句柄可以單獨地處理每個活動這種類型的句柄在單一活動級別提供了細致的錯誤處理如果沒有單獨處理單個活動的錯誤處理句柄那麼全局工作流處理器的錯誤處理句柄將會處理出現的問題例如如果在工作流處理過程中的任意時刻一個沒有被處理的錯誤出現了那麼它將會向外傳播被使用defaultErrorHandler屬性裝配的ErrorHandler Bean處理
  
  更復雜的工作流框架將工作流轉換之間的狀態持久化存儲到數據庫中在這篇文章中我們僅僅對狀態轉換是自動完成的工作流感興趣狀態信息僅僅在實際工作流運行時在ProcessContext中得到在ProcessContext中你僅僅能看到ProcessContext的接口的兩個方法
  
  public interface ProcessContext extends Serializable {   public boolean stopProcess();     public void setSeedData(Object seedObject);  }
  
  用於航線例子工作流的具體的Proce
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28207.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.