下面將對目前比較主流的三款工做流進行介紹和比較,而後經過三款流程引擎分別設計一個較典型的流程來給你們分別演示這三款建立流程的過程.這三款工做流程引擎分別是 Windows Workflow Foundation,NetBPM, CCFlow.程序員
NetBPM 與 CCFlow 是兩款國內知名的開源軟件,尤爲是ccflow在國內的發展勢頭強勁。web
這個典型的流程假設:公司有兩級領導,一級爲主管Chief,一級爲老闆Boss數據庫
場景描述:windows
在某公司中,部門員工休假須要主管Chief的批准。
若是休假天數大於10天,則 在部門主管贊成後,還必須老闆Boss批准。
若是是部門主管請假則直接提交老闆批准。
在休假被批准以前,申請人能夠撤銷休假申請。
申請批准後,對休假天數進行修改(也能夠是其餘業務數據處理)。 每次休假申請結束之 後,無論經過未經過或是否取消,都必須記錄下來。
流程結束時,系統要把請假的結果信息Email給申請人。框架
對於大於10天的申請,若是部門主管已批准贊成而上級主管還未批准,這時申請人撤銷申請後,系統應發Email通知部門主管申請已撤銷。ide
咱們這裏只是一個模擬,固然現實生活中狀況比這個更加複雜一些;工具
Windows Workflow Foundation優化
微軟的工做流產品,提供一套工做流引擎和VS解決方案自帶的流程設計器,可是該流程設計器面對的是程序員而非業務人員,因此界面比較專業,流程運行只能建立控制檯應用程序,沒有流程運行界面,沒有表單庫,如須要表單和界面須要二次開發。ui
使用WWF建立流程:編碼
1. 啓動VS2010,建立一個順序工做流控制檯的程序。
2. 輸入項目名稱,點擊肯定,將自動進入流程設計界面。
3. 自動生成的Workflow1.cs是一個工做流組件。
4. 工具箱中拖放一個IfElse活動組件到設計界面上。
5. 此時就須要較多的編碼工做和表單界面設計工做,如在idelseBranchActivitiy1左側分支,用以判斷請假人是否新申請請假仍是取消請假,激活Conditiong屬性,而且添加內部事件EvaluateQingJiaNoValidCode,並激活,在內部輸入邏輯代碼根據數據庫記錄判斷請假是否經過,未經過則取消請假。也能夠走另外一分支EvaluateQingJiaCode繼續申請新的請假;
6. 拖放parallelActivity1組件在IfElse節點後,用以判斷請假人是否爲Chief,設置sequenceActivity1中的codeActivity3屬性的ExecuteCode處理程序爲EvaluateChiefNoValidCode,並激活,內部代碼用以判斷不是Chief的狀況,另外一分支sequenceActivity1中則判斷是Chief的狀況;
7.若是不是Chief請假,則須要在EvaluateChiefNoValidCode中進行邏輯判斷和表單的設計,填寫請假申請單, 並拖放IfElse組件,實現其中的codeActivity6代碼用以判斷大於10天的狀況。
8.F5便可運行控制檯程序,其中的經過未經過或是否取消的數據須要記錄,須要經過代碼和設計數據庫來實現,發送Email也須要代碼實現,WWF沒有提供該功能。
WWF下設計的流程圖以下:
NetBPM
從JBpm1移植到.NET平臺下的開源工做流項目,二次開發有必定的難度,由於其使用的Castle框架有不少子項目,技術點較多,須要一一熟悉後才能進行流程的二次開發。
使用NetBPM建立工做流過程:
1. 使用NetBPM的難點之一是要理解生成配置文件,提交請假單配置以下:
<?xml version="1.0"?> <!-- NOTE:在定義流程時,建議先畫出流程圖,而後再來定義,這樣思惟清晰,也不易於出錯 關於processdefiniton.xml如何定義,請嚴格按照nPdl規定 --> <process-definition> <!-- =================================== --> <!-- == PROCESS DEFINITION PROPERTIES == --> <!-- =================================== --> <name>請假DEMO</name> <description>該流程模擬公司的請假流程, </description> <responsible>ae</responsible> <!-- ====================== --> <!-- == START & ENDSTATE == --> <!-- ====================== --> <start-state name="start leave request"> <description>提交請假單</description> <!-- 定義了role,引擎在該start-state節點執行時,就會把執行者信息賦值給角色對應的屬性「requester」 --> <role>requester</role> <!-- 在這裏定義start-state的field,它表示該filed相關聯的屬性,而且在該state,它對屬性的訪問權利。 若是須要定義其在web表單上的操做界面,如何進行web表單顯示等,須要在webinterface.xml文件對應節點補充該field --> <field attribute="start date" access="write-only-required" /> <field attribute="end date" access="write-only-required" /> <field attribute="leave days" access="write-only-required" /> <field attribute="comment" access="write-only" /> <transition to="Is Cancel Fork" /> </start-state> <!-- 結束節點除名稱外不要定義其餘--> <end-state name="end" /> <!-- ====================== --> <!-- == Actions == --> <!-- ====================== --> <!-- 解釋:這裏定義process-definition節點的action,有效的事件類型爲:process-instance-start, process-instance-end and process-instance-cancel --> <!-- 此處具體爲:在流程結束的時候, 發送E-Mail消息給申請者,記錄請假日誌 --> <action event="process-instance-end" handler="NetBpm.Example.LeaveOfAbsence.EmailAction, NetBpm.Example.LeaveOfAbsence" on-exception="log"> <!--定義action參數,供委託類實例化類調用方法時獲取使用。如這裏的EmailAction的run方法發送郵件,須要知道發給誰,郵件標題等等,那麼 參數能夠提供輔助--> <parameter name="to">previousActor</parameter> <parameter name="subject">您提交了請假申請</parameter> <parameter name="message">you requested a holiday from ${start date} to ${end date} with comment ${comment}</parameter> </action> <!-- 此處具體爲:在流程結束的時候記錄請假日誌, 此處Log模擬 注意:每一個節點能夠定義多個action --> <action event="process-instance-end" handler="NetBpm.Example.LeaveOfAbsence.LogLeaveInfoAction, NetBpm.Example.LeaveOfAbsence" on-exception="log"> <parameter name="LogInfo">記錄請假日誌? :) </parameter> </action> <!-- ================ --> <!-- == ATTRIBUTES == --> <!-- ================ --> <!-- 解釋:定義屬性值及其序列化方式。屬性值通常包括3類 --> <!-- one:角色對應的屬性 --> <attribute name="requester" type="actor" /> <attribute name="chief" type="actor" /> <attribute name="boss" type="actor" /> <!-- two:全部acitivity-state(包括start-state)處須要更新的屬性,和用戶表單內容對應 --> <attribute name="start date" type="date" /> <attribute name="end date" type="date" /> <attribute name="leave days" type="integer" /> <attribute name="comment" type="text" initial-value="請假理由或者備註" /> <attribute name="Chief evaluation result" type="evaluation" /> <attribute name="Boss evaluation result" type="evaluation" /> </concurrent-block> </process-definition>
2. 其它配置文件代碼太長就不一一貼出來;
3. 定義委託類:委託類包含在lib文件夾下的程序集中。
由於委託類數目衆多,這裏僅貼出幾個典型的委託類:
1. NetBpm.Example.LeaveOfAbsence.AutoSetAttributionsAction:該委託類設計爲一個通用委託類,這裏用來設置表識屬性,如流程通過用戶取消請假路徑,則把RunTrace屬性設置爲requestercancel,供WhichWayDicision做判斷用。
2. NetBpm.Example.LeaveOfAbsence.AnyOneJoin: 該委託主要用來設置激活父flow機制,這裏是只要任何一條路徑到達了join,則激活父flow,流程往下流。
3. NetBpm.Example.LeaveOfAbsence.WhichWayDecision:該委託根據流程實際流過路徑,根據標識屬性RunTrace等進行走哪條邊的抉擇。
4. 本文僅僅是一個示例,給你們提供一個運用nPdl定義NetBPM流程的參考,若是要把該流程投入現實中使用顯然還須要作不少優化。其中的代碼量仍是很大的。
NetBPM下設計的流程圖以下:
CC Flow
ccflow是一款國產開源工做流。支持SQLServer、Oracle、Access、MySQL數據庫,支持羣集計算、支持多國語言。流程設計、表單設計都是可視化的,所見即所得。 ccflow提供了強大的數據分析功能:流程運行的各類報表、圖形、挖掘、賺取,能夠對實(時)效性、成本分析(人力、時間、財物),進行全方位的分析、監控。 Ccflow更可與手機+手機短信+短信貓+電子郵件無縫鏈接,讓您的工做第一時間溝通,第一時間處理。
使用CC Flow建立工做流過程:
1. 在web容器中安裝好程序後,打開流程設計器,創建請假流程,便可生成填寫請假單和結束節點;
2. 拖動Chief審批節點、 Boss審批節點,添加連線以及標籤註明;
3. 設置表單:郵件選擇傻瓜型表單或者自由類型表單,設置表單後,設置每一個節點的工做崗位;
4. 設置流程跳轉方向條件,如判斷情人是誰,判斷請假天數等,選擇的數據來源自表單數據。
5. 點擊運行便可運行流程;可打開windows service,便可使用自帶的消息提醒以及郵件發送功能;
CC Flow設計的流程圖以下:
綜上所述,三款的工做流區別以下表: