Activiti原始碼分析

衣舞晨風發表於2016-04-06

ExecutionEntity內部含有parent,是一個執行樹或執行路徑,應該是一個流程例項的執行過程,一個例項對應一個ExecutionEntity,通過getActivity得到的是當前正在執行的activity.

Activiti之流程部署:

流程檔案部署主要涉及到3個表,分別是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。主要完成“部署包”–>“流程定義檔案”–>“所有包內檔案”的解析部署關係
流程定義的部署需要完成如下操作: 
1、初始化到資料庫,完成三張表的插入,一個部署包裡可以有N個流程定義,所以 PROCDEF表內對應N條資料,BYTEARRAY表內對應N+條記錄,每個xml檔案一條記錄,圖片也會另外存放一條記錄。DEPLOYMENT內會存放一條記錄 
2、解析後的流程定義存入DeploymentCache
流程部署的序列圖:
這裡寫圖片描述
流程部署已後,啟動流程時,會呼叫StartProcessInstanceCmd,來啟動流程。 StartProcessInstanceCmd在查詢ProcessDefinitionEntity時,會從deploymentCache中查詢,當cache中不存在時,會執行deploymentCache.deploy() 。

Activiti之Query查詢:

快取查詢:

這裡寫圖片描述

Activiti之manager:

這裡寫圖片描述

建立流程例項:

建立流程例項:

runtimeService.startProcessInstanceByKey("financialReport") 

執行步驟:
1、 首先根據” financialReport”在資料庫中查詢流程定義
2、 查詢到流程定義後,再從processDefinitionCache中獲取已經快取的、部署完成的(xml 檔案被解析的)流程定義,如果processDefinitionCache中不存在,那麼執行流程的解析過程
3、 建立流程例項
程式碼執行過程:
①AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStart
②AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStartInitial
③AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute
④ProcessInstance[805] executes Activity(theStart):
org.activiti.engine.impl.bpmn.behavior.NoneStartEventActivityBehavior
⑤Leaving activity ‘theStart’

流程啟動:

流程啟動執行:

ExecutionEntity.performOperation(AtomicOperation.PROCESS_START) 

接著執行:execution.performOperation(PROCESS_START_INITIAL);
接著執行:execution.performOperation(ACTIVITY_EXECUTE);
其內部執行邏輯為:
ActivityBehavior activityBehavior = activity.getActivityBehavior();
activityBehavior.execute(execution);
activityBehavior有很多的實現類,比如:當流程啟動時,啟動節點的activityBehavior實際上是NoneStartEventActivityBehavior的例項。給每個節點裝配ActivityBehavior應該是在流程解析時完成的,一個型別的節點裝配特定型別的Behavior,固定寫死的。

Activiti之資料操作

Insert、update、delete三種操作,先更新cache,在一個cmd中,把所有需要insert的資料放入一個map,執行完cmd後,統一進行insert、update、delete操作
每個Service的“命令執行者”都是由:
“LogInterceptor–>CommandContextInterceptor–>CommandExecutorImpl”組成的執行鏈狀結構。
日誌—>執行前後操作(比如:transaction的開啟及commit)執行命令

Activiti之任務分配

任務分配時,根據流程定義,首先根據人工活動定義的Assignee,直接進行分配,如果 Assignee有值,此時該任務處於已認領狀態。然後繼續執行任務的候選人分配,候選人分兩種:候選組表示式及候選人表示式,解析表示式,進行公共任務分配。任務應該沒有狀態,標記是已經被認領時,是根據該任務的屬性:task.getAssignee()是否有值進行判斷。

Activiti之任務認領

1、沒有找到判斷是否有許可權進行認領操作
2、 如果該任務屬性:task.getAssignee()有值,說明已經被認領,如果和當前認領人不同, 丟擲異常,is already claimed by someone else
執行認領操作,資料庫操作步驟(分別對應三張表):
⑴、update HistoricActivityInstanceEntity
⑵、update HistoricTaskInstanceEntity
⑶、update TaskEntity

Activiti之任務完成

在建立一個新人工任務時,在資料表IdentityLinkEntity中刪除當前已完成的這條資料,當流程例項結束時,刪除execution表中的當前流程資料。
完成一個人工任務時,完成的資料庫表操作:
1. insert HistoricActivityInstanceEntity
2. insert TaskEntity
3. insert HistoricTaskInstanceEntity
4. insert IdentityLinkEntity
5. update ExecutionEntity
6. update HistoricActivityInstanceEntity
7. update HistoricTaskInstanceEntity
8. delete IdentityLinkEntity
9. delete TaskEntity
完成任務時,走的過程:
1.Leaving activity
‘writeReportTask’ [org.activiti.engine.impl.bpmn.behavior.BpmnActivityBehavior]
2.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd
3.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd@1c09624
4.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope
5.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake
6.ProcessInstance[605] takes transition
(writeReportTask)–flow2–>(verifyReportTask) [org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake]
7.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope
8. AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart
9.AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart
10. AtomicOperation:
org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute@1478a2don org.activiti.engine.impl.interceptor.CommandContext
11. ProcessInstance[605] executes Activity(verifyReportTask):
org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior

Activiti其它

Activiti之executionEntity:
這裡寫圖片描述
這裡寫圖片描述

Activiti之定義模型:

這裡寫圖片描述

Activiti之優缺點:

1、 一直沒能理解它的executionEntity的模型,它提供了三個介面:pvmexecution、execution、 activityExecution,是它的名字起的不好還是有其它的思想?
2、 當流程結束時,刪除對應的記錄,這種操作很巧妙的支援了叢集環境
3、 見識了把一個流程從開始到結束的抽象:分解成各種cmd和AtomicOperation
4、 通過一個執行鏈完成transaction的程式設計式事物控制
5、 不支援組織機構的擴充套件,與業務系統進行整合時,要寫很多的event來完成任務分配
6、 可以記錄冗餘業務資料來組合查詢任務
7、 把已完成的流程做資料清理並備份

原文連結

相關文章