天天看點

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

流程部署的序列圖:

Activiti源代碼分析

流程部署已後,啟動流程時,會調用StartProcessInstanceCmd。來啟動流程。

StartProcessInstanceCmd在查找ProcessDefinitionEntity時,會從deploymentCache中查找,當cache中不存在時。會運作deploymentCache.deploy() 。

Activiti之Query查詢:

緩存查詢:

Activiti源代碼分析

Activiti之manager:

Activiti源代碼分析

建立流程執行個體:

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源代碼分析

Activiti之定義模型:

Activiti源代碼分析

Activiti之優缺點:

1、 一直沒能了解它的executionEntity的模型,它提供了三個接口:pvmexecution、execution、 activityExecution,是它的名字起的不好還是有其他的思想?

2、 當流程結束時。删除相應的記錄。這樣的操作非常巧妙的支援了叢集環境

3、 見識了把一個流程從開始到結束的抽象:分解成各種cmd和AtomicOperation

4、 通過一個運作鍊完畢transaction的程式設計式事物控制

5、 不支援組織機構的擴充,與業務系統進行內建時,要寫非常多的event來完畢任務配置設定

6、 能夠記錄備援業務資料來組合查詢任務

7、 把已完畢的流程做資料清理并備份