Activiti入门教程九(玩转RuntimeService流程控制API)

本文详细介绍了Activiti流程引擎中的RuntimeService组件,包括如何使用RuntimeService查询执行流和流程实例,以及如何启动流程实例。此外,还展示了如何在流程运行过程中设置和获取流程参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     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()).singleResult();
		System.out.println("使用activityId和processInstanceId方法查询执行流,得到执行ID:" + exe.getId());
		//让流程往下执行
		runtimeService.messageEventReceived("messageName", exe.getId());
		exes = runtimeService.createExecutionQuery().signalEventSubscriptionName("signalName").list();
		System.out.println("使用signalEventSubscriptionName方法查询执行流:" + exes.size());
		// 根据参数查询执行流
		exes = runtimeService.createExecutionQuery().variableValueEquals("name", "crazyit").list();
		System.out.println("使用variableValueEquals方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueGreaterThan("days", 5).list();
		System.out.println("使用variableValueGreaterThan方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueGreaterThanOrEqual("days", 5).list();
		System.out.println("使用variableValueGreaterThanOrEqual方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueLessThan("days", 6).list();
		System.out.println("使用variableValueLessThan方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueLessThanOrEqual("days", 6).list();
		System.out.println("使用variableValueLessThanOrEqual方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueLike("name", "%crazy%").list();
		System.out.println("使用variableValueLike方法查询执行流:" + exes.size());
		exes = runtimeService.createExecutionQuery().variableValueNotEquals("days", 8).list();
		System.out.println("使用variableValueNotEquals方法查询执行流:" + exes.size());
	}

}</span>


 

     流程实例查询

     与上述类似,也可以通过RuntimeService的createProcessInstanceQuery方法获取ProcessInstanceQuery实例,在该实例中也为我们提供了有关流程实例的查询方法


<span style="font-family:Comic Sans MS;font-size:18px;">public class ProcessInstanceQuery {

	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 部署流程描述文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/ProcessInstanceQuery.bpmn")
				.deploy();
		ProcessInstance pi1 = runtimeService.startProcessInstanceByKey(
				"testProcess", "key1");
		ProcessInstance pi2 = runtimeService.startProcessInstanceByKey(
				"testProcess", "key2");
		ProcessInstance pi3 = runtimeService.startProcessInstanceByKey(
				"testProcess", "key3");

		// 将流程置为中断状态
		runtimeService.suspendProcessInstanceById(pi1.getId());
		// 查询流程实例
		List<ProcessInstance> pis = runtimeService.createProcessInstanceQuery()
				.processDefinitionKey("testProcess").list();
		System.out.println("使用processDefinitionKey方法查询流程实例:" + pis.size());
		pis = runtimeService.createProcessInstanceQuery().active().list();
		System.out.println("使用active方法查询流程实例:" + pis.size());
		pis = runtimeService.createProcessInstanceQuery()
				.processInstanceBusinessKey("key2").list();
		System.out
				.println("使用processInstanceBusinessKey方法查询流程实例:" + pis.size());
		// 根据多个流程实例ID查询
		Set<String> ids = new HashSet<String>();
		ids.add(pi1.getId());
		ids.add(pi2.getId());
		pis = runtimeService.createProcessInstanceQuery()
				.processInstanceIds(ids).list();
		System.out.println("使用processInstanceIds方法查询流程实例:" + pis.size());
	}

}
</span>



 

     启动流程 

     RuntimeServcie中也为我们提供了很多启动流程的方法,方法统一命名为startProcessInstanceByXXX,其中XXX有流程定义ID、流程定义的key(流程描述文件中的process的id属性)和流程中定义的额message。


     startProcessInstanceById方法

 

<span style="font-family:Comic Sans MS;font-size:18px;">public class StartById {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		RuntimeService runtimeService = engine.getRuntimeService();
		// 部署流程描述文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/startById.bpmn20.xml").deploy();		
		// 查找流程定义
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		//设置流程参数
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("days", 5);
		//启动流程
		runtimeService.startProcessInstanceById(pd.getId());
		runtimeService.startProcessInstanceById(pd.getId(), vars);
		runtimeService.startProcessInstanceById(pd.getId(), "vacationRequest1");
		runtimeService.startProcessInstanceById(pd.getId(), "vacationRequest2", vars);
		// 查询流程实例,结果为4
		long count = runtimeService.createProcessInstanceQuery().count();
		System.out.println("流程实例数量:" + count);
	}

}
</span>


     startProcessInstanceByKey方法

<span style="font-family:Comic Sans MS;font-size:18px;">public class StartByKey {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		RuntimeService runtimeService = engine.getRuntimeService();
		// 部署流程描述文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/startByKey.bpmn20.xml").deploy();	
		//初始化流程参数
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("days", 4);
		//启动流程
		runtimeService.startProcessInstanceByKey("vacationRequest");
		runtimeService.startProcessInstanceByKey("vacationRequest", vars);
		runtimeService.startProcessInstanceByKey("vacationRequest", "testKey");
		runtimeService.startProcessInstanceByKey("vacationRequest", "testKey2", vars);
		// 查询流程实例,结果为4
		long count = runtimeService.createProcessInstanceQuery().count();
		System.out.println("流程实例数量:" + count);
	}

}
</span>




     startProcessInstanceByMessage方法

