Activiti 流程启动及节点流转源代码分析
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
本文主要是以activiti-study中的xiaomage.xml流程圖為例進行跟蹤分析
詳細的流程圖例如以下:
流程圖相應的XML文件例如以下:
流程實例創建步驟例如以下(下圖轉載自:activiti 源代碼筆記之startProcess):
流程啟動跟蹤分析:
圖一:
圖二:
圖三:
圖四:
以上主要是跟蹤分析了,三個節點之間的流轉情況。
在流轉的時候須要注意下面兩個接口:
原子操作(AtomicOperation)接口:
注意:
void execute(InterpretableExecution execution);InterpretableExecution接口:
public interface InterpretableExecution extends ActivityExecution, ExecutionListenerExecution, PvmProcessInstance {void take(PvmTransition transition);void take(PvmTransition transition, boolean fireActivityCompletedEvent);void setEventName(String eventName);void setEventSource(PvmProcessElement element);Integer getExecutionListenerIndex();void setExecutionListenerIndex(Integer executionListenerIndex);ProcessDefinitionImpl getProcessDefinition();void setActivity(ActivityImpl activity);void performOperation(AtomicOperation etomicOperation);boolean isScope();void destroy();void remove();InterpretableExecution getReplacedBy();void setReplacedBy(InterpretableExecution replacedBy);InterpretableExecution getSubProcessInstance();void setSubProcessInstance(InterpretableExecution subProcessInstance);InterpretableExecution getSuperExecution();void deleteCascade(String deleteReason);boolean isDeleteRoot();TransitionImpl getTransition();void setTransition(TransitionImpl object);void initialize();void setParent(InterpretableExecution parent);void setProcessDefinition(ProcessDefinitionImpl processDefinitionImpl);void setProcessInstance(InterpretableExecution processInstance);boolean isEventScope();void setEventScope(boolean isEventScope);StartingExecution getStartingExecution();void disposeStartingExecution(); }注意:
void performOperation(AtomicOperation etomicOperation);單獨摘出來的兩個方法是圖一中:
上下文、原子操作、運行器實體三者相互調用的關鍵。
上圖的詳細調用情況例如以下:
ExecutionEntity類中的:
performOperation函數中調用上下文CommandContext類中的:
public void performOperation(AtomicOperation executionOperation, InterpretableExecution execution) {nextOperations.add(executionOperation);if (nextOperations.size()==1) {try {Context.setExecutionContext(execution);while (!nextOperations.isEmpty()) {AtomicOperation currentOperation = nextOperations.removeFirst();if (log.isTraceEnabled()) {log.trace("AtomicOperation: {} on {}", currentOperation, this);}if (execution.getReplacedBy() == null) {currentOperation.execute(execution);} else {currentOperation.execute(execution.getReplacedBy());}}} finally {Context.removeExecutionContext();}} }performOperation函數調用原子操作(AtomicOperation)接口中的void execute(InterpretableExecution execution)來處理。
該處的處理分為兩種情況:
1、依據AtomicOperation接口標識來繼續進行流轉
(再次調用ExecutionEntity類中的performOperation(AtomicOperation executionOperation)方法)
比方:
PROCESS_START=》PROCESS_START_INITIAL=》ACTIVITY_EXECUTE。。。。
。。
詳細能夠參考本文圖一到圖四的代碼跟蹤中的標識。
2、依據節點上的ActivityBehavior類進行不同的處理
Activiti節點(開始、結束、任務、網關等等)都是Activity類型的,僅僅是其掛的ActivityBehavior不同。通過不同的ActivityBehavior來實現相應的操作。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
轉載于:https://www.cnblogs.com/gccbuaa/p/7306380.html
總結
以上是生活随笔為你收集整理的Activiti 流程启动及节点流转源代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VSCode打开中文乱码
- 下一篇: pat 乙级1033 旧键盘打字(2