Activiti提供了流程运行时对流程进行控制的API,可以使用RuntimeService提供的方法对流程进行控制,与先前博客中提到的一样,RuntimeService是Activiti提供的业务组件之一。前几篇博客中介绍的TaskService主要用于任务管理,包括任务操作,任务数据管理等;IdentityService主要用于管理流程的身份数据;RepositoryService主要用于管理流程部署的数据;而本篇博客要学习的RuntimeService主要用于管理流程在运行时产生的数据以及提供对流程进行操作的API。其中流程运行时产生的数据包括流程参数、事件、流程实例以及执行流等。
什么是流程实例与执行流
在Activiti中,启动了一个流程后,就会创建一个流程实例(ProcessInstance),每个流程实例至少会有一个执行流(Execution);如果流程中出现了分支,那么执行流的概念就出现了。所以一个流程实例就是一个执行流,这就是区别所在。
RuntimeService中的查询操作
执行流查询
RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流。直接看个例子吧!从实战中学习。
<span style="font-family:Comic Sans MS;font-size:18px;">public class ExecutionQuery { public static void main(String[] args) { // 创建流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 得到流程存储服务实例 RepositoryService repositoryService = engine.getRepositoryService(); // 得到运行时服务组件 RuntimeService runtimeService = engine.getRuntimeService(); // 部署流程描述文件 repositoryService.createDeployment() .addClasspathResource("bpmn/ExecutionQuery.bpmn").deploy(); //设置参数 Map<String, Object> vars1 = new HashMap<String, Object>(); vars1.put("days", 5); Map<String, Object> vars2 = new HashMap<String, Object>(); vars2.put("days", 6); Map<String, Object> vars3 = new HashMap<String, Object>(); vars3.put("days", 7); vars3.put("name", "crazyit"); // 开始流流程 ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey1", vars1); ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey2", vars2); ProcessInstance pi3 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey3", vars3); // 使用执行流查询方法 List<Execution> exes = runtimeService.createExecutionQuery() .processDefinitionKey("testProcess").list(); System.out.println("使用processDefinitionKey方法查询执行流:" + exes.size()); exes = runtimeService.createExecutionQuery() .processInstanceBusinessKey("businessKey1").list(); System.out.println("使用processInstanceBusinessKey方法查询执行流:" + exes.size()); exes = runtimeService.createExecutionQuery() .messageEventSubscriptionName("messageName").list(); System.out.println("使用messageEventSubscriptionName方法查询执行流:" + exes.size()); // 根据节点id属性查询当前的执行流 Execution exe = runtimeService.createExecutionQuery() .activityId("messageintermediatecatchevent1") .processInstanceId(pi1.getId()).singleRes