activiti流程控制
流程实例与执行流
启动流程,会产生一个流程实例,如果没有分支的情况下,会产生一个执行流,如果存在分支,activiti会生成一个主执行流和分支执行流.
流程实例和执行流对象
ProcessInstance是一个接口,一个ProcessInstance表示一个流程实例,同时ProcessInstance是执行流Execution的子接口,一个实例属于一个执行流,并且ProcessInstance有Execution没有的属性,比如流程定义和业务主键.
流程实例和执行流数据保存在ACT_RU_EXECUTION中,对应映射实体为ExecutionEntityImpl,主要属性包括:
- id 主键
- revision 数据版本
- businessKey 流程实例的业务主键 只有流程实例有值
- parentId 父执行流的id
- processDefinitionId 流程定义Id,流程实例和执行流都有值
- superExecutionId 父执行流Id
- activityId 当前执行流的操作,一般为流程节点的名称
- isActive 该执行流状态是否活跃
- isConcurrent 执行流是否并行
- isScope 是否在执行范围内
- isEventScope 是否在事件范围内
- suspensionState 流程中断状态 1 为活跃 2 中断
启动流程
RuntimeService提供了几种启动流程方法,返回都是ProcessInstance对象:
startProcessInstanceId方法
- startProcessInstanceId(String processDefinitionId) 根据流程定义id启动流程
- startProcessInstanceId(String processDefinitionId,Map<String,Object> variables) 根据流程定义id创建并传入参数
- startProcessInstanceId(String processDefinitionId,String businessKey) 根据流程定义id和业务id启动流程
- startProcessInstanceId(String processDefinitionId,String businessKey,Map<String,Object> variables) 根据流程定义id和业务id启动流程,并设置参数
此处的参数会保存到参数表中.
startProcessInstanceByKey方法
这里面的key为流程定义文件中id.
- startProcessInstanceByKey(String processDefinitioinKey) 根据id启动
- startProcessInstanceByKey(String processDefinitioinKey,Map<String,Object> variables) 带参方法
- startProcessInstanceByKey(String processDefinitioinKey,String businessKey) 通过id和业务id启动
- startProcessInstanceByKey(String processDefinitioinKey,String businessKey,Map<String,Object> variables) 通过id和业务id启动,并设置参数
startProcessInstanceMessage方法
在流程定义的时候,可以为启动事件添加自定义事件,通过自定义事件来启动流程实例.
- startProcessInstanceMessage(String messageName) 根据消息名称启动流程
- startProcessInstanceMessage(String messageName,Map<String,Object> variables) 带参方法
- startProcessInstanceMessage(String messageName,String businessKey) 通过事件名称和业务id启动
- startProcessInstanceMessage(String messageName,String businessKey,Map<String,Object> variables) 通过事件名称和业务id启动并设置参数
这里面的messageName并不是事件id,而是事件name属性,流程定义启动事件引用此事件是ref的是id.
流程实例参数
参数设置同任务参数.注意需要指定执行流的id,不是流程实例id,没有分支的情况两个id相同.
流程操作
RuntimeService提供了启动流程、发送信号、中断流程和激活流程等操作.
流程触发
UserTask使用complete来完成,对于receiveTask等流程节点,使用trigger方法来触发,使流程继续
RuntimeService.trigger方法:
- trigger(String executionId) 触发流程中的等待节点使其继续.
- trigger(String executionId,Map<String,Object> variables) 触发等待节点并设置参数
- trigger(String executionId,Map<String,Object> variables,,Map<String,Object> transientVariables) 第三个参数是临时参数
此处第二个参数作用于整个流程
触发信号事件
事件节点是在流程中记录事件发生的流程元素.BPMN2.0规范中主要有两种类型的事件:
- 捕获事件(Catching) 流程中在某节点定义了捕获事件,当流程执行到此节点时,会等待事件的触发,知道收到触发信号,流程才继续下去.触发信号使用RuntimeService的signalEventReceived(String signalName)方法.
- 抛出事件(Throwing) 流程中在某节点定义了抛出事件,当流程执行到此节点时,会抛出事件,并继续下去
触发消息事件
除了信号事件节点外,还提供了消息事件节点.可以使用messageEventDefinition元素定义一个消息事件,该元素可以定义在startEvent和intermediateCatchEvent.
- 在startEvent中定义,可以使用RuntimeService.startProcessInstanceByMessage方法启动流程.
- 在intermediateCatchEvent中定义,则属于捕获事件,当流程运行到此节点时,需要等待消息事件触发才能继续下去,通过RuntimeService的messageEventReceived方法向其发出信号.
中断与激活流程
RuntimeService的suspendProcessInstanceById中断流程实例
RuntimeService的activateProcessInstanceById激活流程实例
删除流程实例
RuntimeService的deleteProcessInstance(String processInstanceId,String reason)
流程查询
RuntimeService的createExecutionQuery查询执行流相关数据
RuntimeService的createProcessInstanceQuery查询流程实例相关数据