麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 13:00:14
字體:
來源:轉載
供稿:網友

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

  
圖 1順序工作流模式

  
  順序工作流是一個在J2EE中流行的標準工作流模式。J2EE應用程序在后臺線程中,通常需要一些順序發生的事件或者異步事件。圖2中的活動圖描述了一個簡單的工作流,用來通知感愛好的旅行者,他們感愛好的目的地的機票價格已經下降的事件。
  
 Spring創建一個簡單的工作流引擎(圖)(圖二)

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

  
  圖1中的航線工作流負責創建和發送動態的email通知。過程中的每一步表示了一個活動(activity)。在工作流處于活動之前,一些額外事件必須發生。在這個例子中,事件是飛行路線費率的減少。
  
  讓我們來簡要的看一下航線工作流的業務邏輯。假如第一個活動找不到對費率減少通知感愛好的用戶,那么整個工作流就被取消。假如發現了感愛好的用戶,那么接下來的活動繼續執行。隨后,一個XSL(擴展樣式表)轉換生成消息內容,之后,記錄審計信息 (audit information)。最后,工作流試圖通過SMTP服務器發送這個消息。假如這個任務沒有錯誤地完成,便在日志中記錄成功的信息,進程結束。但是,假如在和SMTP服務器通訊時發生了錯誤,一個非凡的錯誤處理例程將要治理這些錯誤。錯誤處理代碼將會試著去重新發送消息。
  
  考慮這個航線的例子,一個明顯的問題是:你怎么樣有效地將順序處理過程分解為單獨的活動?這個問題被spring巧妙的處理了。下面,讓我們快速地討論spring的反轉控制框架。
  
  控制反轉
  
  Spring通過使用spring容器來負責控制對象之間的依靠關系,使得我們不再對對象之間的依靠負責。 這種依靠關系的實現就是大家所知道的控制反轉(IoC)或依靠注射。參見Martin Fowler's "Inversion of Control Containers and the Dependency Injection Pattern"(martinfowler.com, 2004年2月)得到關于控制反轉和依靠注射的更加深入的討論。通過治理對象之間的依靠關系,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中得到)。由于是第5個活動,我們命名它為activity5。要發送消息,activity5就要求一個代理協作者和一個錯位處理句柄。
  
  <bean id="activity5"    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中檢索出像activity5活動這樣的spring bean。用一個假的SMTP代理SMTP服務器,就有可能單獨地測試activity5。
  
  第二個意外的結果,可重用能力是通過像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="activity1"/><!--Build recipients-->      <ref bean="activity2"/><!--ConstrUCt DOM tree-->      <ref bean="activity3"/><!--Apply XSL Transform-->      <ref bean="activity4"/><!--Write Audit Data-->      <ref bean="activity5"/><!--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類是一個對順序模式建模的具體子類。有5個活動被連接到工作流處理器,工作流處理器將順序執行這5個活動。
  
  與大多數過程式后臺進程相比,工作流的解決方案真正的突出了高度強壯的錯誤處理。錯誤處理句柄可以單獨地處理每個活動。這種類型的句柄在單一活動級別提供了細致的錯誤處理。假如沒有單獨處理單個活動的錯誤處理句柄,那么全局工作流處理器的錯誤處理句柄將會處理出現的問題。例如,假如在工作流處理過程中的任意時刻,一個沒有被處理的錯誤出現了,那么它將會向外傳播,被使用defaultErrorHandler屬性裝配的ErrorHandler Bean處理。
  
  更復雜的工作流框架將工作流轉換之間的狀態持久化存儲到數據庫中。在這篇文章中,我們僅僅對狀態轉換是自動完成的工作流感愛好。狀態信息僅僅在實際工作流運行時在ProcessContext中得到。在ProcessContext中,你僅僅能看到ProcessContext的接口的兩個方法:
  
  public interface ProcessContext extends Serializable {   public boolean stopProcess();     public void setSeedData(Object seedObject);  }
  
  用于航線例子工作流的具體的Proce

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久国产精品影视 | 九色新网址| 欧美14一15sex性hd | 精品一区二区三区中文字幕 | 国产精品久久久久网站 | 国产一区二区在线免费播放 | 男男啪羞羞视频网站 | 日本在线观看中文字幕 | 久久久久久久久久美女 | 久久美女色视频 | 日本免费一区二区三区四区 | 国产精品久久久久久久久粉嫩 | 一区二区三区手机在线观看 | 欧美日韩免费一区 | 欧美视频一区二区三区四区 | va视频| 一级一级一级毛片 | 国产一级做a爱片在线看免 2019天天干夜夜操 | 国产亚洲精品久久777777 | 鲁久久| 午夜精品福利影院 | 把娇妻调教成暴露狂 | 国产成人高清在线观看 | 色婷婷久久久亚洲一区二区三区 | 久久久久亚洲a | 国产韩国精品一区二区三区久久 | 中文字幕精品在线播放 | 狠狠干视频网站 | 大西瓜永久免费av在线 | 久草在线最新 | 91av久久| 久草成人在线观看 | 国产精品久久久久久久久粉嫩 | 久久久久久久亚洲视频 | 亚洲视频在线观看免费 | 最新中文字幕第一页视频 | 国产porn在线| 娇妻被各种姿势c到高潮小说 | 人人舔人人舔 | 毛片大全免费 | 免费国产人成网站 |