1. 程式人生 > >三款工作流引擎比較:WWF、netBPM 和 ccflow 下面將對目前比較主流的三款工作流進行介紹和比較,然後通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款建立流程的過程.這

三款工作流引擎比較:WWF、netBPM 和 ccflow 下面將對目前比較主流的三款工作流進行介紹和比較,然後通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款建立流程的過程.這

下面將對目前比較主流的三款工作流進行介紹和比較,然後通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款建立流程的過程.這三款工作流程引擎分別是 Windows Workflow Foundation,NetBPM, CCFlow.

NetBPM 與 CCFlow 是兩款國內知名的開源軟體,尤其是ccflow在國內的發展勢頭強勁。

這個典型的流程假設:公司有兩級領導,一級為主管Chief,一級為老闆Boss

場景描述:

  在某公司中,部門員工休假需要主管Chief的批准。 
  如果休假天數大於10天,則 在部門主管同意後,還必須老闆Boss批准。 
  如果是部門主管請假則直接提交老闆批准。 
  在休假被批准之前,申請人可以撤銷休假申請。 
  申請批准後,對休假天數進行修改(也可以是其他業務資料處理)。 每次休假申請結束之 後,不管通過未通過或是否取消,都必須記錄下來。 
  流程結束時,系統要把請假的結果資訊Email給申請人。

  對於大於10天的申請,如果部門主管已批准同意而上級主管還未批准,這時申請人撤銷申請後,系統應發Email通知部門主管申請已撤銷。

我們這裡只是一個模擬,當然現實生活中情況比這個更加複雜一些;

Windows Workflow Foundation

微軟的工作流產品,提供一套工作流引擎和VS解決方案自帶的流程設計器,但是該流程設計器面對的是程式設計師而非業務人員,所以介面比較專業,流程執行只能建立控制檯應用程式,沒有流程執行介面,沒有表單庫,如需要表單和介面需要二次開發。

使用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的難點之一是要理解生成配置檔案,提交請假單配置如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?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設計的流程圖如下:

綜上所述,三款的工作流區別如下表:

本文相關軟體連結: