摘要 spring是支持控制反轉編程機制的一個相對新的框架
本文把spring作為簡單工作流引擎
將它用在了更加通用的地方
在對工作流簡單介紹之後
將要介紹在基本工作流場景中基於Spring的工作流API的使用
(
個英文單詞;
/
/
)
許多J
EE應用程序要求在一個和主機分離的上下文中執行處理過程
在許多情況下
這些後台的進程執行多個任務
一些任務依賴於以前任務的狀態
由於這些處理任務之間存在相互依賴的關系
使用一套基於過程的方法調用常常不能滿足要求
開發人員能夠利用Spring來容易地將後台進程分離成活動的集合
Spring容器連接這些活動
並將它們組織成簡單的工作流
在本文中
簡單工作流被定義成不需要用戶干預
以一定順序執行的任意活動的集合
然而
我們並不建議將這種方式代替存在的工作流框架
在一些場景中
需要更多的用戶交互
例如基於用戶輸入而進行的轉向
連接或傳輸
這時
比較好的方法是配用一個單獨的開源或者商業的工作流引擎
一個開源項目已經成功地將更復雜的工作流設計集成到spring中(參加OSWorkflow)
如果你手上的工作流任務是簡單的
那麼
與功能完備的獨立工作流框架相比
簡單工作流的策略就會變得有意義
特別地
如果已經使用了spring
這種快速實現可以保證時間不會變得更加漫長
此外
考慮到spring輕量級的控制反轉容器的特點
spring在資源負載上減少了資源負載
這篇文章簡短地從編程主題的角度介紹工作流
通過使用工作流的概念
spring被用來作為驅動工作流引擎的框架
然後
討論了生產部署選項
現在
讓我們從工作流的設計模式和相關背景信息來介紹簡單工作流的思想吧
簡單工作流 工作流模型是一個早在
年代就有人開始研究的主題
許多開發者都試圖創建工作流模型規范
W
H
M
van der Aalst等人寫了《工作流模型》白皮書(
年
月)
它成功地提煉出一組設計模式
這些設計模式准確地將大多數通用的工作流場景建模
當中
最普通的工作流模式是順序模式 (Sequence pattern)
順序工作流模式滿足了簡單工作流的設計原則
並且由一組順序執行的活動組成
UML(統一建模語言)活動圖通常被用來作為一個機制對工作流建模
圖
顯示了一個基本的使用標准UML活動圖對順序工作流過程的建模過程
圖 順序工作流模式 順序工作流是一個在J
EE中流行的標准工作流模式
J
EE應用程序在後台線程中
通常需要一些順序發生的事件或者異步事件
圖
中的活動圖描述了一個簡單的工作流
用來通知感興趣的旅行者
他們感興趣的目的地的機票價格已經下降的事件
圖 機票價格下降的簡單工作流 圖
中的航線工作流負責創建和發送動態的email通知
過程中的每一步表示了一個活動(activity)
在工作流處於活動之前
一些額外事件必須發生
在這個例子中
事件是飛行路線費率的減少
讓我們來簡要的看一下航線工作流的業務邏輯
如果第一個活動找不到對費率減少通知感興趣的用戶
那麼整個工作流就被取消
如果發現了感興趣的用戶
那麼接下來的活動繼續執行
隨後
一個XSL(擴展樣式表)轉換生成消息內容
之後
記錄審計信息 (audit information)
最後
工作流試圖通過SMTP服務器發送這個消息
如果這個任務沒有錯誤地完成
便在日志中記錄成功的信息
進程結束
但是
如果在和SMTP服務器通訊時發生了錯誤
一個特別的錯誤處理例程將要管理這些錯誤
錯誤處理代碼將會試著去重新發送消息
考慮這個航線的例子
一個明顯的問題是
你怎麼樣有效地將順序處理過程分解為單獨的活動?這個問題被spring巧妙的處理了
下面
讓我們快速地討論spring的反轉控制框架
控制反轉 Spring通過使用spring容器來負責控制對象之間的依賴關系
使得我們不再對對象之間的依賴負責
這種依賴關系的實現就是大家所知道的控制反轉(IoC)或依賴注射
參見Martin Fowler
s
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=
org
iocworkflow
test
sequence
ratedrop
SendMessage
> <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=
org
iocworkflow
SequenceProcessor
> <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>org
iocworkflow
test
sequence
ratedrop
RateDropContext</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