以國外流行的工做流jbpm4的模式與當今中國開源的ccbpm(ccflow和jflow的總稱)流程引擎對照。以便讓各位可以瞭解到中國國情的工做流引擎與國際流行的設計規則的差異、不一樣、與優缺點。數據庫
國外工做流比較通用的就是知足21種流程模式的支持。編程
1. 順序流(Sequence)設計模式
JBPM:性能
就是按照流程設計的步驟,一步步的向下運行,這樣的模式下每一個節點有前後順序,就是每一個節點只有一個節點是活動的。spa
例子:好比申請後進行審批,一步一步的進行任務。線程
CCBPM:設計
順序流,也叫作沒有分支的線性流程,流程通常在最後一個節點自動結束,並標識流程完成。也能夠經過設置節點條件,自動結束流程。版本控制
ccbpm的特色是:容許用戶本身定義流程完成條件,在任何一個節點運行過程當中,ccbpm都要去檢查條件設置,若是知足這個條件流程就自動結束。日誌
2. 並行分叉(ParallelSplit)orm
JBPM:
流程在某個活動(節點、步驟)以後產生多個分支,而且並行流轉。
例子:好比在淘寶買了個商品須要發票,那麼賣家就須要一邊準備商品發貨,一邊準備發票郵寄。
CCBPM:
異表單分合流的分流動做,一個動做結束後(分流節點),並行啓動多個分支,每一個分支都要向下運動。
在cc中,能夠根據方向條件設置來決定是否啓用某一個分支。
3. 同步(Synchronization)
JBPM:
在流程中的某個點,多個並行的子流程或者活動,合併成一個流程。流程必須等待全部的分支都執行完成後,才能激活後續活動。
例子:好比商家在收到「發票」和「商品」後,才能確認收貨。
CCBPM:
異表單分合流中的合流動做,能夠指定必定的完成率,才能到達合流節點。對於未完成的子線程,能夠進行刪除操做。
4. 獨佔式選擇(Exclusive Choice)
JBPM:
一個活動完成後,只能在後面的多個分支中激活一個。
例子:好比用戶下單後,能夠有N種付款方式,可是隻能選擇其中一種。
CCBPM:
具備分支的線性流程。能夠由方向條件控制,也能夠由用戶手動控制。
5. 簡單聚合(Simple Merge)
JBPM:
在流程中有2個以上的分支中某一個點處被合併成一個分支,只要分支中的一條完成,便可繼續進行,而其餘分支自動結束。
例子:好比發貨在建設銀行和中國銀行等支付方式中的一個完成後才被激活。
CCBPM:
便可覺得帶有分支的線性流程,又能夠是異表單的合流動做。在線性流程中,在某一處選擇須要執行的節點並完成執行後,後面的節點一步一步的執行,沒有被選擇的節點不執行。
在異表單中,能夠經過條件設置須要執行的節點,其餘節點不執行,在合流點完成彙總並激活。或者,經過設置完成率來激活合流點的操做。
區分究竟是否是分合流,經過查看節點類型。
6. 基本控制流程模式,在JBPM中與CCBPM中的綜合實現。
JBPM:
CCBPM:
1. 多重選擇(Multiple Choice)
在流程中,當一個活動完成後,有多個分支進行選擇,能夠選擇執行其中的一個或者N個分支。
例子:好比去世博園玩,在門口檢票後,能夠選擇A-E個片區中的N個進行觀光。
JBPM中的支持狀況:
1.JPDL方式不支持先定義好這裏的幾種,而後根據條件去篩選其中的幾種進行,可是JBPM4.4以後支持一種叫foreach的節點,容許咱們在運行時指定幾種特定的任務,好比上面例子中的片區,咱們能夠在選定後再去循環。
2.BPMN方式支持根據條件執行多個子分支。
CCBPM中的支持狀況:
1.經過定義流程爲異表單分合流來實現。
a經過條件控制發起子線程數量。設置方向條件的時候,能夠根據須要,選擇不通的條件設置,好比:崗位條件、部門條件、表單條件等。
b經過節點樹形中設置手工選擇方向控制,能夠控制發起子線程的發起數量。
2.經過父子流程也能夠實現。
2. 同步聚合(Synchronizing Merge)
在流程中的某個聚合點,流程會等待全部的分支到來,才能激活後續的活動。若是分支只有一個,那麼就變成簡單聚合模式;若是存在2個以上分支,那就是同步模式。
這種模式的關鍵在於可以動態的根據分支的多少進行聚合。
JBPM中的支持狀況:
能夠經過設置JBPM的join節點屬性multiplicity的值爲某個變量,並在程序中動態的修改變量的值來制定分支的數量。
CCBPM中的支持狀況:
分合流中合流操做。不管分支有多少,均可以進行彙總,而且能夠對彙總的子線程進行刪除操做、完成率控制等。
CCBPM的多重選擇與同步聚合實例圖:
結束爲聚合點,中間的爲分支。
3. 多重聚合(Multiple Merge)
在流程中的多個分支,均可以激活後續的活動,也就是會產生多個實例。
例子:遊客觀光完N個片區以後,每一個片區各自的系統能夠對遊客在本身片區的信息進行存儲。
JBPM與CCBPM的支持請參考 同步聚合。
4. 鑑別器(Discriminator)
在流程的某個聚合點,N個分支的第一個分支到達後,就馬上激活後續活動;與此同時,流程仍然要等待其他的分支完成並忽略完成。
注意:在其他分支未所有完成前,第一個到達的分支所激活的後續節點是沒法執行的。
例子:我的申請提交後,並行提交給第一導師審批、第二導師審批、第三導師審批,他們中只要有一個完成了,那麼就能夠提交給學院審批。
N-out-of-M鑑別器模式:
跟鑑別器模式同樣的,只是這種模式是N個到達後,激活後續節點,而剩下的M-N個節點未完成前,新激活的後續節點同樣沒法被執行。
JBPM中的支持狀況:
沒有直接支持這種模式,可是經過自定義節點,應該是能夠處理這種模式的。
CCBPM中的支持狀況:
有兩個屬性的控制,能夠實現功能,就是上面所說的子線程完成路和子線程刪除規則。
第1個:子線程完成率。 該規則能夠決定是否可見
第2個:子線程刪除規則。該規則決定那些子線程能夠被刪除以及他們的刪除方式。
1. 任意循環(Arbitrary Cycles)
JBPM:
某一個或多個活動能夠反覆執行。
例子:用戶買了瓶汽水,拿到汽水後,中了一瓶,又去兌換了一瓶汽水,若是又中了,再去兌換一瓶汽水….
CCBPM:
徹底是條件判斷,在表單中增長一個審覈組件,就能夠把每次校驗的信息,寫入裏面,完整的顯示出來整個軌跡。
2. 隱式終止(Implicit Termination)
JBPM:
指這一個流程中,若是沒有活動能夠執行,那麼流程會自動終止。
例子:好比用戶買了汽水,中了50元,可是沒有地方能夠兌換。
CCBPM:
這種類型屬於ccbpm的線性流程的一種,該流程配上流程完成條件,就能夠實現該功能。
流程完成條件,就是流程在前進中檢查的條件,若是知足該條件,流程就中止運行,該流程實例結束。
1. 無同步的多實例(MIwithout)
在流程中,一個活動能夠激活多個實例,每一個實例相互獨立,並不須要在後面進行同步。
例子:好比用戶購買了N本書,因而後續的支付帳單、更新客戶能夠以本書爲單位各自執行。
JBPM中的支持狀況:
支持這種模式,可是不容許在後面進行結束動做。
CCBPM中的支持狀況:
分合流與父子流程支持這種模式,分合流上面已經講過,下面說下父子流程。
第一種狀況:發起子流程後,等全部的子流程執行完成後,父流程繼續下一步驟或者結束。
第二種狀況:發起子流程後,不管子流程是否執行完成,都執行到下一步或者結束。
父流程:
2. 設計時肯定的多實例(MIwith a Priori Design Time Knoledge)
在流程中,被激活的多個實例須要在某個聚合點聚合,而實例的個數在設計的時候就已經知曉率。
JBPM中的支持狀況:
對於設計時已經知道實例數量的,最簡單的就是使用多個Task節點來實現多個實例。
CCBPM中的支持狀況:
合流節點處理各個子線程的任務比率。
完成率 = 子線程上已經完成的數據/全部子線程數量*100%
該節點對於合流節點與分合流節點有效,當子線程的完成率達到該值的時候,該節點的待辦才能顯示出來,不然該節點的人員不能處理待辦。若是合流節點的處理人可以看到待辦,他就能夠對該流程進行操做,好比:發送、刪除、退回、刪除子線程等等。
3. 運行時肯定的多實例(MI with a Priori RunTime Knoledge)
在流程中,被激活的多個實例須要在某個聚合點聚合,而實例的個數在設計的時候並不知道,只有在運行時根據條件來決定須要激活多少個實例。
JBPM中的支持狀況:
對於運行時能夠知曉實例數量的,能夠經過設置JOIN節點的multipliclty來實現。
CCBPM中的支持狀況:
同表單分合流配合節點訪問規則能夠實現這個功能。
4. 運行時沒法肯定的多個實例(MI without a Priori RunTime Knoledge)
在流程中,被激活的多個實例須要在某個聚合點聚合,而實例的個數在設計的時候並不知道,該模式與上一個模式的區別就是,在產生的實例執行時或者已經執行完時,仍然有新的實例產生。
例子:好比要採購100臺電腦,涉及到多個供應商,可是每一個供應商供應多少臺電腦是不知道的,所以供應商的數量也是不肯定的,可是每次供應商送貨來後,就會將所擁有的電腦數量和所需的100臺進行比較,來決定是否要下一個供應商進行供應。
JBPM中的支持:與運行時肯定的多個實例的實現方式同樣。
CCBPM中的支持:
這種方式屬於ccbpm的父子流程來實現,開始節點啓動一個任務,須要採購100臺電腦,須要發起n此的選擇供應商採購的子流程,每一個子流程完成後,就訪問父流程節點信息,進行相關的業務處理(就是是否啓動下一個子流程,若是知足100,就不啓動子流程了,直接完成父流程的任務,結束主流程.)。
1. 延遲選擇(Deferred Choice)
流程中某個點能夠有多個分支進行選擇。不是基於簡單的數據或者決定就能夠很明顯地做出選擇,而是會向系統或者執行環境提供多種可選擇的分支;可是又不一樣於AND-Split模式,延遲選擇只能選擇一個分支執行,一旦選擇了其中第一個分支,那麼其餘分支就會被撤銷。這種延遲一直會持續到第一個選擇分支開始實際運行。
例子:收到的一批商品運送到各個部門,到底選擇什麼樣的運行方式,要看資源的可用性。
CCBPM中的模式:
經過在節點屬性—基本屬性中,設置手工選擇方向條件的方式,能夠實現此種模式。實際上ccbpm就是將流程流轉的權限在交給了當前節點的操做的人員,由他來決定流程要發送到什麼地方去。
2. 交叉存取並行路由(Interleaved Parallel Routing)
或者叫任意順序流,指幾個活動必須按順序執行,不能同時進行,可是這種順序又是不定的。
例子:體檢的時候有不少項目,這些項目不能同時進行,可是能夠以隨意順序進行。
CCBPM中的模式:
這是典型的一種多任務分配流程,使用多維度的分合流能夠實現,這個流程的特色是,一個操做人員能夠處理三個不一樣的任務,這三個任務屬於三個子線程,與普通的分合流不一樣的是這三個子線程是同一我的處理。在這裏就決定了,有一個批次號(項目維度),在這裏就是檢查項目。
該數據源返回了三個列,分別是:No,Name,BatchNo。 No=操做員編號,Name=操做員名稱,BatchNo批次編號。
3. 里程碑(Milestone)
一個活動的激活須要一種具體的狀態,好比活動A,B,C,只有在AB都執行完成的狀況下才能執行C。
JBPM中的模式:
相似與順序模式或者同步模式。
CCBPM中的模式:
這個可能相似與ccbpm的延續流程,當一個流程長度很大的時候,須要跨度不少年實施的時候,把該流程截成一段段的,分開設計,一條流程,是上一條流程的延續。
延續流程是父子流程的一種,可是延續流程只有一個段接一段,就是一個父流程有多個子流程,可是延續流程就只能有一個子流程。
1. 取消模式(Cancel Activity)
就是將某個活動取消。
CCBPM中,相似與刪除流程操做相同。
不能刪除:不容許刪除。
邏輯刪除:僅僅將此流程標記爲刪除狀態,數據仍然存在節點表單與流程報表中。
記錄日誌方式刪除:刪除節點表單、流程報表數據,並記錄備案。
完全刪除:完全清除該流程的全部數據,包括該工做實例的節點表單數據、流程報表數據、軌跡數據、退回、移交操做信息。
讓用戶決定刪除方式:顯示對話框,讓用戶選擇刪除方式。
2. 取消實例(CancelCase)
若是一個活動產生了多個實例,那麼僅僅撤銷這個活動是不夠的,要將他所引發的全部實例都移除才行。
CCBPM中的解決方案,參考 取消模式。
共同點:
1. 嵌入式的工做流引擎,下降集羣複雜性。
2. 嚴格而靈活的流程版本控制
3. 支持多種數據庫
4. 支持多種流程設計模式
5. 成熟度高的開源工做流,具備可靠的穩定性和性能。
區別:
1. 流程定義方式:
JBPM:採用xml的方式,經過拼字符串的方式完成,因此流程定義時的結果不直觀、不方便。
CCBPM:擁有本身的流程設計器和表單設計器,畫布性質的,所見即所得。包括流程運轉條件、方向條件等。
2. 面向使用對象:
JBPM:因爲設計方式,只能面向流程開發人員。
CCBPM:既面向流程開發人員又面向業務人員,即便不會編程,也能夠進行流程設計。
3. 節點類型:
JBPM:開始節點、結束節點、自動節點、任務節點、fork分支、join聯合等多種節點。經過多種節點的配合以及事件等使用,組成流程。
而且,開始節點必須有一個向外的流向。
CCBPM:普通節點、分流節點、子線程節點、合流節點。
開始節點屬於普通節點,能夠作爲一個單節點的流程,沒有流向。
結束節點由CC自動判判定義。
CC中的循環是經過方向條件判斷,同步、聚合等是由合流節點。
4. 對複雜流程的支持:
JBPM:不適合很是複雜的流程,他只是提供了一套豐富的工做流模型,可讓你去作任何事情,即使違反工做流規範。
CCBPM:經過節點運行規則、方向條件、豐富的事件、運行模式和表單解決方案,徹底知足複雜的流程運轉,對任何狀況,都是可控的。
5. 對歷史數據的挖掘:
JBPM:對歷史數據的支持不是很好,好比,子任務不能寫入歷史之類。固然,經過修改代碼與BUG,也是能夠實現的。
CCBPM:具備軌跡功能,即對某一個流程運行產生數據的保存,流程運行中,能夠查看相關節點的處理信息與流程數據,流程結束後也能夠。