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、 把已完畢的流程做數據清理並備份