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类型,对象也是可以作为变量的值传递进去的,当然对象必须实现Serializable接口。对象变量的值会被放到act_ge_bytearray表存储。
activiti数据库表:
activiti的数据库表有以下这些:
其实从命名就能大概看出这些表是什么意思。具体的含义,各位在后续的学习和实操过程中慢慢去理解比较好。这里稍微点一下:
- act_hi_xxx表示的是历史表,就是历史记录;
- act_ru_xxx表示运行时表,例如上面启动一个流程,可以在act_ru_execution找到一条正在运行的流程实例;
- act_re_xxx一般是静态表,包含流程部署、流程定义等;
- act_ge_xxx属于通用数据表
上一篇: 为导出数据库表结构设计的查询
下一篇: GreenDao数据库