Activiti7工作流程引擎之包含网关

目录

 

流程定义设计

第一步:流程部署

第二步:流程启动

第三步:用户流程任务查询

第四步:流程任务处理


流程定义设计

要求:用户职业如果是程序员,则必须经过内科,外科,还有附加检查都体检后,然后获取体检报告。

条件:userType表示用户职业

内科检查条件${userType == 0 || userType == 1}

外科检查条件${userType == 0 || userType == 1}

附件检查条件${userType ==1}

 

第一步:流程部署

public class GatawayTest {
	
	

	//第一步:部署流程定义
	@Test
	public void processDeploy(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//获取部署服务
		RepositoryService repositoryService = processEngine.getRepositoryService();
		//流程定义部署服务
		repositoryService.createDeployment().name("体检流程")
		                                    .activateProcessDefinitionsOn(new Date())
		                                    .addClasspathResource("exheathcheck.bpmn")
		                                    .addClasspathResource("exheathcheck.png").deploy();
	}
}	

第二步:流程启动

	
	//第二步:流程实例化启动
	@Test
	public void processStart(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//获取运行服务服务
		RuntimeService runtimeService = processEngine.getRuntimeService();

		//流程定义部署服务
		String businessKey = "1";
		String processDefinitionKey = "heathprocess";
		
		//流程定义激活即有效
	   RepositoryService  repositoryService  = processEngine.getRepositoryService();
	   repositoryService.activateProcessDefinitionByKey(processDefinitionKey);
		
		HashMap<String,Object> variables = new HashMap<String,Object>();
		variables.put("healthUser", "zhangsan");
		variables.put("userType", 1);// 1表示程序员
		variables.put("innerCheck", "lisi");
		variables.put("outerCheck", "wangwu");
		variables.put("extrCheck", "zhaoliu");
		variables.put("reportUser", "tianqi");
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
		System.out.println("流程定义id"+processInstance.getProcessDefinitionId());
		System.out.println("流程定义名称"+processInstance.getProcessDefinitionName());
		System.out.println("流程定实例id"+processInstance.getProcessInstanceId());
	}
	

第三步:用户流程任务查询

	//第三步:流程任务查询
	@Test
	public void processInstanceQuery(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processDefinitionKey = "heathprocess";
		String assignee = "zhangsan";
		Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).singleResult();
		if(task != null ){
			System.out.println("任务id"+task.getId());
			System.out.println("任务名称"+task.getName());
			System.out.println("任务负责人"+task.getAssignee());
		}
	}

第四步:流程任务处理

	
	//第四步:流程处理
	@Test
	public void processInstanceHandler(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processDefinitionKey = "heathprocess";
		String assignee = "zhangsan";
		Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).singleResult();
		if(task != null ){
			taskService.complete(task.getId());
		}
	}
	

重点观察流程进入包含网关后的变化

执行到这里流程实例已经进入网关通过判断再次观察act_ru_task,此时同时出现三条任务

 

第五步:执行内科检查流程环节

	//第五步:流程处理
	@Test
	public void processInstanceHandler(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processInstanceId = "2501";
		String assignee = "lisi";
		Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
		if(task != null ){
			taskService.complete(task.getId());
		}
	}
	

注:第四步种存在一个问题就是使用流程定义的String processDefinitionKey = "heathprocess"这样设置

流程定义实例化多个时候采用这样查询不合适,同一个流程定义实例化多次流程定义的processDefinitionKey肯定是一样的,无法区分执行的是哪个流程的实例化,因此这里采用流程实例化processInstanceId

执行完后查看act_ru_task,该流程实例的任务变成两条

第六步:执行外科检查流程环节

	@Test
	public void processInstanceHandler(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processInstanceId = "2501";
		String assignee = "wangwu";
		Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
		if(task != null ){
			taskService.complete(task.getId());
		}
	}
	

执行完后查看act_hi_actinst

act_ru_execution 

第七步:执行附加检查流程环节


	@Test
	public void processInstanceHandler(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processInstanceId = "2501";
		String assignee = "zhaoliu";
		Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
		if(task != null ){
			taskService.complete(task.getId());
		}
	}
	

 

注意:第五步,第六步,第七步是并行执行的任务,互不影响,这也是包含网关的特点。 

 

第八步:执行获取流程报告环节

	@Test
	public void processInstanceHandler(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//任务服务
		TaskService taskService = processEngine.getTaskService();
		//流程定义部署服务
		String processInstanceId = "2501";
		String assignee = "tianqi";
		Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
		if(task != null ){
			taskService.complete(task.getId());
		}
	}
	
	

此时该实例流程已经执行完成!!

总结:包含网关

1.相当于并行网关和拍它网关的结合体。

2.流程实例经过包含网关后,流程任务并行执行,并行任务执行互不影响。

3.包含网关可以添加条件并按条件执行,而在并行网关中添加条件会被自动忽略。

4.一个流程实例执行完后,该流程实例在act_ru_*的表中记录都会删除(act_ru_*表只记录运行中的流程实例。

5.如果包含网关设置的条件中如果条件都不满足则报错; org.activiti.engine.ActivitiException: Unknown property used in expression。
 
6.先走到汇聚结点的分支,要等待其它分支走到汇聚,等所有分支走到汇聚,包含网关就执行完成,包含网关执行完成,分支和汇聚就从 act_ru_execution 删除。

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页