rumtimeService.startProcessInstanceByXX方法将启动流程的任务委派给StartProcessInstanceCmd,此时会根据rumtimeService.startProcessInstanceByXX的XX来用不同的变量构造StartProcessInstanceCmd实例然后执行execute方法,StartProcessInstanceCmd的构造器如下.

(1) processDefinitionKey
         在bpmn20.xml中定义流程元素的id
       < process id ="loanReuqest" name ="Process to handle a loan request">
 
(2)processDefinitionId
        对应流程数据库中act_re_procdef中的主键
(3)businessKey
        关联的业务主键,用于自定义扩展,引擎本身没有用到.
 
(4)variables
        流程变量
 
execute的执行逻辑如下
(1) 根据processDefinitionKey或proceeDefinitionId在已发布的流程定义中查找,它是先查找缓冲中的流程定义然后再去数据库中查找以便提高效率,如果找不到或找到的流程定义被挂起将抛出运行时异常ActivitiException.
deploymentCache.findDeployedProcessDefinitionById?Key( processDefinitionId?Key);
(2)创建流程实例
ExecutionEntity processInstance = processDefinition.createProcessInstance(businessKey);
创建流程实例的过程是比较复杂的。
首先流程在创建时必须有一个类型为ActivityImpl的initial变量.
这里为了方便理解暂且可以把ActivityImpl理解为流程中的每个节点元素(除了任务外整个一个流程也可理解为一个节点)的抽象.
它有如下属性:
public class ActivityImpl extends ScopeImpl implements PvmActivity, HasDIBounds {
 
  private static final long serialVersionUID = 1L;
  protected List< TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>();
  protected Map<String, TransitionImpl> namedOutgoingTransitions = new HashMap<String, TransitionImpl>();
  protected List< TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>();
  protected ActivityBehavior activityBehavior;
  protected ScopeImpl parent;
  protected boolean isScope ;
  protected boolean isAsync ;
  protected boolean isExclusive ;
 
  // Graphical information
  protected int x = -1;
  protected int y = -1;
  protected int width = -1;
  protected int height = -1;
 
...........................................
}
比较重要的属性包括此流程元素的进入、离开路径和此活动对应的行为(有了这些我们甚至可以在运行时改变流程的运转和行为),每种不同的流程元素都有不同的行为,actityBehavior实现了当流转到此节点时对应的处理逻辑.
 
创建流程时initial一般指各种开始事件,我这里单步调试时用了最简单的StartEvent,下面是它activitiBehavior类,
public class NoneStartEventActivityBehavior extends FlowNodeActivityBehavior {
 
  // Nothing to see here.
  // The default behaviour of the BpmnActivity is exactly what
  // a none start event should be doing.
}
它只是为了语义而定义的类,它没在父类FlowNodeActivityBehavior的基础上添加任何额外属性和方法.FlowNodeActivityBehavior是所有bpmn元素的超类,FlowNodeActivityBehavior的默认只是离开此节点,而不做任何额外处理.
ProcessDefinitionImpl的newProcessInstance是真正创建流程实例的地方,它使用下面这个以activityImpl为参数的构造器创建ExecutionEntity对象.这里和ProcessInstance的继承关系可以看到一个流程实例实际上也是一个执行实例,从逻辑上理解一个流程实例也就是一个可执行的路径.当然反过来说就不对了,执行实例不仅仅单指流程实例.
public ExecutionEntity(ActivityImpl activityImpl) {
    this. startingExecution = new StartingExecution(activityImpl);
}
在创建流程后会在流程数据库中插入一条ExecutionEntity数据,在act_ru_execution表中可以看到这个execution的id和proc_inst_id的值是一样的
 
在完成流程实基本例化后,对此流程实例的变量再进行一些初始化
  processInstance.setProcessDefinition( this);
  processInstance.setProcessInstance(processInstance);
  processInstance.initialize();
前两行代码的操作很简单,第三行的initialize方法又是有些复杂的.它负责设置流程的变量、任务、调度任务、订阅事件等,它这涉及到流程引擎的范围体系,需要另开文章好好分析.
(3)启动流程
processInstance.start();
 
