Activiti流程变量使用

本文是建立在流程定义,流程实例的基础上的,可以参阅流程定义流程实例。 本文主要给出了如何使用流程变量的demo,包含流程变量的设置、获取方法,设置实例级别、任务级别的流程变量的方法,主要的描述请查看代码以及代码上的注释。

import com.google.gson.Gson;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessVariablesTest {

    private Gson gson = new Gson();

    @Autowired
    private ProcessEngine processEngine;

    /**
     * 设置流程变量
     *  1.流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
     *  2.基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
     *  3.Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
     *  4.涉及到的表
     *      ACT_HI_VARINST    流程变量历史表
     *      ACT_RU_VARIABLE  正在执行的流程变量表
     *  5.RuntimeService对象可以设置流程变量和获取流程变量
     *  6.TaskService对象可以设置流程变量和获取流程变量
     *  7.流程实例启动的时候可以设置流程变量
     *  8.任务办理完成的时候可以设置流程变量
     *  9.流程变量可以通过名称/值的形式设置单个流程变量
     *  10.流程变量可以通过Map集合,同时设置多个流程变量
     *  11.Map集合的key表示流程变量的名称, Map集合的value表示流程变量的值
     *  12.setVariable和setVariableLocal的区别
     *      setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,
     *          而且可以看到TASK_ID的字段不会存放任务ID的值。
     *      setVariableLocal:
     *          1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,
     *              对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换
     *              前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到
     *              TASK_ID的字段会存放任务ID的值,例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,
     *              存放的值也是不同的。
     *          2:使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取
     *              不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时
     *              不能查询到需要的数据,此时需要查询历史的流程变量。
     */
    @Test
    public void setVariablesTest() {
        TaskService taskService = processEngine.getTaskService();
        String instanceId = "17501";
        Task task = taskService.createTaskQuery()
                .processInstanceId(instanceId)
                .singleResult();
        taskService.setVariable(task.getId(), "姓名", "张三");
        taskService.setVariable(task.getId(), "性别", "李四");

        Map<String, Object> variables = new HashMap<>();
        variables.put("key", "value");
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance pi = runtimeService.startProcessInstanceById("helloworld:5:32504", variables);
        runtimeService.setVariable(pi.getProcessInstanceId(), "key1", "value1");
        runtimeService.setVariables(pi.getProcessInstanceId(), variables);
        List<String> keys = new ArrayList<>();
        keys.add("key");
        Map map = runtimeService.getVariables(pi.getProcessInstanceId());
        System.out.println(gson.toJson(map));
    }

    /**
     * 获取流程变量
     *  1.流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
     *  2.使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
     *  3.Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,
     *    否则抛出异常。解决方案,固定序列化ID
     */
    @Test
    public void getVariablesTest() {
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processInstanceId("17501")
                .singleResult();
        String name = (String) taskService.getVariable(task.getId(), "姓名");
        String gender = (String) taskService.getVariable(task.getId(), "性别");
        System.out.println("姓名:" + name + "\t 性别:" + gender);
    }

    /**
     * 查询历史的流程变量
     */
    @Test
    public void getHisVariablesTest() {
        List<HistoricVariableInstance> instances = processEngine.getHistoryService()
                .createHistoricVariableInstanceQuery().variableName("姓名").list();
        instances.forEach(instance -> {
            System.out.println(instance.getVariableName() + "\t" + instance.getValue());
        });
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章