Activiti原始碼分析
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、 把已完成的流程做資料清理並備份
相關文章
- Activiti 流程啟動及節點流轉原始碼分析原始碼
- Retrofit原始碼分析三 原始碼分析原始碼
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- 深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析MyBatis原始碼SQLSessionUI
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 【Android原始碼】Fragment 原始碼分析Android原始碼Fragment
- 【Android原始碼】Intent 原始碼分析Android原始碼Intent
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 【MyBatis原始碼分析】select原始碼分析及小結MyBatis原始碼
- redis原始碼分析(二)、redis原始碼分析之sds字串Redis原始碼字串
- ArrayList 原始碼分析原始碼
- kubeproxy原始碼分析原始碼
- [原始碼分析]ArrayList原始碼
- redux原始碼分析Redux原始碼
- preact原始碼分析React原始碼
- Snackbar原始碼分析原始碼
- React原始碼分析React原始碼
- CAS原始碼分析原始碼
- Redux 原始碼分析Redux原始碼
- SDWebImage 原始碼分析Web原始碼
- Aspects原始碼分析原始碼
- httprouter 原始碼分析HTTP原始碼
- PowerManagerService原始碼分析原始碼
- HashSet原始碼分析原始碼