<span style="font-family:Comic Sans MS;font-size:18px;">public class StartByMessage {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		RuntimeService runtimeService = engine.getRuntimeService();
		// 部署流程描述文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/startByMessage.bpmn20.xml").deploy();	
		//初始化流程参数
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("days", 4);
		//启动流程
		runtimeService.startProcessInstanceByMessage("startMsg");
		runtimeService.startProcessInstanceByMessage("startMsg", vars);
		runtimeService.startProcessInstanceByMessage("startMsg", "testKey");
		runtimeService.startProcessInstanceByMessage("startMsg", "testKey2", vars);
		// 查询流程实例,结果为4
		long count = runtimeService.createProcessInstanceQuery().count();
		System.out.println("流程实例数量:" + count);
	}

}
</span>


     流程参数

     RuntimeService组件跟其他组件类似,也可以在流程运行的过程中来设置参数,方法与其他组件都类似,并且参数也有作用域的问题。在此就给个demo看一下吧

<span style="font-family:Comic Sans MS;font-size:18px;">public class SetVariableLocal {


	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 得到任务
		TaskService taskService = engine.getTaskService();
		// 部署流程描述文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/localVariable.bpmn20.xml").deploy();
		//启动流程
		ProcessInstance pi = runtimeService.startProcessInstanceByKey("vacationRequest");
		//查询全部的任务,得到相应的执行流,设置不同的参数
		List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
		for (Task task : tasks) {
			
			Execution exe = runtimeService.createExecutionQuery()
					.executionId(task.getExecutionId()).singleResult();
			if ("Manager Audit".equals(task.getName())) {
				//经理审核节点,设置Local参数
				runtimeService.setVariableLocal(exe.getId(), "managerVar", "manager var");
			} else {
				//HR审核节点,设置全局参数
				runtimeService.setVariable(exe.getId(), "hrVar", "hr var");
			}
		}
		//两个执行流时输出参数
		for (Task task : tasks) {
			Execution exe = runtimeService.createExecutionQuery()
					.executionId(task.getExecutionId()).singleResult();
			if ("Manager Audit".equals(task.getName())) {				
				System.out.println("使用getVariableLocal方法获取经理参数:" + 
						runtimeService.getVariableLocal(exe.getId(), "managerVar"));
				System.out.println("使用getVariable方法获取经理参数:" + 
						runtimeService.getVariableLocal(exe.getId(), "managerVar"));
			} else {
				System.out.println("使用getVariableLocal方法获取HR参数:" + 
						runtimeService.getVariableLocal(exe.getId(), "hrVar"));
				System.out.println("使用getVariable方法获取HR参数:" + 
						runtimeService.getVariable(exe.getId(), "hrVar"));
						
			}
		}
		//完成任务
		for (Task task : tasks) {
			taskService.complete(task.getId());
		}
		System.out.println("========  完成流程分支后     ========");
		//重新查找流程任务
		tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
		for (Task task : tasks) {
			System.out.println("当前流程节点:" + task.getName());
			Execution exe = runtimeService.createExecutionQuery()
					.executionId(task.getExecutionId()).singleResult();
			System.out.println("经理参数:" + runtimeService.getVariable(exe.getId(), "managerVar"));
			System.out.println("HR参数:" + runtimeService.getVariable(exe.getId(), "hrVar"));
		}
	}

}
</span>



