前言
在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
目录
目录
前言
一、RuntimeService 是什么?
二、使用步骤
1.产生方式
2.启动流程
2.1代码实现
2.2生成的表数据
3.流程的激活和挂起
4.流程实例的查询
5.流程对象的查询
6.流程实例的删除
7.流程实例的状态查询
总结
一、RuntimeService 是什么?
RuntimeService 提供了很多启动流程的API,并且全部的命名规则为startProcessInstanceByXX,比如按照流程定义key值启动的,按照流程定义Id启动的等等。
二、使用步骤
1.产生方式
代码如下(示例):
RuntimeService runtimeService = processEngine.getRuntimeService();
2.启动流程
2.1代码实现
//获取service
RuntimeService runtimeService = processEngine.getRuntimeService();
//流程实例key启动
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("300");
在Activiti中,启动了一个流程后,就会创建一个流程实例(ProcessInstance),简单来说流程实例就是根据一次(一条)业务数据用流程驱动的入口 Execution的含义就是一个流程实例(ProcessInstance)具体要执行的过程对象。 两者的对象映射关系:ProcessInstance(1)—>Execution(N),其中N >= 1。 每个流程实例至少会有一个执行流(execution),如果流程中没有分支,则N=1,如果流程中出现了分支,则N>1
2.2生成的表数据
当启动一个流程产生流程实例后:
5.2.1 会在act_ru_execution表产生一条数据,代表正在执行的流程对象,
需要理解的字段
ID_ |
正在执行的流程对象的ID |
PROC_INST_ID_ |
流程实例ID |
PROC_DEF_ID_ |
流程定义ID |
ACT_ID_ |
执行到流程任务节点的ID |
5.2.2 会在流程实例的历史表act_hi_procinst中产生一条数据
需要理解的字段
ID_ |
正在执行的流程对象的ID |
PROC_INST_ID_ |
流程实例ID |
PROC_DEF_ID_ |
流程定义ID |
ACT_ID_ |
执行到流程任务节点的ID |
START_TIME_ |
流程开始时间 |
END_TIME_ |
流程结束时间 |
5.2.3 流程启动后,会在act_ru_task任务表生成一条数据(经常用的表),存储的流程上正在运行的节点任务
EXECUTION_ID_ |
流程对象id(act_ru_execution表id) |
PROC_INST_ID_ |
流程实例id |
PROC_DEF_ID_ |
流程定义id |
NAME_ |
当前流程任务的名称(流程图任务节点自己设置的name) |
TASK_DEF_KEY_ |
当前流程任务的key(流程图任务节点自己设置的key) |
ASSIGNEE_ |
当前任务代办人 |
CREATE_TIME_ |
任务节点的创建时间 |
5.2.4 act_hi_taskinst历史任务实例表,流程所有节点任务历史存储表
生成时机:流程在act_ru_task创建的时候,同时也会在act_hi_taskinst创建一条。endtime暂时还没有。
需要理解的字段同 5.2.3
5.2.5 act_hi_actinst历史所有经过的活动。某个流程实例历史上经过的全部活动节点
所有的活动,在这表中都会有数据
3.流程的激活和挂起
/**
* 流程实例的挂起和激活
*/
@Test
public void suspendAndActivateProcessInstanceTest(){
String processDefinitionKey = "activit_key";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).variableValueEquals("title","启动流程").singleResult();
String processInstanceId = processInstance.getProcessInstanceId();
System.out.println("流程实例是否挂起: " +processInstance.isSuspended());
//挂起流程实例
runtimeService.suspendProcessInstanceById(processInstanceId);
//验证是否挂起
Assert.assertTrue(runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().isSuspended());
//激活流程实例
runtimeService.activateProcessInstanceById(processInstanceId);
//验证是否激活
Assert.assertTrue(!runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().isSuspended());
}
4.流程实例的查询
/**
* 流程实例查询对象 的创建。
*/
@Test
public void qrocessInstanceQuery() {
String processDefinitionKey = "activit_key";//流程定义key
//创建 流程实例查询对象
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
//查询出多条记录
List<ProcessInstance> processInstanceList = processInstanceQuery
.processDefinitionKey(processDefinitionKey)//根据流程定义的key来查询
//.processDefinitionVersion(1)//根据流程定义的版本号查询
//.processDefinitionId("activit_key:4:1") //根据流程定义的id查询
.orderByProcessDefinitionKey() //按照流程定义key的排序
.desc() //降序
.list();
for (ProcessInstance processInstance : processInstanceList) {
System.out.println("流程实例ID: " + processInstance.getId());
System.out.println("正在活动的节点ID: " + processInstance.getActivityId());
System.out.println("流程定义的ID: " + processInstance.getProcessDefinitionId());
}
//如果能确定数据库查询的结果只有一条记录,可以采用 singleResult
ProcessInstance processInstance = processInstanceQuery
.processDefinitionKey(processDefinitionKey)//根据流程定义的key来查询
.singleResult();
System.out.println("流程实例ID: " + processInstance.getId());
System.out.println("正在活动的节点ID: " + processInstance.getActivityId());
System.out.println("流程定义的ID: " + processInstance.getProcessDefinitionId());
//查询激活的流程实例
List<ProcessInstance> activateList = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).active().list();
Assert.assertTrue(activateList.size()>0);
//相反 查询挂起的流程则是
List<ProcessInstance> suspendList = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).suspended().list();
Assert.assertTrue(suspendList.size()==0);
//根据变量来查询
// 根据title='启动流程',以及processDefinitionKey来作为查询条件进行查询
List<ProcessInstance> varList = runtimeService.createProcessInstanceQuery().variableValueEquals("title","启动流程").list();
Assert.assertTrue(varList.size()>0);
}
5.流程对象的查询
RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流
/**
* 执行流(流程对象)的查询
* 执行流的查询
* RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流
*/
@Test
public void executionQueryTest(){
String processDefinitionKey = "activit_key";
List<Execution> executionList = runtimeService.createExecutionQuery().processDefinitionKey(processDefinitionKey).list();
Assert.assertTrue(executionList.size()>0);
}
6.流程实例的删除
/**
* 流程实例的删除
*/
@Test
public void deleteProcessInstanceTest(){
String processDefinitionKey = "activit_key";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).variableValueEquals("title","启动流程").singleResult();
String processInstanceId = processInstance.getProcessInstanceId();
runtimeService.deleteProcessInstance(processInstanceId,"删除测试");
}
7.流程实例的状态查询
注:在流程执行的过程中,创建的流程实例ID在整个流程执行过程中都不会变化,当流程结束后,流程实例会在正在执行的流程对象表中删除act_ru_execution
/**
* 流程实例的状态查询(就是查询流程正在执行,还是已经结束)
*
* 注:在流程执行的过程中,创建的流程实例ID在整个流程执行过程中都不会变化,当流程结束后,流程实例会在正在执行的流程对象表中删除act_ru_execution
*/
@Test
public void queryProcessInstanceState(){
String processDefinitionKey = "activit_key";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
if(processInstance!=null){
System.out.println("当前流程处在:"+processInstance.getActivityId());
}else{
System.out.println("当前流程已结束");
}
}
总结
RuntimeService 主要针对流程实例相关操作