回退(Rollback WorkItem)
回退是工作流參與者對自己“待辦任務(wù)”(實際是對工作項)的一種操作,即參與者主動回退待辦任務(wù)列表中的任務(wù)到已經(jīng)執(zhí)行過的人工節(jié)點。
為什么要回退?
參與者接受任務(wù)后,發(fā)現(xiàn)不應(yīng)由自己辦理此任務(wù)或以前的執(zhí)行者辦理有錯誤等情況后,需要將此接受的任務(wù)回退給以前某個節(jié)點的執(zhí)行者重新辦理。
回退模式
回退的情況實際上是非常復(fù)雜的,其中包括了參與者的重新選擇以及回退的條件判斷等等。這里先列出常見的回退模式(其實也是我們支持的模式)。
串行

這種情況最為簡單,后續(xù)節(jié)點可以回退到前續(xù)任意人工節(jié)點?;赝撕?,節(jié)點重走。
分支

這種情況也相對簡單,實際執(zhí)行的分支上的節(jié)點可以回退到前續(xù)任意人工節(jié)點(不區(qū)分主支和分支)。同樣,主支上的節(jié)點也可以回退到任意實際執(zhí)行的分支上的節(jié)點。
可能的問題:多次回退后的回退節(jié)點選擇。例如:第一次流程經(jīng)過節(jié)點2、節(jié)點3到達節(jié)點5,節(jié)點5可以回退到節(jié)點1、節(jié)點2和節(jié)點3的任意一個,此時節(jié)點5回退到節(jié)點1,節(jié)點1重走,這一次流程改為經(jīng)過節(jié)點4到達節(jié)點5,節(jié)點5回退時如何選擇回退節(jié)點?此時的策略是以最近實際執(zhí)行的分支為準,即節(jié)點5只允許回退到節(jié)點4和節(jié)點1,不允許回退到節(jié)點2和節(jié)點3。(抹去記憶)
并發(fā)

對于并發(fā)的情況,分支節(jié)點只允許在分支的節(jié)點間回退。

同理,主支節(jié)點也只允許在主支的節(jié)點間回退。
多實例匯聚

在這種情況下,節(jié)點5會產(chǎn)生2個實例,實際相當于繼續(xù)并發(fā)。節(jié)點5根據(jù)具體哪個節(jié)點觸發(fā)的它而產(chǎn)生回退節(jié)點。同時不允許回退到節(jié)點1以及前續(xù)的節(jié)點去。
子流程

支持子流程到父流程的回退,也支持父流程到子流程節(jié)點的回退。需要注意的是子流程節(jié)點有可能產(chǎn)生多個子流程實例,在這種情況下不支持父子流程之間的相互回退。
回退節(jié)點的參與者選擇
默認策略是由原先節(jié)點的實際參與者重新處理,比如節(jié)點2回退到節(jié)點1,則節(jié)點1的實際參與者重新處理該節(jié)點任務(wù)。這也符合大多數(shù)實際的業(yè)務(wù)場景。
在節(jié)點任務(wù)競爭參與的情況下,提供另一種策略,即讓人員重新競爭。
回退的條件判斷
對于多人(或者多部門,用戶)參與的工作項,提供不同的回退策略
任意人回退即回退,剩余工作項手工終止
最后提交人回退才回退
流程定義期定義該策略。
另外流程定義時提供節(jié)點可回退列表,由用戶在定義期對可回退的節(jié)點進行限制。
關(guān)于業(yè)務(wù)補償
業(yè)務(wù)補償是一個很重要的概念,在回退的情況下需要相應(yīng)的回退部分業(yè)務(wù)操作。這里由引擎提供統(tǒng)一的接口,返回回退路徑,由客戶自定義代碼進行匹配處理。
關(guān)于實現(xiàn)
很多工作流引擎通過流程定義時繪出回退線來顯式的支持回退,這種實現(xiàn)在業(yè)務(wù)復(fù)雜的情況下會造成流程圖的異常煩瑣,但是比較清晰,實現(xiàn)比較容易。隱式實現(xiàn)相比而言優(yōu)點更多。
http://m.tkk7.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)
posted on 2008-06-24 09:12
ronghao 閱讀(2378)
評論(3) 編輯 收藏 所屬分類:
SOA、BPM