public void start() {
    if( startingExecution == null && isProcessInstanceType()) {
      startingExecution = new StartingExecution(processDefinition .getInitial());
    }
    performOperation (AtomicOperation. PROCESS_START);
}
在activiti里一个动作都将对应一种行为,启动流程的动作将执行PROCESS_START的原子操作
  if(executionOperation.isAsync( this )) {
      scheduleAtomicOperationAsync(executionOperation);
    } else {
      performOperationSync(executionOperation);
    }   
如果是异步的就在调度线程池中拿到线程执行,否则就在当前线程内执行
 
以下是activiti原子操作的类型
 
 
 
AtomicOperationProcessStart做的事情不多,它只是触发了所有它范围内绑定的所有监听,这也是所有原子操作的基本默认行为

activiti 源码笔记之startProcess的更多相关文章

  1. activiti源码笔记对标的博客

    http://blog.csdn.net/bluejoe2000/article/category/2812511/2 白乔专栏 http://blog.csdn.net/bluejoe2000/ar ...

  2. Zepto源码笔记(一)

    最近在研究Zepto的源码,这是第一篇分析,欢迎大家继续关注,第一次写源码笔记,希望大家多指点指点,第一篇文章由于首次分析原因不会有太多干货,希望后面的文章能成为各位大大心目中的干货. Zepto是一 ...

  3. redis源码笔记(一) —— 从redis的启动到command的分发

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...

  4. AsyncTask源码笔记

    AsyncTask源码笔记 AsyncTask在注释中建议只用来做短时间的异步操作,也就是只有几秒的操作:如果是长时间的操作,建议还是使用java.util.concurrent包中的工具类,例如Ex ...

  5. Java Arrays 源码 笔记

    Arrays.java是Java中用来操作数组的类.使用这个工具类可以减少平常很多的工作量.了解其实现,可以避免一些错误的用法. 它提供的操作包括: 排序 sort 查找 binarySearch() ...

  6. Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

    以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...

  7. Tomcat8源码笔记(七)组件启动Server Service Engine Host启动

    一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...

  8. Tomcat8源码笔记(六)连接器Connector分析

    根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...

  9. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

随机推荐

  1. HDU 4569 Special equations(数学推论)

    题目 //想不出来,看了解题报告 /* 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有 ...

  2. 从xml文件中读取注释

    void Main() {     string dirp=@"E:\Cread\UP4201308.bak\UP4.BAK\ExportPath\ConfigFile\";   ...

  3. poj 2762(强连通+判断链)

    题目链接:http://poj.org/problem?id=2762 思路:首先当然是要缩点建新图,由于题目要求是从u->v或从v->u连通,显然是要求单连通了,也就是要求一条长链了,最 ...

  4. JS中的this好神奇,都把我弄晕了

    一.this的常见判断: 1.函数预编译过程 this —> window 2.全局作用域里 this —> window 3.call/apply 可以改变函数运行时this指向 4.o ...

  5. 关于null == 0?返回false的问题

    1.首先我们先看各种情况的结果: null > 0? //=>false null < 0? //=>false null >= 0? //=>true null ...

  6. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

  7. php用fsockopen实现post提交数据并获得返回数据

    /** * 函数介绍: 用于post方式提交数据 * 输入参数: 完整url, 数据 * 返回值 : 接口返回值 */ function post_it($url, $data = '', $time ...

  8. CentOS系统常用命令

    1.进入目录命令 cd /usr/bin //进入etc目录 cd .. //切换到上一层目录 cd / //进入主目录 2.新建文件命令 比如进入某个目录后执行 vim test 2.查看运行的项目 ...

  9. 为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样

    新来的美工嫌我们logo太丑,所以就决定关闭了.这个理由怎么样曾经拥有的不要忘记:不能得到的更要珍惜:属于自己的不要放弃:已经失去的留作回忆.我刚来~~~嘿嘿~~ 久经考验的,忠诚的国际宅男主义战士, ...

  10. word2010中怎样快速修改同级标题格式

    我要把所有三级目录的字体增大,怎样能一次选中批量修改?文章很长,一百多个三级标题.word 2010中提供了快速修改的方法: ①将光标定位在一个三级标题中② <IGNORE_JS_OP> ...