zoukankan      html  css  js  c++  java
  • activiti 源码笔记之startProcess

    http://blog.csdn.net/songzheng_741/article/details/17199339



    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做的事情不多,它只是触发了所有它范围内绑定的所有监听,这也是所有原子操作的基本默认行为

  • 相关阅读:
    【编译原理】文法解析算法以及左递归消除算法
    【编译原理】 DFA词法分析和递归下降语法分析代码
    编译原理 第三章 词法分析(下)
    详解KMP算法
    编译原理 第三章 词法分析(上)
    ExtJs4.0入门错误
    致好友的一封信
    解析Xml四种方法
    Spring AOP实现原理
    Spring Ioc知识整理
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5115896.html
Copyright © 2011-2022 走看看