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());
        });
    }
}

 

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