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

activiti流程引擎的服务

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

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

 

流程启动

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

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

启动流程的方式有多种,我们首先通过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表,已经有了流程实例的记录: 

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

另外在历史表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增加了一条记录

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

流程变量的value值不仅限于String类型,对象也是可以作为变量的值传递进去的,例如param2的值。当然对象必须实现Serializable接口。对象变量的值会被放到act_ge_bytearray表存储。

 

activiti数据库表:

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

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章