activiti 源码笔记之startProcess

简介:

 

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

 

本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/5213413.html,如需转载请自行联系原作者
相关文章
|
4月前
|
数据可视化 Java 数据库
手把手实现springboot整合flowable,非常简单【附源码.视频】
手把手实现springboot整合flowable,非常简单【附源码.视频】
207 2
|
5月前
|
XML Java 应用服务中间件
【小白误闯】Activiti 框架你不得不知道的一些事
Activiti 是一个轻量级的、以Java为中心的开源工作流和业务流程管理(BPM)平台。它允许用户在业务应用程序中定义、执行和监控业务流程。以下是Activiti的核心组件【5月更文挑战第8天】
440 1
|
5月前
|
XML Java 数据库
【二十三】springboot整合activiti7(1)实战演示篇
【二十三】springboot整合activiti7(1)实战演示篇
215 0
|
5月前
|
存储 XML 数据库
纯干货,activiti入门看这一篇就够了‼️‼️
纯干货,activiti入门看这一篇就够了‼️‼️
261 0
|
XML 监控 安全
Activiti整理
一个完整的工作流生命周期会经过5步,并且迭代循环。 定义:工作流生命周期总是从流程定义开始。这个过程包括收集需求,将其转化成流程定义,也就流程图、相关变量、角色定义。 发布:由开发人员打包各种资源,然后在系统管理中发布流程定义。包括:bpmn.xml、自定义表单、任务监听类等。 执行:具体的流程引擎按照事先定义的流程处理路线以任务驱动的方式执行业务流程。 监控:此阶段是依赖执行阶段。业务人员在办理任务的同时收集每个任务(Task)的结果,然后根据结果做出相应处理。 优化:在此阶段,一个完整的流程已经结束,或许能满足业务需求,或者需要优化。
243 0
Activiti整理
|
SQL XML Java
14、SpringBoot2.0基本使用笔记(十四)
第一种启动方式:直接用编辑器启动 第二种启动方式:mvn spring_boot run 第三种启动方式: mvn install (先编译项目,targe 生成 jar) java -jar project.jar 后两种启动方式都需先进入到项目目录上再运行命令。
173 0
|
XML 应用服务中间件 数据格式
Activiti入门操作
Activiti入门操作
|
Java API 数据库
Activiti进阶篇-个人任务
Activiti进阶篇-个人任务
Activiti进阶篇-个人任务