博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activiti 流程启动及节点流转源码分析
阅读量:5931 次
发布时间:2019-06-19

本文共 5337 字,大约阅读时间需要 17 分钟。

作者:jiankunking 出处:

本文主要是以中的xiaomage.xml流程图为例进行跟踪分析

具体的流程图如下:
这里写图片描述
流程图对应的XML文件如下:

Place documentation for the 'MyProcess' process here.

流程实例创建过程如下(下图转载自:):

这里写图片描述
流程启动跟踪分析:
图一:
这里写图片描述
图二:
这里写图片描述
图三:
这里写图片描述
图四:
这里写图片描述
以上主要是跟踪分析了,三个节点之间的流转情况。
在流转的时候需要注意以下两个接口:
原子操作(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 出处:

你可能感兴趣的文章
关于git stash
查看>>
Java中的JSON数据绑定框架Jackson使用介绍
查看>>
如何解决Python安装模块的错误:error: Unable to find vcvarsall.bat
查看>>
“Satellite”:在生产过程中监控Kubernetes
查看>>
Swift 2.2 的新特性
查看>>
java jar打包总结(二)
查看>>
1小时编写一个支持七牛上传的 markdown 客户端1(技术实现篇)
查看>>
基于Webpy实现服务器策略模型
查看>>
预备知识:我读过的对epoll最好的讲解
查看>>
js面向对象浅析--继承那些事
查看>>
密码概述
查看>>
JSP与Servlet02
查看>>
[Leetcode] Inorder Successor in BST 二叉搜索树中序下一个
查看>>
React Virtual DOM、Ember Glimmer和Incremental DOM技术哪家强
查看>>
cf 0.2 版本发布,lua 开发的另一种美
查看>>
SAP权限对象的校验
查看>>
kubernetes一些简单的基础知识
查看>>
zabbix snmp模板通用
查看>>
08.Java反射问题
查看>>
这份2019年5G手机购机指南,请各位老铁们收好! ...
查看>>