概念:
ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图。
Execution,执行:一般情况下,一个流程实例是一个执行树的根节点。
使用树状结构的原因在于, 这一概念只有一条执行路径, 使用起来更简单。业务API不需要了解流程实例和执行之间功能的区别。因此,API里只有一个执行类型来引用流程实例和执行。
假设汇款和存档可以同时执行,那么主流程实例就包含了2个用来跟踪状态的子节点:
总的来说:
ProcessInstance(流程实例)就是Execution(执行对象),processInstanceId就是executionId。
在源码中,ProcessInstance接口直接继承了Execution接口。
- package org.jbpm.api;
-
-
-
-
-
-
-
-
-
- public interface ProcessInstance extends Execution {
- }
注释大概意思为:
一个流程实例是一个流程定义的执行。
一个流程实例可以有多个同时进行的执行对象。
执行对象构成了一棵树,而流程实例是这棵树的根结点。
1.启动流程实例
a) 普通方法
-
-
-
- @Test
- public void startProcessInstance() {
-
- ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
-
- System.out.println("id=" + pi.getId()
- + ", state=" + pi.getState()
- + ", processDefinitionId=" + pi.getProcessDefinitionId());
- }
b) 启动流程实例,并设置一些流程变量
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("申请人", "张三");
- variables.put("报销金额", 1000.00);
-
-
- ProcessInstance pi = processEngine.getExecutionService()
- .startProcessInstanceByKey(processDefinitionKey, variables);
2.向后执行一步(Signal)
a) 向后执行一步,使用唯一的outcome离开活动
- processEngine.getExecutionService().signalExecutionById(executionId);
b) 向后执行一步,使用唯一的outcome离开活动,并设置一些流程变量
-
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("审批结果", "同意");
- processEngine.getExecutionService().signalExecutionById(executionId, variables);
c) 向后执行一步,使用指定的outcome离开活动
- String outcome= "to end1";
- processEngine.getExecutionService().signalExecutionById(executionId, outcome);
d) 向后执行一步,使用指定的
outcome
离开活动,并设置一些流程变量
- String outcome= "to end1";
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("审批结果", "同意");
- processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);
3.查询任务
a) 查询个人任务列表
-
-
-
- @Test
- public void findMyTaskList() {
- String userId = "员工";
-
-
-
-
-
-
- List<Task> list = processEngine.getTaskService()
- .createTaskQuery()
- .assignee(userId)
- .page(0, 100)
- .list();
-
-
- System.out.println("============== 【" + userId + "】的未办理的任务列表 =============");
- for (Task t : list) {
- System.out.println("id=" + t.getId()
- + ", name=" + t.getName()
- + ", assignee=" + t.getAssignee()
- + ", createTime=" + t.getCreateTime()
- + ", executionId=" + t.getExecutionId());
- }
- }
b) 查询组任务列表
方式1:
- taskService.findGroupTasks(userId);
方式2:
- List<Task> list = processEngine.getTaskService()
- .createTaskQuery()
- .candidate(userId)
- .list();
4.办理任务
a) 正常完成任务
- @Test
- public void completeTask() {
- String taskId = "180009";
-
- processEngine.getTaskService().completeTask(taskId);
-
- processEngine.getTaskService().completeTask(taskId, outcome);
-
- processEngine.getTaskService().completeTask(taskId, outcome, variables);
- }
b) 自行控制完成任务后是否向后流转(少用)
- String taskId = "120001";
-
- TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);
- taskImpl.setSignalling(false);
-
- processEngine.getTaskService().completeTask(taskId);
5.拾取任务(少用)
a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中,如果任务有assignee,则会抛异常。
b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其他人,(如果任务有assignee,则执行这个方法代表重新分配。也可以把assignee设为null表示组任务没有人办理了)
6.设置与获取流程变量
a) 方式1:根据 executionId 设置或获取流程变量
- ExecutionService.setVariable(executionId, name, value);
- Object obj = executionService.getVariable(executionId, "请假人");
b) 方式2:根据 taskId 设置或获取流程变量
- TaskService.setVariables(taskId, variables);
- Object obj = executionService.getVariable(executionId, "请假人");
7.直接结束流程实例(手工)
- String processInstanceId = "test.10001";
- processEngine.getExecutionService()
- .endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);