日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activiti 流程启动及节点流转源代码分析

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activiti 流程启动及节点流转源代码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

本文主要是以activiti-study中的xiaomage.xml流程圖為例進行跟蹤分析
詳細的流程圖例如以下:

流程圖相應的XML文件例如以下:

<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="MyProcess" name="MyProcess"><documentation>Place documentation for the 'MyProcess' process here.</documentation><startEvent id="startevent1" name="Start"/><userTask id="sss" name="ddd" activiti:assignee="fq"/><sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="sss"/><endEvent id="endevent1" name="End"/><sequenceFlow id="flow2" name="" sourceRef="sss" targetRef="endevent1"/></process><bpmndi:BPMNDiagram id="BPMNDiagram_MyProcess"><bpmndi:BPMNPlane bpmnElement="MyProcess" id="BPMNPlane_MyProcess"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35" width="35" x="340" y="150"/></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sss" id="BPMNShape_sss"><omgdc:Bounds height="55" width="105" x="305" y="250"/></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35" width="35" x="340" y="370"/></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="357" y="185"/><omgdi:waypoint x="357" y="250"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="357" y="305"/><omgdi:waypoint x="357" y="370"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

流程實例創建步驟例如以下(下圖轉載自:activiti 源代碼筆記之startProcess):

流程啟動跟蹤分析:
圖一:

圖二:

圖三:

圖四:

以上主要是跟蹤分析了,三個節點之間的流轉情況。
在流轉的時候須要注意下面兩個接口:
原子操作(AtomicOperation)接口:

public interface AtomicOperation {AtomicOperation PROCESS_START = new AtomicOperationProcessStart();AtomicOperation PROCESS_START_INITIAL = new AtomicOperationProcessStartInitial();AtomicOperation PROCESS_END = new AtomicOperationProcessEnd();AtomicOperation ACTIVITY_START = new AtomicOperationActivityStart();AtomicOperation ACTIVITY_EXECUTE = new AtomicOperationActivityExecute();AtomicOperation ACTIVITY_END = new AtomicOperationActivityEnd();AtomicOperation TRANSITION_NOTIFY_LISTENER_END = new AtomicOperationTransitionNotifyListenerEnd();AtomicOperation TRANSITION_DESTROY_SCOPE = new AtomicOperationTransitionDestroyScope();AtomicOperation TRANSITION_NOTIFY_LISTENER_TAKE = new AtomicOperationTransitionNotifyListenerTake();AtomicOperation TRANSITION_CREATE_SCOPE = new AtomicOperationTransitionCreateScope();AtomicOperation TRANSITION_NOTIFY_LISTENER_START = new AtomicOperationTransitionNotifyListenerStart();AtomicOperation DELETE_CASCADE = new AtomicOperationDeleteCascade();AtomicOperation DELETE_CASCADE_FIRE_ACTIVITY_END = new AtomicOperationDeleteCascadeFireActivityEnd();void execute(InterpretableExecution execution);boolean isAsync(InterpretableExecution execution); }

注意:

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類中的:

public void performOperation(AtomicOperation executionOperation) {if (executionOperation.isAsync(this)) {scheduleAtomicOperationAsync(executionOperation);} else {performOperationSync(executionOperation);} }protected void performOperationSync(AtomicOperation executionOperation) {Context.getCommandContext().performOperation(executionOperation, this); }

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 流程启动及节点流转源代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。