executionentity内部含有parent,是一個執行樹或執行路徑,應該是一個流程執行個體的執行過程,一個執行個體對應一個executionentity,通過getactivity得到的是目前正在執行的activity.
流程檔案部署主要涉及到3個表,分别是:act_ge_bytearray、act_re_deployment、act_re_procdef。主要完成“部署包”–>“流程定義檔案”–>“所有包内檔案”的解析部署關系
流程定義的部署需要完成如下操作:
1、初始化到資料庫,完成三張表的插入,一個部署包裡可以有n個流程定義,是以 procdef表内對應n條資料,bytearray表内對應n+條記錄,每個xml檔案一條記錄,圖檔也會另外存放一條記錄。deployment内會存放一條記錄
2、解析後的流程定義存入deploymentcache
流程部署的序列圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIzczNwIjNzkDM2ADNwYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
流程部署已後,啟動流程時,會調用startprocessinstancecmd,來啟動流程。 startprocessinstancecmd在查找processdefinitionentity時,會從deploymentcache中查找,當cache中不存在時,會執行deploymentcache.deploy() 。
建立流程執行個體:
執行步驟:
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’
流程啟動執行:
接着執行:execution.performoperation(process_start_initial);
接着執行:execution.performoperation(activity_execute);
其内部執行邏輯為:
activitybehavior activitybehavior = activity.getactivitybehavior();
activitybehavior.execute(execution);
activitybehavior有很多的實作類,比如:當流程啟動時,啟動節點的activitybehavior實際上是nonestarteventactivitybehavior的執行個體。給每個節點裝配activitybehavior應該是在流程解析時完成的,一個類型的節點裝配特定類型的behavior,固定寫死的。
insert、update、delete三種操作,先更新cache,在一個cmd中,把所有需要insert的資料放入一個map,執行完cmd後,統一進行insert、update、delete操作
每個service的“指令執行者”都是由:
“loginterceptor–>commandcontextinterceptor–>commandexecutorimpl”組成的執行鍊狀結構。
日志—>執行前後操作(比如:transaction的開啟及commit)執行指令
任務配置設定時,根據流程定義,首先根據人工活動定義的assignee,直接進行配置設定,如果 assignee有值,此時該任務處于已認領狀态。然後繼續執行任務的候選人配置設定,候選人分兩種:候選組表達式及候選人表達式,解析表達式,進行公共任務配置設定。任務應該沒有狀态,标記是已經被認領時,是根據該任務的屬性:task.getassignee()是否有值進行判斷。
1、沒有找到判斷是否有權限進行認領操作
2、 如果該任務屬性:task.getassignee()有值,說明已經被認領,如果和目前認領人不同, 抛出異常,is already claimed by someone else
執行認領操作,資料庫操作步驟(分别對應三張表):
⑴、update historicactivityinstanceentity
⑵、update historictaskinstanceentity
⑶、update taskentity
在建立一個新人工任務時,在資料表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之executionentity:
1、 一直沒能了解它的executionentity的模型,它提供了三個接口:pvmexecution、execution、 activityexecution,是它的名字起的不好還是有其它的思想?
2、 當流程結束時,删除對應的記錄,這種操作很巧妙的支援了叢集環境
3、 見識了把一個流程從開始到結束的抽象:分解成各種cmd和atomicoperation
4、 通過一個執行鍊完成transaction的程式設計式事物控制
5、 不支援組織機構的擴充,與業務系統進行內建時,要寫很多的event來完成任務配置設定
6、 可以記錄備援業務資料來組合查詢任務
7、 把已完成的流程做資料清理并備份
<a href="http://wenku.baidu.com/link?url=n62chc2m_1gymwdlpbygthe1di79r9wk-olegckmkgsnlgd-mnjlwvkyacxy2byhqkaiasjybw_s_gzfht1pdawo-wg39yb0yl33lga_7m3">原文連結</a>