一個關於Activiti或JBPM流程的回退的討論

需求:
         流程的回退是一個複雜的計算,特別是在中國式的流程裏,現實中的流程則相對簡單,如我把一個審批文件提交出去後,若由兩我的(張3、李四)同時處理,若張三或李四須要把文件退回來,文件直接打回到發起人我這裏,這樣張三或李四手上再也不存在審批文件,但對於JBPM或Activiti的流程回退則作不到這麼簡單。
但原則上咱們要符合這種現實的要求:流程由誰提交過來,則退回給誰。

爲了弄清這個關係,咱們以一個稍爲複雜一點Activiti流程爲例。


d2167949-acb2-3cd2-bc87-b16006ec9420.jpg (124.37 KB, 下載次數: 32) php

下載附件  保存到相冊 html

2014-2-24 10:41 上傳 算法



以上流程包括了多種流程節點,如分支,並行節點,多實例任務,子流程。流程執行過程當中咱們記錄其任務完成的每一個一步,而後概括其回退的算法實現。其中,A爲多實例任務,咱們在後臺指定了其兩個執行用戶,咱們啓動流程,而後記錄每一步執行的狀況。



流程產生後,產生任務如:



當A的兩個實例任務完成後,將會產生後續的任務,即產生B、C、E任務,在這三任務中,若回退的話,均是回退至A,而且是由A原來的執行人員來處理。因爲A是多實例任務,其執行的任務個數爲動態,若當時執行數爲2(而且爲張3、李四)兩人處理,則回退後,也是回到這兩我的那裏處理。以下所示:

而另外,E回退時,也須要B、C的任務刪除(在某種狀況下也可能不刪除),現實中至關於我把任務完成後,同時提交給三我的去處理,其中一我的回退,不能把另外一個任務的工做也回退回來處理。

在B點上回退,C須要銷燬,E也存在的話,也不合理,由於在A再往下執行時,又會從新產生B、C、E,所以,爲了減小複雜度,須要所有刪除B、C、E,回退至A。

當E往下執行時,會產生F或G任務,在這裏咱們設置條件讓他產生F任務,如:



若F回退,則應該產生E任務,B、C則正常運行,繼續往下執行後,將會產生I任務,再者是J任務。若在I任務回退,則應該回退至F。
同理,若B與C執行完成後,將會產生D。若咱們記錄任務的產生順序,將比較容易實現任務的回退,因爲jbpm4或activiti5均不記錄這種操做,因此要實現回退均比較困難。

在此咱們用一個有效的數據結構記錄全部的任務產生的順序,以下所示:


有了這樣的一個數據結構,記錄了每一個任務節點的產生順序,咱們在任何一個節點上,都能有效回退至上一任務節點,而且包括自由跳轉的方式,如在I節點,若咱們回退至E,就把F節點從這個記錄順序中去掉,而後產生E任務出來。

這裏還有一些問題尚沒有獲得有效解決:

1.如D任務回退時,應該產生B與C任務的仍是僅須要產生其中一個,系統中是提供人工選擇的方式給他仍是自動產生其中一個?
2.F回退至E時,要不要也產生B、C任務?
3.任務回退時,須要找回原來的執行人
4.這個任務堆棧執行記錄在何時往裏放數據,即產生這個執行樹

演示請看:
相關文章
相關標籤/搜索