天天看點

Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:

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

流程部署的序列圖:

Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:

流程部署已後,啟動流程時,會調用startprocessinstancecmd,來啟動流程。 startprocessinstancecmd在查找processdefinitionentity時,會從deploymentcache中查找,當cache中不存在時,會執行deploymentcache.deploy() 。

Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:
Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:

建立流程執行個體:

執行步驟:

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:

Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:
Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:
Activiti源碼分析Activiti之流程部署:Activiti之Query查詢:建立流程執行個體:流程啟動:Activiti之資料操作Activiti之任務配置設定Activiti之任務認領Activiti之任務完成Activiti其它Activiti之定義模型:Activiti之優缺點:

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>