亚洲香蕉成人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
亚洲伦理中文字幕| 欧美精品激情在线| 欧美日本亚洲视频| 米奇精品一区二区三区在线观看| 高清欧美性猛交| 欧美一级淫片播放口| 欧美性猛交xxxx免费看漫画| 欧美一级黑人aaaaaaa做受| 国产亚洲欧洲在线| 亚洲电影第1页| 午夜精品一区二区三区在线| 亚洲无av在线中文字幕| 久久视频中文字幕| 4444欧美成人kkkk| 久久国产色av| 亚洲激情久久久| 欧美激情一区二区三区在线视频观看| 久久九九有精品国产23| 亚洲人成电影网站色xx| 亚洲精品美女免费| 国产99久久久欧美黑人| 成人免费看吃奶视频网站| 亚洲色图第三页| 中文字幕一精品亚洲无线一区| 国产精品视频久久久久| 97在线视频免费播放| 国产精品日韩欧美| 中文字幕久久亚洲| 91老司机在线| 91网站免费观看| 欧美一级淫片丝袜脚交| 国产精品视频精品视频| 久久久久久久网站| 亚洲视频axxx| 亚洲电影免费观看高清| 欧美日韩国产成人在线| 隔壁老王国产在线精品| 91精品久久久久久久久久久久久| 欧美—级高清免费播放| 欧美日韩国产限制| 色播久久人人爽人人爽人人片视av| 亚洲激情在线观看视频免费| 狠狠躁夜夜躁人人爽超碰91| 欧美高清一级大片| 日韩在线观看电影| 欧美在线激情网| 法国裸体一区二区| 久久久久久久久中文字幕| 日韩免费高清在线观看| 精品国产欧美一区二区三区成人| 精品国产91乱高清在线观看| 欧美视频免费在线| 日韩视频免费观看| 亚洲人成网站999久久久综合| 欧美激情影音先锋| 91免费看视频.| 自拍偷拍亚洲欧美| 日韩在线精品视频| 91av在线精品| 国产精品日韩久久久久| 夜夜嗨av色一区二区不卡| 国产成人涩涩涩视频在线观看| 成人乱色短篇合集| 中文字幕在线亚洲| 国产91免费观看| 精品成人乱色一区二区| 欧美精品久久久久久久久| 岛国视频午夜一区免费在线观看| 亚洲一区美女视频在线观看免费| 韩国一区二区电影| 91成人免费观看网站| 亚洲最新av在线| 国产香蕉97碰碰久久人人| 中文字幕在线观看亚洲| 亚洲www在线| 国产精品18久久久久久首页狼| 2018中文字幕一区二区三区| 日韩精品极品在线观看播放免费视频| 日韩精品视频在线| 中文字幕在线观看亚洲| 久久香蕉频线观| 一区三区二区视频| 国产成人精品视频| 久久偷看各类女兵18女厕嘘嘘| 国产精品啪视频| 亚洲人高潮女人毛茸茸| 久久久久久久久亚洲| 久久久久久12| 亚洲女人被黑人巨大进入| 亚洲a在线观看| 国产精品久久久久久亚洲影视| 川上优av一区二区线观看| 亚洲91av视频| 9.1国产丝袜在线观看| 久久精品国产91精品亚洲| 国产精品丝袜一区二区三区| 成人免费观看49www在线观看| 亚洲精品国产精品国产自| 亚洲网址你懂得| 欧美成人精品三级在线观看| 精品久久久久久久久久久久| 欧美亚洲国产日本| 亚洲视频免费一区| 日本久久久久久久久| 亚洲精品美女久久久久| 欧美天堂在线观看| 欧美日韩中国免费专区在线看| 亚洲国产精品久久久| 国产视频在线一区二区| 91精品在线观看视频| 国产91色在线| 亚洲精品国产精品自产a区红杏吧| 国产精品99久久久久久久久| 岛国av一区二区在线在线观看| 日韩成人在线视频网站| 神马久久久久久| 国产精品96久久久久久又黄又硬| 日韩在线观看你懂的| 亚洲视频免费一区| 日韩小视频网址| 日韩性生活视频| www国产亚洲精品久久网站| 欧美亚洲国产日本| 日本成人精品在线| 国产精品大陆在线观看| 亚洲男人的天堂在线播放| 动漫精品一区二区| 亚洲成人激情在线| 最新的欧美黄色| 在线免费观看羞羞视频一区二区| 日韩欧美在线视频日韩欧美在线视频| 亚洲精品动漫久久久久| 久久国产精品久久久久久久久久| 亚洲精品国产suv| 亚洲午夜小视频| 亚洲情综合五月天| 欧美疯狂xxxx大交乱88av| 亚洲美女黄色片| 91干在线观看| 欧美精品成人91久久久久久久| 少妇高潮久久77777| 国产免费亚洲高清| 亚洲护士老师的毛茸茸最新章节| 欧美xxxx18性欧美| 91精品国产综合久久男男| 5278欧美一区二区三区| 日韩国产精品亚洲а∨天堂免| 国产91色在线|| 亚洲天堂男人的天堂| 91成人国产在线观看| 国产精品久久久久久久久免费| 日韩精品视频在线| 日韩美女视频中文字幕| 国产视频综合在线| 欧美精品久久久久久久久久| 日韩欧美一区二区在线| 亚洲欧美色图片| 欧美视频中文字幕在线| 97国产真实伦对白精彩视频8| 亚洲嫩模很污视频| 亚洲国产欧美日韩精品| 亚洲国产成人久久| 国产精品成熟老女人| 久久久久久久999精品视频|