启动流程实例


	/**
	 * 启动流程
	 */
	@Test
	public void startProcess() {
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
//		runtimeService.startProcessInstanceById(processDefinitionId)//根据流程定义ID启动流程
		/**
		 * 参数1:流程定义ID 参数2:Map<String,Object> 流程变量
		 */
//		runtimeService.startProcessInstanceById(processDefinitionId, variables);
		/**
		 * 参数1:流程定义ID 参数2:String 业务ID 把业务ID和流程执行实例进行绑定
		 */
//		runtimeService.startProcessInstanceById(processDefinitionId, businessKey);
		/**
		 * 参数1:流程定义ID 参数2:String 业务ID 把业务ID和流程执行实例进行绑定 参数3:Map<String,Object> 流程变量
		 */
//		runtimeService.startProcessInstanceById(processDefinitionId, businessKey, variables)
//		
//		runtimeService.startProcessInstanceByKey(processDefinitionKey)//根据流程定义的key启动
		/**
		 * 参数1:流程定义的Key 参数2:Map<String,Object> 流程变量
		 */
//		runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)
		/**
		 * 参数1:流程定义Key 参数2:String 业务ID 把业务ID和流程执行实例进行绑定
		 */
//		runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey);
		/**
		 * 参数1:流程定义Key 参数2:String 业务ID 把业务ID和流程执行实例进行绑定 参数3:Map<String,Object> 流程变量
		 */
//		runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey, variables)

		// 实例开发中使用的
		// runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey,
		// variables)
		// runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey);

		String processDefinitionKey = "HelloWorld";
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
		System.out.println("流程启动成功:" + processInstance.getId() + "   " + processInstance.getProcessDefinitionId() + "  "
				+ processInstance.getProcessInstanceId());

	}

查询个人任务


	/**
	 * 查询我的个人任务act_ru_task
	 */
	@Test
	public void queryMyTask() {
		TaskService taskService = this.processEngine.getTaskService();
		String assignee = "李四";
		List<Task> list = taskService.createTaskQuery()
				// 条件
				.taskAssignee(assignee)// 根据任务办理人查询任务
//		.deploymentId(deploymentId)//根据部署ID查询 where id=id
//		.deploymentIdIn(deploymentIds)//根据部署ID集合查询   where id in (1,2,3,4)
//		.executionId(executionId)//根据执行实例ID
//		.processDefinitionId(processDefinitionId)//根据流程定义ID
//		.processDefinitionKey(processDefinitionKey)//根据流程定义的key
//		.processDefinitionKeyIn(processDefinitionKeys)
//		.processDefinitionKeyLike(processDefinitionKeyLike)
//		.processDefinitionName(processDefinitionName)
//		.processDefinitionNameLike(processDefinitionNameLike)
//		.processInstanceBusinessKey(processInstanceBusinessKey)
				// 排序
				.orderByTaskCreateTime().desc()
				// 结果集
				.list();
//		.listPage(firstResult, maxResults)
//		.count();
//		.singleResult()

		if (null != list && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务ID:" + task.getId());
				System.out.println("任务办理人:" + task.getAssignee());
				System.out.println("执行实例ID:" + task.getExecutionId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("流程定义ID:" + task.getProcessDefinitionId());
				System.out.println("流程实例ID:" + task.getProcessInstanceId());
				System.out.println("任务创建时间:" + task.getCreateTime());
				System.out.println("####################");
			}
		}
	}

办理任务

/**
	 * 办理任务
	 */
	@Test
	public void completeTask() {
		TaskService taskService = this.processEngine.getTaskService();
		String taskId = "20002";
		// 根据任务ID去完成任务
		taskService.complete(taskId);
		// 根据任务ID去完成任务并指定流程变量
//		taskService.complete(taskId, variables);
		System.out.println("任务完成");
	}
	/**
	 * 判断流程是否结束 作用:更新业务表里面的状态
	 */
	@Test
	public void isComplete() {
		// 已知流程实例ID
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
		String processInstanceId = "2501";
		ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
				.processInstanceId(processInstanceId).singleResult();
		if (null != processInstance) {
			System.out.println("流程未结束");
		} else {
			System.out.println("流程已结束");
		}

		// 已知任务ID 5002 [了解]
		// 根据任务ID查询任务实例对象
		/*
		 * TaskService taskService = this.processEngine.getTaskService(); String
		 * taskId="5002"; Task task =
		 * taskService.createTaskQuery().taskId(taskId).singleResult();
		 * //从任务实例里面取出流程实例ID String processInstanceId2 = task.getProcessInstanceId();
		 * //使用流程实例ID去流程实例表里面查询有没有数据 ProcessInstanceQuery processInstance2 =
		 * runtimeService.createProcessInstanceQuery().processInstanceId(
		 * processInstanceId2); if (null != processInstance2) {
		 * System.out.println("流程未结束"); } else { System.out.println("流程已结束"); }
		 */

	}

查询当前的流程实例

	/**
	 *  查询当前的流程实例 act_ru_execution
	 * 
	 */
	@Test
	public void queryProcessInstance() {
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
		List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();
		if (null != list && list.size() > 0) {
			for (ProcessInstance pi : list) {
				System.out.println("执行实例ID:" + pi.getId());
				System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
				System.out.println("流程实例ID:" + pi.getProcessInstanceId());
				System.out.println("########################");
			}
		}
	}

