流程变量可以用将数据添加到流程的运行时状态中,或者更具体地说,变量作用域中。改变实体的各种API可以用来更新这些附加的变量。一般来说,一个变量由一个名称和一个值组成。名称用于在整个流程中识别变量。例如,如果一个活动(activity)设置了一个名为 var 的变量,那么后续活动中可以通过使用这个名称来访问它。变量的值是一个 Java 对象。
流程实例运行时的变量,存入act_ru_variable表中。在流程实例运行结束时,此实例的变量在表中删除。在流程实例创建及启动时,可设置流程变量。所有的startProcessInstanceXXX
方法都有一个可选参数用于设置变量。例如,RuntimeService
中
ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);
也可以在流程执行中加入变量。例如,(RuntimeService):
void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);
读取变量方法:
Map<String, Object> getVariables(String executionId);
Map<String, Object> getVariablesLocal(String executionId);
Map<String, Object> getVariables(String executionId, Collection<String> variableNames);
Map<String, Object> getVariablesLocal(String executionId, Collection<String> variableNames);
Object getVariable(String executionId, String variableName);
<T> T getVariable(String executionId, String variableName, Class<T> variableClass);
注意:由于流程实例结束时,对应在运行时表的数据跟着被删除。所以查询一个已经完结流程实例的变量,只能在历史变量表中查找。
当然运行时变量我们也可以根据对应的作用域把他分为全局变量
和局部变量
.
流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量
注意:如: Global变量:userId(变量名)、zhangsan(变量值)
global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。
案例:
定义监听器
public class MySecondListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
// 获取所有的流程变量
Map<String, Object> variables = delegateTask.getVariables();
Set<String> keys = variables.keySet();
for (String key : keys) {
Object obj = variables.get(key);
System.out.println(key + " = " + obj);
if(obj instanceof String){
// 修改 流程变量的信息
// variables.put(key,obj + ":boge3306"); 直接修改Map中的数据 达不到修改流程变量的效果
delegateTask.setVariable(key,obj + ":boge3306");
}
}
}
}
设计流程
案例代码:
@SpringBootTest(classes = Application.class)
public class AssigneeTaskTest {
@Autowired
RepositoryService repositoryService;
@Autowired
RuntimeService runtimeService;
@Autowired
TaskService taskService;
/**
* 部署流程
*/
@Test
public void deployFlow(){
Deployment deploy = repositoryService.createDeployment()
.name("请假流程-监听器")
.addClasspathResource("flow/04-任务分配-监听器分配.bpmn")
.deploy();
System.out.println("deploy.getId() = " + deploy.getId());
}
/**
* 启动流程实例
*/
@Test
public void startFlow(){
String processDefId = "Process_08kf7mp:1:d154c0f5-326d-11ed-841a-c03c59ad2248";
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId);
System.out.println("processInstance.getId() = " + processInstance.getId());
}
/**
* 启动流程实例,绑定对应的流程变量
*/
@Test
public void startFlowVariables(){
String processDefId = "Process_1t425hs:1:539f152d-326a-11ed-ab57-c03c59ad2248";
// 声明一个 Map 集合
Map<String,Object> map = new HashMap<>();
map.put("user1","demo");
// 启动流程实例,同时绑定对应的流程变量信息
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId,map);
System.out.println("processInstance.getId() = " + processInstance.getId());
}
/**
* 流程审批
*/
@Test
public void completeTask(){
taskService.complete("29a0614c-3267-11ed-a030-c03c59ad2248");
}
/**
* 流程审批
* 同样需要绑定对应的流程变量的值
*/
@Test
public void completeTaskVariables(){
// 声明一个 Map 集合
Map<String,Object> map = new HashMap<>();
map.put("user2","demo");
taskService.complete("dd013840-326a-11ed-b589-c03c59ad2248",map);
}
}
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。Local 变量名也可以和 global 变量名相同,没有影响。
我们通过RuntimeService 设置的Local变量绑定的是 executionId。在该流程中有效
/**
* 设置Local流程变量
*/
@Test
public void setVariableLocal(){
String executionId = "368f9fdc-3317-11ed-871d-c03c59ad2248";
runtimeService.setVariableLocal(executionId,"orderId","10006");
runtimeService.setVariableLocal(executionId,"user2","波波烤鸭1");
}
我们通过TaskService设置的Local变量的作用域是和TaskId绑定的,作用域就在这一个Task生命周期中。
@Test
public void taskLocalVariables(){
taskService.setVariableLocal("7eb1b34b-3318-11ed-b9e6-c03c59ad2248","user2","波哥66666");
}
历史变量,存入act_hi_varinst
表中。在流程启动时,流程变量会同时存入历史变量表中;在流程结束时,历史表中的变量仍然存在。可理解为“永久代”的流程变量。
获取已完成的、id为’XXX’的流程实例中,所有的HistoricVariableInstances
(历史变量实例),并以变量名排序。
historyService.createHistoricVariableInstanceQuery()
.processInstanceId("XXX")
.orderByVariableName.desc()
.list();