<think>好的,我现在要处理用户关于Activiti 7实战教程、使用指南和示例代码的请求。首先,我需要查看用户提供的引用内容,看看是否有相关的资源可以推荐。 用户提到了引用[1]中的《Activiti实战》示例源码,项目地址是https://gitcode.com/gh_mirrors/ac/activiti-in-action-codes,这是官方推荐的中文书籍,应该是一个很好的起点。另外,引用[2]提供了用户指南的链接http://activiti.org/userguide/index.html,这是官方的文档,适合系统学习。引用[4]提到了一个实战项目,结合Spring Boot和BPMN.js,项目地址在https://gitcode.com/gh_mirrors/van/van,这可能包含实际的代码示例,对用户有帮助。 接下来,我需要整理这些资源,分步骤指导用户如何学习和使用Activiti 7。可能需要包括官方文档学习、书籍推荐、示例项目、社区资源等部分。同时,用户可能还需要了解如何搭建环境,配置流程引擎,以及具体的代码示例。例如,引用[3]中提到了项目结构,可以指导用户如何组织代码,尤其是使用Vue和状态管理的部分,但用户可能更关注后端部分,所以可能需要结合引用[4]中的Spring Boot项目。 还需要确保回答结构清晰,分步骤说明,每个步骤引用相关的资料。比如第一步推荐官方文档,第二步推荐书籍和示例代码,第三步实战项目,第四步社区资源。同时,要生成相关问题,可能涉及性能优化、集成方法、与Camunda的区别等。 需要检查是否有遗漏的信息,比如用户可能对工作流的基本概念不太清楚,引用[5]中提到了工作流的定义,可能需要简要说明,但用户的问题更偏向实战,所以可能不需要深入。最后,确保所有引用正确标注,例如在推荐书籍时添加[^1],在用户指南处添加[^2]等。 总结,回答应该包括四个主要部分:官方文档、实战书籍、示例项目和社区资源,每个部分给出具体链接和说明,然后生成相关问题。需要确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。最后检查是否符合用户的所有要求,包括结构清晰、引用正确、中文回答和相关问题。</think>### Activiti 7 实战教程与学习指南 #### 1. **官方文档与用户指南** - **官方用户指南**是系统学习Activiti 7的最佳起点,涵盖安装配置、API使用、流程设计等核心内容[^2]。 - 链接:http://activiti.org/userguide/index.html - 重点章节:流程定义部署、任务处理、表单集成、REST API。 - **关键概念**:BPMN 2.0规范、流程引擎架构、服务任务监听器。 #### 2. **实战书籍与示例代码** - 《Activiti实战》是官方推荐的中文教程,提供企业级流程开发案例和源码。 - 项目地址:https://gitcode.com/gh_mirrors/ac/activiti-in-action-codes - 内容示例: ```java // 部署流程定义 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/leave-request.bpmn20.xml") .deploy(); ``` - 涵盖场景:请假审批、订单处理、动态表单集成。 #### 3. **Spring Boot集成项目** - **van项目**结合Spring Boot与BPMN.js,提供低代码工作流解决方案[^4]: - 项目地址:https://gitcode.com/gh_mirrors/van/van - 技术栈: - 后端:Spring Boot + Activiti/Flowable - 前端:Vue3 + BPMN.js - 功能亮点: - RBAC权限控制 - 可视化流程设计器(基于引用[3]的组件结构) - 动态表单配置 #### 4. **社区资源与工具** - **扩展配置**:通过`resources/`目录下的JSON文件适配Activiti扩展属性[^3]。 - **调试技巧**: - 使用`activiti-app.war`快速搭建测试环境。 - 日志分析:启用`DEBUG`级别日志追踪流程实例状态。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值