查询历史任务

	/**
	 * 附加功能,查询历史任务(后面讲)act_hi_taskinst
	 */
	@Test
	public void queryHistoryTask() {
		HistoryService historyService = this.processEngine.getHistoryService();
		List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().list();
		if (null != list && list.size() > 0) {
			for (HistoricTaskInstance hi : list) {
				System.out.println("任务ID:" + hi.getId());
				System.out.println("任务办理人:" + hi.getAssignee());
				System.out.println("执行实例ID:" + hi.getExecutionId());
				System.out.println("任务名称:" + hi.getName());
				System.out.println("流程定义ID:" + hi.getProcessDefinitionId());
				System.out.println("流程实例ID:" + hi.getProcessInstanceId());
				System.out.println("任务创建时间:" + hi.getCreateTime());
				System.out.println("任务结束时间:" + hi.getEndTime());
				System.out.println("任务持续时间:" + hi.getDurationInMillis());
				System.out.println("####################");
			}
		}

	}

查询历史流程实例

	/**
	 * 查询历史流程实例(后面讲)
	 */
	@Test
	public void queryHistoryProcessInstance()
	{
		HistoryService historyService = this.processEngine.getHistoryService();
		List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
		if(null!=list&&list.size()>0) {
			for (HistoricProcessInstance hi : list) {
				System.out.println("执行实例ID:" + hi.getId());
				System.out.println("流程定义ID:" + hi.getProcessDefinitionId());
				System.out.println("流程启动时间:" + hi.getStartTime());
				System.out.println("########################");
			}
		}
	}
  • Execution 执行对象
    • 按流程定义的规则执行一次的过程.
    • 对应的表:
    • act_ru_execution: 正在执行的信息
    • act_hi_procinst:已经执行完的历史流程实例信息
    • act_hi_actinst:存放历史所有完成的活动
  • ProcessInstance 流程实例
    • 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。
  • 注意
  1. 如果是单例流程,执行对象ID就是流程实例ID
  2. 如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
  3. 一个流程中,流程实例只有1个,执行对象可以存在多个。
  • Task 任务
    • 执行到某任务环节时生成的任务信息。
    • 对应的表:
    • act_ru_task:正在执行的任务信息
    • act_hi_taskinst:已经执行完的历史任务信息

流程变量

  • 流程变量在整个工作流中扮演很重要的作用。
    • 例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。
    • 流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。
    • 流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
  1. 流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
  2. 基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
  3. Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
  4. 设置流程变量的时候,向act_ru_variable这个表添加数据
/**
	 * 设置流程变量1 RuntimeService
	 */
	@Test
	public void setVariables() {
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
		String executionId="2501";
		//runtimeService.setVariable(executionId, "请假人", "小明");
		Map<String,Object> variables=new HashMap<>();
		variables.put("请假天数", 6);//int
		variables.put("请假原因", "约会妹子");
		variables.put("请假时间", new Date());
		variables.put("用户对象", new User(1,"小明"));
		runtimeService.setVariables(executionId, variables);
		System.out.println("流程变量设置成功");
		
		
	}
	/**
	 * 设置流程变量2 TaskService
	 */
	@Test
	public void setVariables2() {
		TaskService taskService = this.processEngine.getTaskService();
		
		String taskId="2507";
		//runtimeService.setVariable(executionId, "请假人", "小明");
		Map<String,Object> variables=new HashMap<>();
		variables.put("任务ID设置的", 9);//int
//		taskService.setVariable(taskId, variableName, value);
		taskService.setVariables(taskId, variables);
		System.out.println("流程变量设置成功");
	}
	
	
	/**
	 * 获取流程变量
	 */
	@Test
	public void getVariables() {
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
		String executionId="2501";
		Integer days=(Integer) runtimeService.getVariable(executionId, "请假天数");
		Date date=(Date) runtimeService.getVariable(executionId, "请假时间");
		User user=(User) runtimeService.getVariable(executionId, "用户对象");
		System.out.println(days);
		System.out.println(date.toLocaleString());
		System.out.println(user.getId()+"  "+user.getName());
	}
	
	
	/**
	 * 设置流程变量2
	 */
	@Test
	public void setVariables3() {
		RuntimeService runtimeService = this.processEngine.getRuntimeService();
		String executionId="2501";
		//runtimeService.setVariable(executionId, "请假人", "小明");
		Map<String,Object> variables=new HashMap<>();
		variables.put("测试", "约会妹子");
		runtimeService.setVariablesLocal(executionId, variables);
		System.out.println("流程变量设置成功");
	}
	
	@Test
	public void setVariables4() {
		TaskService taskService = this.processEngine.getTaskService();
		String taskId="2507";
		//runtimeService.setVariable(executionId, "请假人", "小明");
		Map<String,Object> variables=new HashMap<>();
		variables.put("测试2", 9);//int
		taskService.setVariablesLocal(taskId, variables);
		System.out.println("流程变量设置成功");
	}

  1. 流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
  2. 使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
  3. Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
  • 在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。 对应的表:
  • act_ru_variable:正在执行的流程变量表
  • act_hi_varinst:流程变量历史表

番外篇

扩展知识:setVariable和setVariableLocal的区别
  • setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
  • setVariableLocal:
  1. 设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值 例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。

  2. 还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。