zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【第六篇】Camunda系列-流程变量

流程变量 系列 Camunda 第六篇
2023-06-13 09:14:12 时间

流程变量

  流程变量可以用将数据添加到流程的运行时状态中,或者更具体地说,变量作用域中。改变实体的各种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();