启动流程实例
/**
* 启动流程
*/
@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个。
- 注意
- 如果是单例流程,执行对象ID就是流程实例ID
- 如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
- 一个流程中,流程实例只有1个,执行对象可以存在多个。
- Task 任务
- 执行到某任务环节时生成的任务信息。
- 对应的表:
- act_ru_task:正在执行的任务信息
- act_hi_taskinst:已经执行完的历史任务信息
流程变量
- 流程变量在整个工作流中扮演很重要的作用。
- 例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。
- 流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。
- 流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
- 流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
- 基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
- Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
- 设置流程变量的时候,向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个流程),每个流程实例获取的流程变量时不同的
- 使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
- Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
- 在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。 对应的表:
- act_ru_variable:正在执行的流程变量表
- act_hi_varinst:流程变量历史表
番外篇
扩展知识:setVariable和setVariableLocal的区别
- setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
- setVariableLocal:
设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值 例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。