执行服务ExecutionService
ExecutionService主要用于维护流程实例,执行等待状态的流程,并且包含了流程实例的查询和流程变量的操作。
1.启动新的流程实例
1)使用Key启动最新的流程实例
executionService.startProcessInstanceByKey("VWIN"); |
上述方法会以Key为VWIN流程定义的最新版本启动一个新的流程实例,是最简单且最常用的方法。
-
指定流程版本
executionService.startProcessInstanceById("VWIN-2"); |
上述方法会以流程为VWIN-2的定义启动一个新的流程实例,VWIN是流程定义的Key,2是流程定义的版本。
-
指定流程实例的ID
executionService.startProcessInstanceByKey("VWIN","CGD0008"); |
上述方法与第a种方法类似,唯一区别是手动指定了流程实例的ID,这个ID可以用我们的业务对象ID,例如采购单。
-
使用变量
Map<String,Object> variables = new HashMap<String,Object>(); variables.put("customer", "John Doe"); variables.put("type", "Accident"); variables.put("amount", new Float(763.74)); executionService.startProcessInstanceByKey("VWIN",variables); |
上述方法在启动流程实例时,就会将设置的变量保存,启动后可以使用这些变量。任务服务TaskService
-
任务列表的访问
TaskService主要是提供了对任务列表的访问及操作,如:
//查找指定用户的任务列表 List<Task> taskList=taskService.findPersonalTasks("marker"); //查找指定组的任务列表 List<Task> groupTaskList = taskService.findGroupTasks("hr-group"); for (Task task : taskList) { //TODO taskService.completeTask(task.getId()); } |
2) 读写相关数据
一般情况下,我们在执行任务时都会对应一个表单,表单可以读写任务的相关数据。
taskService.getVariable(taskId, variableName); taskService.getVariables(taskId,variableNames); taskService.getVariableNames(taskId); taskService.setVariables(taskId, variables); |
3) 完成任务
我们可以通过以下几种方式完成任务:
taskService.completeTask(taskId); taskService.completeTask(taskId,variables); taskService.completeTask(taskId,outcome); taskService.completeTask(taskId,outcome,variables); |
我们可以提供一个map,在任务完成之前作为流程变量添加到流程实例中,也可以提供一个outcome(出口),以决定任务完成后的流向。但是我们需要注意任务的不同配置将会带来的问题:
taskService.getOutComes(taskId)
-
如果一个任务拥有一个没有name的transition:
<task name="myTask"> <transition to="end"/> </task> taskService.getOutcomes(taskId);//返回一个包含null值的集合 taskService.completeTask(taskId);//使用这个 transition taskService.completeTask(taskId, variables);//使用这个transition taskService.completeTask(taskId,outcome);//抛出异常 taskService.completeTask(taskId, outcome, variables);//抛出异常 |
-
如果一个任务拥有一个有name的transition:
<task name="myTask"> <transition name="to end" to="end"/> </task> taskService.getOutcomes(taskId);//返回包含这个transition名称的集合 taskService.completeTask(taskId);//使用这个transition taskService.completeTask(taskId, variables); //抛出异常(因为没有无名的transition) taskService.completeTask(taskId, outcome);//根据指定的名称执行转移(如果没有该名称,则抛出异常) taskService.completeTask(taskId, outcome, variables);//抛出异常(因为没有无名的transition) |
-
如果一个任务拥有多个transition,而其中一个没有name,其他都有name:
<task name="myTask"> <transition to="next"/> <transition name="to other task" to="otherTask"/> <transition name="to end" to="end"/> </task> taskService.getOutcomes(taskId);//返回一个包含null值和其他transition名称的集合 taskService.completeTask(taskId);//使用没有名称的transition taskService.completeTask(taskId, variables);//使用没有名称的transition taskService.completeTask(taskId, outcome);//使用指定名称的transition taskService.completeTask(taskId, outcome, variables);//使用指定名称的transition |
-
如果一个任务拥有多个transition,并且都有唯一的name:
<task name="myTask"> <transition name="to next" to="next"/> <transition name="to other task" to="otherTask"/> <transition name="to end" to="end"/> </task> taskService.getOutcomes(taskId);//返回一个包含null值和其他transition名称的集合 taskService.completeTask(taskId);//抛出异常(因为没有无名的transition) taskService.completeTask(taskId, variables); //抛出异常(因为没有无名的 transition) taskService.completeTask(taskId, outcome);//使用指定名称的transition taskService.completeTask(taskId, outcome, variables);//使用指定名称的transition |
历史服务HistoryService
历史服务顾名思义就是对流程实例的运行时历史进行访问,如果想查询某流程定义的所有历史流程实例,可以使用如下方法:
historyService.createHistoryProcessInstanceQuery() .processDefinitionId(processDefinitionId .orderAsc(HistoryProcessInstanceQuery.PROPERTY_STARTTIME) .list(); | |
以上是我们常用的几个服务