來源:https://www.cnblogs.com/caosenianhuan/p/WF.htmlhtml
最近公司要從新上線一套新的CRM系統,要重整老系統裏的業務流模塊,團隊討論已微軟的workflow做爲技術基礎。本人以前沒有涉及過相關的知識,目前項目還沒開始,前期來系統的的學習和了解下WF爲後期開發打下些技術基礎。該篇爲開題片,作一些簡單那的介紹和入門。數據庫
從WinFX到NET3.x再到NET4.0 ,WPF,WCF,WF 始終是放在一塊兒的,WPF(silverlight)用於程序UI的展示,WCF用於程序通訊,WF用於程序的邏輯控制,這種思想在微軟提出WinFX到如今的NET3.x再到NET4.0都是十分明確的. WPF(silverlight)與WCF如今已被你們熟知,並已普遍使用.但關注WF的人卻還不是不少。安全
WorkFlow是最近比較流行的一門技術,其實WF起源於20世紀70年代中期的辦公化自動領域,自1993年8月,WFMC(工做流管理聯盟)成立,1994年制定了一系列的關於工做流的標準。進入21世紀工做流被愈來愈多的學者關注,該項技術愈加走向成熟。固然我也是必須跟上時代的步伐,因此也加入工做流的大軍,但願可以跟上前人的腳步。架構
WF的全稱是Windows Workflow Foundation ,分佈式
最先接觸WF是在2004年的時候,那時微軟推出了一個CTP版的開發包,WinFX.工具
在WinFX中提供了三個內容: Avalon, Indigo, WinOE當時這三方面的內容我都有涉及學習
與微軟不少的技術同樣,WinFX在Bata2後就沒有後續了.然而幸運的是個人此次長達一年的技術投入並無浪費,WinFX在2006年以Net 3.0 的方式正式發佈了(其實就算WinFX沒有下文,我也沒有什麼遺憾,在學習WinFX的日子裏,我理解了不少全新的設計思想)測試
在NET 3.0 中,操作系統
Avalon成爲了Windows Presentation Foundation 簡稱爲WPF架構設計
Indigo成爲了 Windows Communication Foundation 簡稱爲WCF
WinOE 成爲了 Windows Workflow Foundation 簡稱爲WWF
後來, 微軟基於WPF推出了WFP/E, WFP/E就是silverlight的前身.
WPF,WCF,WWF從一開始就是綁在一塊兒的,爲何WWF如今叫WF,少了一個"W",那是由於WWF與另外一個縮寫重名了 World Wild Fund for Nature"世界天然基金會"
世界天然基金會
那麼WF究竟是什麼,在這裏我先不作具體介紹,但WF絕對不是傳統"工做流"層面的東西.
從WinFX到NET3.x再到NET4.0 ,WPF,WCF,WF 始終是放在一塊兒的,
WPF(silverlight)用於程序UI的展示,WCF用於程序通訊,WF用於程序的邏輯控制,這種思想在微軟提出WinFX到如今的NET3.x再到NET4.0都是十分明確的.
WPF(silverlight)與WCF如今已被你們熟知,並已普遍使用.但關注WF的人卻還不是不少.
1、工做流簡介
2、工做流的參考模型
3、工做流管理系統
4、工做流管理系統架構
5、工做流目前的現狀
6、第一個工做流實例
工做流的英文單詞是workflow,猶如大多數計算機領域的術語同樣,也是個合成詞,是英文單詞work和英文單詞flow的組合。Work翻譯爲任務、工做等,flow則 翻譯爲流程、流動等。Flow反映的是一種事物的動態屬性或變化過程,例如水的流動被稱爲水流,空氣的流動被稱爲氣流,還有物料流、資金流等,在抽象領域還有信息流、控制流等,所以,使用任務、活動以及活動之間的變化過程表示業務流程就被稱爲工做流。
工做流尚沒有一個統一的、明確的定義,不一樣的組織和研究人員對工做流給出了各自的定義:
- 定義1:工做流是一類可以徹底或者部分自動執行的經營過程,它根據一系列過程規則,文檔、信息或任務可以在不一樣的執行者之間進行傳遞與執行。
- 定義2:工做流是將一組任務組織起來完成某個經營過程。在工做流中定義了任務的觸發順序和觸發條件。每一個任務能夠由一個或多個軟件系統完成,也能夠由一個或一組人完成,還能夠是由一個或多我的與軟件系統協做完成。任務的觸發順序和觸發條件用來定義並實現任務的觸發、任務的同步和信息流(數據流)的傳遞。
- 定義3:工做流是一個用來實施經營過程實踐的機制。
- 定義4:工做流是經營過程的一種計算機化的表示模型,定義了完成整個過程所須要的各類參數。這些參數包括對過程當中每個步驟的定義、步驟間的執行順序、條件以及數據流的創建、每一步驟由誰負責以及每一個活動所須要的應用程序。
以上這些工做流的定義,雖然在表述方式上有所不一樣,可是基本上說明了這樣一個問題,即工做流是經營過程的一個計算機實現。使用工做流做爲經營過程的實現技術首先要求工做流系統可以反映經營過程的以下幾個方面問題:
- 1. 經營過程是什麼,即由哪些活動、任務組成,也就是結構上的定義;
- 2. 怎麼作,即活動間的執行條件、規則以及所交互的信息,也就是控制流與信息流的定義;
- 3. 由誰來作,即人或者計算機應用程序,也就是組織角色的定義;
- 4. 作得怎樣,即經過工做流管理系統對執行過程進行監控。
WFMC在工做流的相關規範和標準方面作出的主要貢獻之一就是提出了一個工做流參考模型(Workflow Reference Model)。工做流參考模型來源於對普通工做流程序結構的分析,肯定結構中的接口,這些接口可使不一樣產品在不一樣的結構層次上協同工做。全部工做流系統都包含一系列的公共組件,組件間採用一套被定義好的方法進行協做;不一樣的產品在這些公共的組件中,會表現出不一樣的處理能力。爲了實現不一樣工做流產品間的協同工做,須要在這些組件間制定一套標準的接口和數據交換格式。經過實現這些標準接口,能夠達到產品間的協同工做。
咱們先來看看下圖,看看WFMC的參考模型:
下面咱們來挨個解釋下每一個接口的具體做用吧:
一、接口1:
在建模或定義工具與運行時期工做流管理軟件間的接口。
二、接口2:
該接口,提供客戶端應用程序與工做流引擎之間的通訊API 。
三、接口3:
該接口是工做流引擎與其餘應用程序之間通訊的API。
四、接口4:
經過工做流與工做流之間的通訊API,是實現分佈式工做流管理系統的核心API。
五、接口5:
該工具提供了對工做流引擎的當前狀態及運行在該引擎下的實例的監管和管理的接口。
咱們再來看看上面相關工具的做用吧:
流程定義工具 :
就是提供一種方便的使用的,而且可以被計算機識別的過程定義,目前咱們使用較普遍的是經過圖形化的工具來完成WF的過程定義。最後輸出一個XPDL文件。XPDL(XML Process Definition Language)是由Workflow Management Coalition所提出的一個標準化規格,使用XML文件讓不一樣的工做流程軟件可以交換商業流程定義。
管理監控工具:
對工做流在整個組織內的流程狀況進行監控,並提供一系列管理功能,實現安全性、過程控制、受權等操做。典型的功能範圍包括用戶管理、角色管理、監控管理、資源管理、過程監控管理。具體如:過程模型的實例化,啓動、掛起、恢復、終止過程實例;管理正在執行的過程實例等。
工做流執行服務:
由一個或多個工做流引擎組成,提供過程實例的執行,爲活動進行導航,與外界資源交互完成各項活動,維護控制數據和相關數據等功能。
下圖是工做流服務的整個流程:
工做流管理系統——Workflow Management System(簡稱WFMS),在工做流定義基礎上,具備以下定義。
定義1:工做流管理系統是一個軟件系統,它完成工做流的定義和管理,並按照在計算機中預先定義好的工做流邏輯推動工做流實例的執行。
定義2:工做流管理系統是支持企業經營過程高效執行並監控其執行過程的計算機軟件系統。
根據工做流管理系統的定義,一個工做流管理系統應該提供以下的功能:
1. 定義、實現和管理工做流的運行;
2. 與工做流執行者,即人或應用系統,進行交互;
3. 推動工做流實例的執行;
4.監控工做流的運行狀態。
須要指出的是,工做流管理系統不是企業的業務系統。在很大程度上,工做流管理系統爲企業的業務系統運行提供了一個軟件支撐環境,很是相似於在單個計算機上的操做系統。只不過工做流管理系統支撐的範圍比較大、環境比較複雜而以,因此也有人稱工做流管理系統是業務操做系統。
WFMC提出的工做流管理系統產品架構。這個架構給出了抽象的工做流管理系統的功能組成部件和接口,它可以知足工做流管理系統和產品應該具備的主要功能,可爲實現工做流產品之間的互操做提供公共的基礎。從圖中能夠看出,工做流管理系統主要由三部分組成:
上圖也是WFMC提出的工做流管理系統的架構設計圖。咱們這裏來解釋下幾個重要組件的做用吧:
軟件構件:完成工做流管理系統不一樣組成部分功能的實現,包括過程建模工具,工做流引擎,任務表管理器和用戶界面;
系統控制數據:工做流管理系統中的一個或多個軟件構件使用的數據,包括過程定義,組織/角色模型數據,工做流控制數據,工做流相關數據,任務表;
應用與應用數據:對於工做流管理系統來講,它們不是工做流管理系統的組成部分,而是屬於外部系統和數據,它們被工做流管理系統調用來完成整個或部分工做流管理的功能,如被工做流管理系統調用的外部應用以及這些應用操做的數據。
咱們先來看看目前不少的自動化辦公的流程:
經過上面的圖片,可能看不太清楚,我也沒有重新畫一張清晰的,因此你們先湊合着看下,而後後面我再補上,上面能夠看到不一樣角色的人,負責在工做流中的狀態及行爲是不一樣的。上面中強調說明了工做職責的分配性問題。
工做流的概念起源於生產組織和辦公自動化領域,提出的目的是經過將工做分解成定義良好的任務、角色,按照必定的規則和過程來執行這些任務並對它們進行監控,達到提升工做效率、下降生產成本、提升企業生產經營管理水平和企業競爭力的目標。
衆多的企業應用系統按照功能從大的範圍來劃分,無非兩種,一種是以公文流轉、平常辦公爲主體的辦公自動化系統,另外一種則是以企業經營過程的業務流程爲主要輔助對象的具體業務系統。不管是辦公自動化系統仍是具體業務系統,都是爲企業提供軟件服務的,都是本着服務於企業需求爲目標的,然而,現實世界中的各個企業的經營過程是無時無刻不在變化和調整中的,以便適應瞬息萬變的市場。這種變動帶給信息化系統軟件的最大的問題在於企業經營過程的調整每每使得原有的信息化系統軟件要推倒從新設計開發,使開發成本很是的高,尋找到一種可以相對靈活的架構和管理方式以使得信息化系統可以快速的適應企業經營過程的變動成爲了爲企業構造信息化系統的軟件設計人員的頭等課題。工做流及工做流管理系統之因此能爲企業信息化系統所使用究其緣由也在於此。雖然工做流技術已經開始在企業應用中擁有了一片天空,然而,同已經應用於企業的其餘技術相比,工做流技術仍然處於其技術發展的初期。
下圖顯示了,工做流與RDBMS系統之間的發展曲線對比圖:
固然從上圖中,咱們看到WF處於提出並初始發展階段,而數據庫管理系統已經很是的成熟併產品化。
下面咱們開始進入WF的開發之旅吧,好像廢話的篇幅比較多,但願你們不要不喜歡看呵呵,下面咱們就來開始開發吧來完成咱們的WF開發之旅的第一個程序demo。
一、新建一個狀態機工做流或者順序工做流控制檯應用程序:
二、輸入項目名稱後:
三、設計WorkFlow中的相關狀態節點。主設計頁面以下:
四、新建State節點,在左側的工具欄中找到以下節點,而後拖拽到設計器中:
五、設計狀態流程中的起始狀態節點以及完成狀態節點,畢竟工做流的狀態必須有開始和結束的,對於狀態機來講是必須的。
六、當咱們添加了State以後,咱們如今來設置狀態的跳轉及路程。拖拽一個新的節點到設計器中:
七、設置該狀態節點的跳轉及其餘行爲等:
八、依照上圖中的順序,給第一個初始化開始狀態也添加一樣的事件,來完成跳轉。後臺的代碼以下:
九、運行後的效果以下:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.打開VS2010 ,[File] -> [New] -> [Project]
2.在出現的[New Project]對話框的[Installed Templates]樹上選[Workflow],在出現的模板列表框中選[Workflow Console Application]項
在[Name]框中輸入[helloWorkflow],點擊[OK]進入WF4.0項目的設計界面
按[F5]運行程,會看到以下結果
本例子包括兩部分,用於描述流程結構的一個XAML文件與調用流程的宿主程序
WF4.0 的流程結構描述文件是一個XML格式的文件,其格式以下
(關於WF4.0的XAML文件格式,會在之後的文章中作具體介紹,在這裏作一個基本說明)
<Activity x:Class="helloWorkflow.Workflow1" .... > <WriteLine Text="hello wxwinter " .... /> </Activity> |
WF4.0的流程是由一組[活動]組成的,當流程運行時,流程內的[活動]按必定的規則依次執行
其中<Activity> </Activity> 是這個流程的根[活動]
<WriteLine /> 是WF4.0 的一個自帶的一個[活動],其功能就是在屏幕打印[Text屬性]的內容
x:Class="helloWorkflow.Workflow1" 則是將XOML文件編譯成NET類時所對應的類名
在使用[Workflow Console Application]模板建立時,會自動建立一個用於測試流程的控制檯宿主程序,內容以下
class Program { static void Main(string[] args) { WorkflowInvoker.Invoke(new Workflow1()); } } |
其中,[ WorkflowInvoker]是一個用於調用工做流的功能類,可使用該類的[Invoke 靜態方法]調用流程.在本例中[Invoke(new Workflow1())]所使用的類就是XOML文件中 x:Class="helloWorkflow.Workflow1" 所定義的類名
class Program { static void Main(string[] args) { WorkflowInvoker.Invoke(codeCreateWorkflow()); }
// 代碼方式建立WF4.0工做流 static Activity codeCreateWorkflow() { WriteLine writeLineActivity = new WriteLine() { Text = "hello wxwinter" };
Sequence wxwinterWorkflow = new Sequence();
wxwinterWorkflow.Activities.Add(writeLineActivity);
return wxwinterWorkflow; } } |
按[F5]運行程,會看到以下結果