第六篇Camunda系列-流程变量
Posted 波波烤鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六篇Camunda系列-流程变量相关的知识,希望对你有一定的参考价值。
流程变量
流程变量可以用将数据添加到流程的运行时状态中,或者更具体地说,变量作用域中。改变实体的各种API可以用来更新这些附加的变量。一般来说,一个变量由一个名称和一个值组成。名称用于在整个流程中识别变量。例如,如果一个活动(activity)设置了一个名为 var 的变量,那么后续活动中可以通过使用这个名称来访问它。变量的值是一个 Java 对象。
1.运行时变量
流程实例运行时的变量,存入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);
注意:由于流程实例结束时,对应在运行时表的数据跟着被删除。所以查询一个已经完结流程实例的变量,只能在历史变量表中查找。
当然运行时变量我们也可以根据对应的作用域把他分为全局变量
和局部变量
.
1.1 全局变量
流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 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);
1.2 局部变量
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 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");
2.历史变量
历史变量,存入act_hi_varinst
表中。在流程启动时,流程变量会同时存入历史变量表中;在流程结束时,历史表中的变量仍然存在。可理解为“永久代”的流程变量。
获取已完成的、id为’XXX’的流程实例中,所有的HistoricVariableInstances
(历史变量实例),并以变量名排序。
historyService.createHistoricVariableInstanceQuery()
.processInstanceId("XXX")
.orderByVariableName.desc()
.list();
以上是关于第六篇Camunda系列-流程变量的主要内容,如果未能解决你的问题,请参考以下文章