欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动

程序员文章站 2024-03-21 10:08:52
...

activiti流程引擎的服务

activit流程引擎为用户提供了好几种服务及api,用于查询和操作流程,通过ProcessEngine的getXXXService方法可以获取。现在对几个接下来会用得比较多的进行介绍:

  • RepositoryService:主要用于查询和操作与部署有关的api。在流程部署的章节中,就是通过这个服务进行流程部署的;
  • RuntimeService:流程实例的操作与查询。包括流程实例的查询、启动等;
  • TaskService:任务的查询、完成、设置处理人等;
  • HistoryService:历史流程实例、活动实例、任务实例等查询与删除;
  • ManagementService:命令和job执行。由于activiti采用命令模式,实质上很多流程引擎的操作最后是封装成命令执行的,也可以用户自行去调用已有的命令或自定义命令。job主要是和异步执行有关。

 

流程启动

上一章部署完毕后,我们现在可以把上一章的部署进行启动

首先我们查看一下数据库里流程定义表act_re_procdef的情况:

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动

启动流程的方式有多种,我们首先通过id来启动

package ProcessStart;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class App {
	
	private ProcessEngine pe;

	public void getFromProcessEngineConfiguration() {
		ProcessEngineConfiguration pec = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
		pe = pec.buildProcessEngine();
	}
	
	public void startProcessById() {
		RuntimeService runtimeService = pe.getRuntimeService();
		ProcessInstance pi = runtimeService.startProcessInstanceById("firstBpmProcess:1:4");
		System.out.println("流程定义ID:" + pi.getProcessInstanceId());
		System.out.println("流程实例ID:" + pi.getId());
	}

	public static void main(String[] args) {
		App app = new App();
		app.getFromProcessEngineConfiguration();
		app.startProcessById();
	}
}

运行之后,我们可以看看数据库表的变化。先看看act_ru_execution表,已经有了流程实例的记录。 activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动

接着我们看看act_ru_task表,因为流程启动后从开始节点走向userTask1节点,因此在该表会有一个任务记录:

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动另外在历史表act_hi_actinst、act_hi_procinst和act_taskinst表也有变化,可以自行查看。

除了通过id来启动流程,还可以通过key的方式:

public void startProcessByKey() {
		RuntimeService runtimeService = pe.getRuntimeService();
		ProcessInstance pi = runtimeService.startProcessInstanceByKey("firstBpmProcess");
		System.out.println("流程定义ID:" + pi.getProcessInstanceId());
		System.out.println("流程实例ID:" + pi.getId());
	}

key的值就是我们流程文档中process的id值。具体执行的效果就不展示了。

 

关于流程变量

每个流程实例,是可以为其添加变量的。举个例子,例如我想把这个流程节点的一些参数传给下一个节点,那么可以在这个节点添加到流程变量上,当流程运行下一个节点时,从下一个节点取出来。常见的流程指定下环节处理人,就是先把下环节的处理人作为变量添加,待节点提交流程后,通过监听器获取变量并设置到下个环节处理人上。这里先展示流程启动时添加变量的结果:

	public void startProcessByIdWithVars() {
		RuntimeService runtimeService = pe.getRuntimeService();
		Map<String, Object> vars = new HashMap<String, Object>();
		Student student = new Student();
		vars.put("param1", "value1");
		vars.put("param2", student);
		ProcessInstance pi = runtimeService.startProcessInstanceById("firstBpmProcess:1:4", vars);
		System.out.println("流程定义ID:" + pi.getProcessInstanceId());
		System.out.println("流程实例ID" + pi.getId());
	}

运行之后,可以看到act_ru_execution增加了一条记录

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动

同时我们可以查看act_ru_variable表,这里记录了流程变量。

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动 流程变量的value值不仅限于String类型,对象也是可以作为变量的值传递进去的,当然对象必须实现Serializable接口。对象变量的值会被放到act_ge_bytearray表存储。

 

activiti数据库表:

activiti的数据库表有以下这些:

activiti学习(三)——activiti流程引擎的服务、数据库表与流程启动

其实从命名就能大概看出这些表是什么意思。具体的含义,各位在后续的学习和实操过程中慢慢去理解比较好。这里稍微点一下:

  • act_hi_xxx表示的是历史表,就是历史记录;
  • act_ru_xxx表示运行时表,例如上面启动一个流程,可以在act_ru_execution找到一条正在运行的流程实例;
  • act_re_xxx一般是静态表,包含流程部署、流程定义等;
  • act_ge_xxx属于通用数据表

 

相关标签: Activiti