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:
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、 把已完畢的流程做資料清理并備份