流程跟蹤圖-推導算法
工作中使用activiti實現流程圖相關業務,但是上線后遇到問題,偶爾流程圖出不來。查閱了一下畫流程圖的實現,基本上是參見:activiti-流程圖顏色變化之一篇。
核心類,參見:ActivitiHistoryGraphBuilder、Graph;
實際上,算法思路是通過act_hi_actinst來查找到走過的歷史任務節點,並按開始時間排序。對這些歷史節點遍歷,分別查找每個節點的進邊(FromNode-Edge-ToNode),具體的實現是:ActivitiHistoryGraphBuilder.findPreviousEdge()方法,查找的方式是找到時間最近的上一個節點。利用的原理是:每一個節點,只能有一條進線;
本來一般情況也沒問題,但是運行中發現了一些情況,活動的ID偶爾會錯序,導致算法出問題,從而流程圖出不來。
可以說,這個算法是對特定清醒下的一個子演算,不充分。
實際activiti算法
之前一直不明白act_hi_actinst表中的execution_id_是一個什么意思,還有查詢有Query,NativeQuery,今天無意中翻看UserGuide的時候突然發現了它的意義,果然強大!!
remember a process instance consists of a tree of executions
具體意義參見下圖:
這個內容在csdn中,進行了一個自問自答activiti怎樣根據act_hi_actinst記錄獲取流程路線
流程存儲結構
一個整體的存儲邏輯結構如下圖所示:
1.Node是一個聲明式的接口,表名它的子類是存儲結構中的一個元素;
2.Element是Node的一個實現類,存儲的是具體實際的activiti元素;
3.PlaceHolder是Node的一個實現類,它是一個占位符,里面用Map存儲了分支子線;
Key:executionId;
Value:List<Node> ;
因為元素還可能是占位符,代表分支,所以這里是Node;具體在解析的時候,使用instanceof來進行實際類型檢測解析。