说明,子流程 -- 即子执行流
activiti _ru_ 即 Runtime这种表都是保存运行时即流程运行时,即流程没走完end
节点时数据,会随着流程流转的节点随时变化的,
act_ru_execution -- 保存运行时 当前节点 下的 主流程(主执行流)和子执行流 数据
act_ru_task -- 保存此时 正在流转即当前节点的数据(子执行流 任务)
activiti ProcessInstance(流程实例) 和 Execution(执行流)
ProcessInstance 流程实例,是主执行流 继承Execution
启动流程,会创建流程实例,此是会在act_ru_execution中保存数据(主流程(主执行流)数据、子执行流数据--里面是保存当前节点下的主流程数据、子执行流数据),
如果只有一个流程分支的话,还会在此表中创建一条子执行流数据,会引用主流程数据的id,
如果有多个分支就会创建多个子执行流数据
如图,一个分支的流程
/**
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
* 测试 一个流程分支 act_ru_execution中保存数据(主流程数据、子执行流数据)情--
* -- 如果是一个流程分支,会产生一个主流程数据,和创建一条子执行流数据,会引用主流程数据的id,
*/
public void oneProTest(){
数据库act_ru_execution表 中生成数据如下图
如图,多个分支的流程
/**
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
* 测试 多个流程分支 act_ru_execution中保存数据(主流程数据、子执行流数据)情--
* -- 如果是多个流程流程分支,会产生一个主流程数据,和创建多条子执行流数据,都会引用主流程数据的id,
*/
数据库 act_ru_execution表 中生成数据如下图
startProcessInstanceById :查询参数Deployment的id
startProcessInstanceByKey :查询参数 act_re_procdef的KEY_即manypro.bpmn <process id="myProcess" 的id
startProcessInstanceByMessage : 查询参数 待定
项目结构如图
/** 设置与查询流程参数
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
*测试子执行流taskA设置一个本地参数,测试子执行流taskB设置一个本地参数,再流转到taskC
*时,两个执行流taskA和taskB都执行完毕(complete),只剩下一个主流程和一个子执行流(观察 act_ru_execution表--查此时只剩下一个主流程和一个子执行流
*在流转到taskC之前,即在taskA和taskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskA和taskB),
*此时获取taskA和taskB设置的参数,发现taskA设置的本地参数获取出来为null,全局参数可正常获取
*/
ProTest.java
package com.xiangshuai.act.c11;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.event.logger.handler.TaskAssignedEventHandler;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.w3c.dom.ls.LSInput;
/**
* * @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤7-Activiti启动流程
* 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤7-Activiti启动流程
*
*
* */
public class ProTest {
public static void main(String[] args) {
//manyProTest();
proVarScopeTest();
}
/**
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
* 测试 一个流程分支 act_ru_execution中保存数据(主流程数据、子流程数据)情--
* -- 如果是一个流程分支,会产生一个主流程数据,和创建一条子流程数据,会引用主流程数据的id,
*/
public static void oneProTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
//部署流程
Deployment dep = rs.createDeployment().addClasspathResource("onepro.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程实例
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
}
/**
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
* 测试 多个流程分支 act_ru_execution中保存数据(主流程数据、子流程数据)情--
* -- 如果是多个流程流程分支,会产生一个主流程数据,和创建多条子流程数据,都会引用主流程数据的id,
*/
public static void manyProTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
//部署流程
Deployment dep = rs.createDeployment().addClasspathResource("manypro.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程实例
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
}
/** 设置与查询流程参数
* activiti ProcessInstance(流程实例) 和 Execution(执行流)
*测试子执行流taskA设置一个本地参数,测试子执行流taskB设置一个本地参数,再流转到taskC
*时,两个执行流taskA和taskB都执行完毕(complete),只剩下一个主流程和一个子执行流(观察 act_ru_execution表--查此时只剩下一个主流程和一个子执行流
*在流转到taskC之前,即在taskA和taskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskA和taskB),
*此时获取taskA和taskB设置的参数,发现taskA设置的本地参数获取出来为null,全局参数可正常获取
*/
public static void proVarScopeTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
//部署流程
Deployment dep = rs.createDeployment().addClasspathResource("provar.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程实例
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
/*
断点观察act_ru_execution表在流转到taskC之前,即在taskA和taskB时未执行complete,之前,act_ru_execution表表有一个主流程和两个子执行流taskA和taskB
act_ru_task表 有子执行任务 TaskA和taskB
*/
// 查询此时正在执行的流程任务 act_ru_task表-- 启动流程实例后,自动跳到下一个节点任务,即两子执行流任务节点 ,
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
System.out.println(list.size());
list.forEach((task)->{
if("taskA".equals(task.getName())){//遍历如果是taskA 节点,设局部变量 taskVarA
taskService.setVariableLocal(task.getId(), "taskVarA", "taskA节点上设置的局部变量");//在任务上设置变量。 setVariable(String taskId, String variableName, Object value)
}
if("taskB".equals(task.getName())){//遍历如果是taskB 节点,设全局变量 taskVarB
taskService.setVariable(task.getId(), "taskVarB", "taskB节点上设置的全局变量");//在任务上设置变量。 setVariable(String taskId, String variableName, Object value)
}
});
list.forEach((task)->{//将两子执行流全部执行完,流转到taskC节点
taskService.complete(task.getId());
});
/*
断点观察act_ru_execution 执行完taskA和taskB(complete) 此时在taskC,观察act_ru_execution表剩下一个主流程和一个子执行流,act_ru_task表
只剩下执行任务taskC
*/
//获取taskA和taskB设置的参数
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获取此时的流程节点,即taskC
System.out.println("taskVarA"+taskService.getVariable(task.getId(), "taskVarA"));//getVariableLocal(String taskId, String variableName)
System.out.println("taskVarA"+taskService.getVariable(task.getId(), "taskVarB"));//getVariableLocal(String taskId, String variableName)
//输出结果 taskVarAnull
//taskVarAtaskB节点上设置的全局变量
taskService.complete(task.getId());
/*
断点观察act_ru_execution 执行完taskC(complete),观察act_ru_execution表剩下一个主流程和一个子执行流,act_ru_task表
全空了,也证明了 activiti _ru_ 即 Runtime这种表都是保存运行时即流程运行时,即流程没走完end
节点时数据,会随着流程流转的节点随时变化的,
act_ru_execution -- 保存运行时 当前节点 下的 主流程和一个子执行流 数据
act_ru_task -- 保存此时 正在流转即当前节点的数据(子执行流 数据)
*/
}
}