activiti并行网关(Parallel Gateway)

1.什么是并行网关?

它可以将分支(fork)为多个路径,也可以合并(join)多个入口路径。

2.使用场景:

场景一:在一个政府机关的办公OA系统设计的时候,有这么一个需求:政府需要做一个财务呈批的业务,由财务部门发起,然后经过其他所有部门,各部门根据自己的资金需求填写申请表,然后经过各自部门的领导去审核,各自部门领导审核完成,然后合并给财务部领导审核。

场景二:该政府部门还有一个需求,就是各个部门填完申请表后,到了领导去审核的时候,我们需要各个部门的领导共同决定要不要放款。

3.并行网关两个重要特性:

  • 分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 
  • 合并(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。 

4.注意点:

1.如果并行网关同时具有入口顺序流和出口顺序流,并行网关会先执行入口顺序流,然后执行再分裂成多条可以执行的路径。

2.并行网关不执行计算条件。并行网关上面的计算条件会被忽略。

3.并行网关分支和合并是同时存在的,就是说,一个至少有一个分支和一个合并。但是,网关是可以不平衡的,分支和合并的数量可以不一致。

5.并行网关的标识:并行网关,用内部带有’加号’图标的网关(菱形)表示,代表与(AND)的含义。

6.流程设计图:

activiti并行网关(Parallel Gateway)_第1张图片

7.流程源码:



  
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  
  
    
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
        
      
      
        
        
      
      
        
        
        
      
      
        
        
        
      
      
        
        
        
      
      
        
        
        
      
      
        
        
      
      
        
        
        
      
      
        
        
        
      
      
        
        
      
      
        
        
      
    
  

8.运行流程:

package parallelGateway;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class ParallelGatewayTest01 {
	/** 完成我的任务  */
	public static void main(String[] args) throws InterruptedException {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		repositoryService.createDeployment()
						 .addClasspathResource("diagrams/ParallelGateway/ParallelGatewayTest01.bpmn")
						 .deploy();
		System.out.println("流程部署成功!");// 流程定义ID
		// 流程定义的key
		String processDefinitionKey = "ParallelGatewayTest01";// 绘制的流程图ID
		ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值。使用key值启动好处:默认是按照最新版本的流程定义启动
		String procesInstanceId = pi.getId();
		System.out.println("流程实例ID:" + procesInstanceId);
		System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
	
		TaskService taskService = processEngine.getTaskService();
		while(processEngine.getRuntimeService()
				.createProcessInstanceQuery()
				.processInstanceId(procesInstanceId)
				.singleResult()!=null){//如果流程实例没有结束就一直查询当前实例的用户任务
			// 查询当前到达的任务(多线)
			List tasks = taskService.createTaskQuery()
										  .processInstanceId(procesInstanceId)
										  .list();
			for (Task t : tasks) {
				// 完成当前运行节点任务
				taskService.complete(t.getId());//完成任务时必须把变量传过去不然会报错!
				System.out.println("任务 " + t.getName() + " 执行完成!");
				System.out.println("===================================");
			}
		}

	}
}

9.运行结果

流程部署成功!
流程实例ID:165005
流程定义ID:ParallelGatewayTest01:9:165004
任务 员工一 执行完成!
===================================
任务 主管 执行完成!
===================================
任务 员工二 执行完成!
===================================
任务 部门经理 执行完成!
===================================
任务 老板 执行完成!
===================================

你可能感兴趣的:(Activiti笔记)