1. 程式人生 > >activiti5 工作流的回退功能

activiti5 工作流的回退功能

        activiti5 工作流 本身不提供回退,按網路的說法,外國人的回退也是要在流程圖設計裡面畫出來的,可惜在中國各種各樣的需求,肯定是需要實現的。在實現回退的功能上看了網路上面的方法,都是直接修改分支表的節點ID或者通過設定節點的下節點來實現回退和跳躍等需求,可惜都只支援單線流程,一旦有並行,包容閘道器,外嵌,內嵌子流程就無法成功了,還會出現不可控的錯誤。

        為了實現這些情況,只好自己實現一個CMD來做回退,先分析引擎是怎麼處理併發,子流程的。通過模擬,查看錶act_ru_execution,裡面的IS_ACTIVE_:是否存活,IS_CONCURRENT_:是否有併發,PARENT_ID_:父節點ID,SUPER_EXEC:父分支ID出現在併發分支,出現在呼叫外部子流程。(這裡提一點,activiti5的一個小問題,在多級併發的情況下,記錄規則有所不同,從2級開始記錄的分支和1級的分支的規則不一樣,至於如何大家去看資料庫)

        制定回退規則:先查找回退的節點,開始刪除分支,根據回退節點建立分支以及任務,對子流程等幾種特殊節點做處理。首先是查找回退的節點,在遍歷的時候要注意子流程的情況,然後開始刪除分支,在刪除分支的時候注意多級併發的情況(上面說到了),直接用遞迴刪除即可。(分支表總會保持一個主幹即ID與流程例項ID相同那個,這個保留住,在這個裡面做文章),最後開始建立分支,根據主幹以及發現的規則建立分支和任務即可。(其中在刪除任務的時候記得歷史表也儲存一下)

在建立分支的情況分析:

* 處理分支,分支就是流程的指標
* 情況:
* 1.回退節點多個,聚合節點退回到並行
* 2.回退節點一個,同時有並行的執行節點,並行節點退回到聚合
* 3.內嵌子流程回退,分支要刪除
* 4.回退節點是子流程,建立分支
* 5.外嵌子流程回退,子流程要刪除,
* 6.回退節點是外嵌子流程
* 7.沒有分支的回退,最基本

根據上面的規則現在是沒問題了,不過由於在開發的時候沒有考慮到多例項的情況,後續再加入進去,這裡只能先不回退多例項的情況。還有在操作的過程中,沒必要自己寫jdbc來直接操作資料庫,activiti的api很豐富,特別是在cmd模式裡面,很多manager可以使用,完全足夠大家用了。先說到這裡,程式碼由於是公司的專案我就不貼了。給大家一個思路。不一定是最好的,最少是中辦法。