3.3获取流程实例的状态
有的时候,我们需要判断它是在该流程,还是该流程已经结束了。我们可以根据获取出来的对象是否为空来进行判断
//获取流程实例的状态 @Test public void getProcessInstanceState(){ String processInstanceId="605"; ProcessInstance pi = processEngine.getRuntimeService() .createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult();//返回的数据要么是单行,要么是空 ,其他情况报错 //判断流程实例的状态 if(pi!=null){ System.out.println("该流程实例"+processInstanceId+"正在运行... "+"当前活动的任务:"+pi.getActivityId()); }else{ System.out.println("当前的流程实例"+processInstanceId+" 已经结束!"); } }
这里写图片描述
3.4查看历史流程实例的信息
//查看历史执行流程实例信息 @Test public void queryHistoryProcInst(){ List<HistoricProcessInstance> list = processEngine.getHistoryService() .createHistoricProcessInstanceQuery() .list(); if(list!=null&&list.size()>0){ for(HistoricProcessInstance temp:list){ System.out.println("历史流程实例id:"+temp.getId()); System.out.println("历史流程定义的id:"+temp.getProcessDefinitionId()); System.out.println("历史流程实例开始时间--结束时间:"+temp.getStartTime()+"-->"+temp.getEndTime()); } } }
查询表:
这里写图片描述这里写图片描述
3.5查看历史实例执行任务信息
@Test public void queryHistoryTask(){ String processInstanceId="605"; List<HistoricTaskInstance> list = processEngine.getHistoryService() .createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .list(); if(list!=null&&list.size()>0){ for(HistoricTaskInstance temp:list){ System.out.print("历史流程实例任务id:"+temp.getId()); System.out.print("历史流程定义的id:"+temp.getProcessDefinitionId()); System.out.print("历史流程实例任务名称:"+temp.getName()); System.out.println("历史流程实例任务处理人:"+temp.getAssignee()); } } }
给予对应的实例id就可以查询出执行到哪个任务了…
这里写图片描述这里写图片描述
3.6执行任务
根据任务的id,就可以把该任务执行了。
@Test public void compileTask(){ String taskId="608"; //taskId:任务id processEngine.getTaskService().complete(taskId); System.out.println("当前任务执行完毕"); }
四、流程变量细讲
流程变量涉及到的数据库表:
act_ru_variable:正在执行的流程变量表 act_hi_varinst:流程变量历史表
流程变量在工作流中扮演着一个非常重要的角色。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
这里写图片描述
4.1设置流程变量
我们有两种服务可以设置流程变量,TaskService【任务服务】和RuntimeService【运行时服务】
场景
- 在流程开始的时候设置流程变量
- 在完成某个任务的时候设置流程变量
- 使用TaskService设置服务
- 使用RuntimeService设置服务
作用:
- 传递业务参数
- 动态指定代理人【我们快速入门的例子是固定在流程定义图上写上代理人的】
- 指定连接【决定流程往哪边走】
4.2流程变量支持类型
如果我们使用JavaBean来作为流程的变量,那么我们需要将JavaBean实现Serializable接口。
Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
这里写图片描述
4.3setVariable和setVariableLocal的区别
这里写图片描述
4.4例子
//模拟流程变量设置 @Test public void getAndSetProcessVariable(){ //有两种服务可以设置流程变量 // TaskService taskService = processEngine.getTaskService(); // RuntimeService runtimeService = processEngine.getRuntimeService(); /**1.通过 runtimeService 来设置流程变量 * executionId: 执行对象 * variableName:变量名 * values:变量值 */ // runtimeService.setVariable(executionId, variableName, values); // runtimeService.setVariableLocal(executionId, variableName, values); //设置本执行对象的变量 ,该变量的作用域只在当前的execution对象 // runtimeService.setVariables(executionId, variables); //可以设置多个变量 放在 Map<key,value> Map<String,Object> /**2. 通过TaskService来设置流程变量 * taskId:任务id */ // taskService.setVariable(taskId, variableName, values); // taskService.setVariableLocal(taskId, variableName, values); //// 设置本执行对象的变量 ,该变量的作用域只在当前的execution对象 // taskService.setVariables(taskId, variables); //设置的是Map<key,values> /**3. 当流程开始执行的时候,设置变量参数 * processDefiKey: 流程定义的key * variables: 设置多个变量 Map<key,values> */ // processEngine.getRuntimeService() // .startProcessInstanceByKey(processDefiKey, variables) /**4. 当任务完成时候,可以设置流程变量 * taskId:任务id * variables: 设置多个变量 Map<key,values> */ // processEngine.getTaskService().complete(taskId, variables); /** 5. 通过RuntimeService取变量值 * exxcutionId: 执行对象 * */ // runtimeService.getVariable(executionId, variableName);//取变量 // runtimeService.getVariableLocal(executionId, variableName);//取本执行对象的某个变量 // runtimeService.getVariables(variablesName);//取当前执行对象的所有变量 /** 6. 通过TaskService取变量值 * TaskId: 执行对象 * */ // taskService.getVariable(taskId, variableName);//取变量 // taskService.getVariableLocal(taskId, variableName);//取本执行对象的某个变量 // taskService.getVariables(taskId);//取当前执行对象的所有变量 }
//设置流程变量值 @Test public void setVariable(){ String taskId="1804";//任务id //采用TaskService来设置流程变量 //1. 第一次设置流程变量 // TaskService taskService = processEngine.getTaskService(); // taskService.setVariable(taskId, "cost", 1000);//设置单一的变量,作用域在整个流程实例 // taskService.setVariable(taskId, "申请时间", new Date()); // taskService.setVariableLocal(taskId, "申请人", "何某某");//该变量只有在本任务中是有效的 //2. 在不同的任务中设置变量 // TaskService taskService = processEngine.getTaskService(); // taskService.setVariable(taskId, "cost", 5000);//设置单一的变量,作用域在整个流程实例 // taskService.setVariable(taskId, "申请时间", new Date()); // taskService.setVariableLocal(taskId, "申请人", "李某某");//该变量只有在本任务中是有效的 /** * 3. 变量支持的类型 * - 简单的类型 :String 、boolean、Integer、double、date * - 自定义对象bean */ TaskService taskService = processEngine.getTaskService(); //传递的一个自定义bean对象 AppayBillBean appayBillBean=new AppayBillBean(); appayBillBean.setId(1); appayBillBean.setCost(300); appayBillBean.setDate(new Date()); appayBillBean.setAppayPerson("何某某"); taskService.setVariable(taskId, "appayBillBean", appayBillBean); System.out.println("设置成功!"); }
//查询流程变量 @Test public void getVariable(){ String taskId="1804";//任务id // TaskService taskService = processEngine.getTaskService(); // Integer cost=(Integer) taskService.getVariable(taskId, "cost");//取变量 // Date date=(Date) taskService.getVariable(taskId, "申请时间");//取本任务中的变量 //// Date date=(Date) taskService.getVariableLocal(taskId, "申请时间");//取本任务中的变量 // String appayPerson=(String) taskService.getVariableLocal(taskId, "申请人");//取本任务中的变量 //// String appayPerson=(String) taskService.getVariable(taskId, "申请人");//取本任务中的变量 // // System.out.println("金额:"+cost); // System.out.println("申请时间:"+date); // System.out.println("申请人:"+appayPerson); //读取实现序列化的对象变量数据 TaskService taskService = processEngine.getTaskService(); AppayBillBean appayBillBean=(AppayBillBean) taskService.getVariable(taskId, "appayBillBean"); System.out.println(appayBillBean.getCost()); System.out.println(appayBillBean.getAppayPerson()); }
public class AppayBillBean implements Serializable{ private Integer id; private Integer cost;//金额 private String appayPerson;//申请人 private Date date;//申请日期 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getCost() { return cost; } public void setCost(Integer cost) { this.cost = cost; } public String getAppayPerson() { return appayPerson; } public void setAppayPerson(String appayPerson) { this.appayPerson = appayPerson; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }