亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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被用來作為驅動工作流引擎的框架。然后,討論了生產部署選項?,F在,讓我們從工作流的設計模式和相關背景信息來介紹簡單工作流的思想吧。
  
  簡單工作流
  
  工作流模型是一個早在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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲少妇激情视频| 久久国产精品久久久久久| 91地址最新发布| 97精品久久久中文字幕免费| 91探花福利精品国产自产在线| 国产午夜精品视频免费不卡69堂| 午夜精品三级视频福利| 亚洲精品久久久久中文字幕欢迎你| 国产欧美精品在线| 国产精品久久久久久影视| 久久久这里只有精品视频| 国产亚洲精品一区二区| x99av成人免费| 国产精品日韩欧美综合| 欧美性黄网官网| 色综合视频一区中文字幕| 亚洲欧洲日产国产网站| 911国产网站尤物在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲国产精品一区二区三区| 精品视频在线播放色网色视频| 亚洲国产精品成人一区二区| 国产网站欧美日韩免费精品在线观看| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美日韩中文在线制服| 亚洲欧洲自拍偷拍| 成人免费看吃奶视频网站| 5278欧美一区二区三区| 精品伊人久久97| 9.1国产丝袜在线观看| 九九精品在线播放| 久久99久国产精品黄毛片入口| 91精品国产综合久久久久久久久| 久久香蕉国产线看观看av| 国产成人福利视频| 久久视频精品在线| 欧美重口另类videos人妖| 亚洲一区久久久| 欧美又大又硬又粗bbbbb| 亚洲精品456在线播放狼人| 亚洲成人在线视频播放| 国产69精品99久久久久久宅男| 日韩av在线免播放器| 97国产一区二区精品久久呦| 米奇精品一区二区三区在线观看| 亚洲无av在线中文字幕| 国产剧情日韩欧美| 日韩av高清不卡| 久久久久久久久国产精品| 国产一区二中文字幕在线看| 亚洲精品电影网在线观看| 亚洲最大成人免费视频| 亚洲黄色www| 亚洲国产精品99| 亚洲第一中文字幕| 97av在线播放| 亚洲美女免费精品视频在线观看| 亚洲自拍偷拍网址| 日韩av日韩在线观看| 亚洲成av人影院在线观看| 欧美成人亚洲成人| 亚洲欧美日韩国产精品| 久久视频在线直播| 播播国产欧美激情| 久久久精品久久久久| 精品露脸国产偷人在视频| 另类专区欧美制服同性| 日韩中文在线中文网三级| 国产小视频国产精品| 欧美做爰性生交视频| 久久久久久久久久久亚洲| 亚洲欧洲在线看| 亚洲精品一区av在线播放| 在线观看成人黄色| 久久精品在线播放| 一区二区三区视频在线| 国产精品露脸av在线| 成人欧美一区二区三区黑人孕妇| 国产视频久久久| 久久久久久亚洲精品不卡| 日韩美女中文字幕| 97热精品视频官网| 成人免费视频a| 91精品久久久久久久久久久| 国模叶桐国产精品一区| 青青在线视频一区二区三区| 国产精品入口夜色视频大尺度| 久久久亚洲国产天美传媒修理工| 国产午夜精品视频| 日韩麻豆第一页| www.欧美精品一二三区| 亚洲精品xxx| 国产色婷婷国产综合在线理论片a| 久久精品国产成人精品| 亚洲第一页自拍| 亚洲aⅴ日韩av电影在线观看| 91久久久亚洲精品| 精品美女永久免费视频| 日韩欧美在线中文字幕| 在线午夜精品自拍| 成人h视频在线观看播放| 狠狠色香婷婷久久亚洲精品| 欧洲亚洲女同hd| www国产精品视频| 欧美成人一二三| 97视频国产在线| 热久久免费国产视频| 亚洲无av在线中文字幕| 91欧美精品成人综合在线观看| 日韩福利在线播放| 日韩av色在线| 黄色成人在线免费| 久久大大胆人体| 亚洲国产精品电影| 日韩欧美在线中文字幕| 国产成人精品视频在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品国产三级国产aⅴ9色| 日韩在线视频免费观看高清中文| 成人免费xxxxx在线观看| 国外视频精品毛片| 日韩欧美在线视频| 日韩av一卡二卡| 精品国内产的精品视频在线观看| 国产精品看片资源| 国产精品第三页| 国产午夜精品麻豆| 国产精品情侣自拍| 亚洲精品国产综合区久久久久久久| 亚洲美女免费精品视频在线观看| 欧美激情一级精品国产| 欧美片一区二区三区| 国产精品影片在线观看| 欧美激情第6页| 欧美日韩精品在线| 国外成人在线视频| 91爱视频在线| 亚洲人成电影网站| 国产精品入口日韩视频大尺度| 国产69久久精品成人| 欧美在线观看网址综合| 久久久免费在线观看| 97视频在线观看播放| 视频在线观看一区二区| 91亚洲一区精品| 国产成人在线一区| 国产亚洲aⅴaaaaaa毛片| 在线观看欧美www| 亚洲人成在线播放| 青青草原成人在线视频| 欧美成人h版在线观看| 一区二区亚洲精品国产| 日韩视频―中文字幕| 精品国产视频在线| 久久精品人人爽| 亚洲韩国欧洲国产日产av| 精品久久国产精品| 粉嫩老牛aⅴ一区二区三区| 亚洲无av在线中文字幕| 国产精品18久久久久久麻辣| 狠狠做深爱婷婷久久综合一区| 国产z一区二区三区| 亚洲天堂成人在线视频| 久久免费精品日本久久中文字幕|