《Activiti/Flowable  深入BPM工作流》-什麼是流程變量?

 

 

           《Activiti/Flowable  深入BPM工作流》-什麼是流程變量?

 

 

一. 問題: 


       1. 什麼是流程變量?

       2. 什麼是global流程變量, local變量?

       3.當前流程實例如何設置?

 

 

二. 詳情

     

 1. 什麼是流程變量?

           解答: 流程 的運轉需要靠流程變量,業務系統和activiti結合, 流程變量就是在activiti管理工作流是根據管理需要而設置的變

量.例如在請假流程流轉時,請假大於三天則由總經理審覈,否則由人事直接審覈,請假天數就可以設置爲流程變量,在流程流轉時使

用.

 

注意: 

    1.1.  爲什麼不建議通過activiti的api查詢流程變量來實現業務查詢?

解答: 雖然流程變量中可用存儲業務數據,可用通過activiti的api查詢流程變量從而實現 查詢業務數據, 但是不建議這麼使用, 因爲業務數據查詢由業務系統負責,

activiti設置流程變量是爲了流程執行需要而創建的.

 

   1.2.  爲什麼用pojo存儲到流程變量,一定要實現序列化接口Serializable?

解答: 爲了防止由於新增字段無法反序列化,需要生產serialVersionID.

 

   1.3.  流程變量的作用域有哪些?

流程變量默認作用域是一個流程實例(processInstance), 也可以是一個任務(task)或一個執行實例(execution). 這三個作用域流程實例的範圍最大,成Global變量.

任務和執行實例僅僅是針對一個任務和一個執行實例範圍,範圍沒有流程實例大,成爲local變量.

 

   特點:

     1.  global變量中變量名不能重複. 設置相同名稱的變量,後設置的值會覆蓋前面的變量值.

     2. Local變量名可以重複,也可以和global名相同.  local變量由於在不同任務或不同的執行實例中, 作用域互不影響,變量名可以

相同,沒有影響.

 

 

2. 什麼是global流程變量? global流程變量 案例

請假流程

(1). 需求

   員工創建請假申請單, 由部門經理審覈,部門經理審覈通過三天及三天以下由人事經理直接審覈, 否則由總經理審覈, 總經理審覈通過再由人事經理存檔.

流程圖如下: holiday.bpmn

 

(2). 流程定義

請假大於等於三天連線條件:

 

請假天數小於三天連線條件:

 

(3). 設置global流程變量:

  在部門經理審覈設置流程變量, 變量值爲請假單信息(包括請假天數),部門經理審覈後可根據流程變量的值來覺得流程走向.

下面是具體的code實現

holiday.bpmn部署,啓動及任務辦理設置.

// 新的請假流程定義的部署
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 得到 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday.bpmn")
//                .addClasspathResource("studentHoliday.png")
                .name("請假流程2020-5-20")
                .deploy();

        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
        System.out.println(deploy.getKey());
    }

 

// 啓動流程實例,同時還要設置流程變量的值
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 3.流程定義的key問題.
        String processDefinitionKey = "myProcess_1";

        // 初始化
        Map<String, Object> map = new HashMap<String, Object>();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        holiday.setHolidayName("請假審批 2020-5-20");
        map.put("holiday", holiday);

        // 4.啓動流程實例,兵器而設置變量的值
        //runtimeService.startProcessInstanceByKey("myProcess_1");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,map);

        // 5.輸出實例信息;
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
        System.out.println(processInstance.getId());
    }

 

任務變量是設置

  在完成任務是設置流程變量, 流程變量只有在該流程完成後其他節點纔可能使用該變量,它的作用域是整個流程實例,如果設置的流程變量的key在流程實例中已經存在相同名字,則後設置的變量覆蓋前面設置的變量.

這裏需要在創建請假單任務完成(以下是通過當前任務id設置任務的)

// 處理任務---zhangsan   / lisi --判斷流程變量的請假天數, 目前是1天-->分支:人事經理
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 TaskService
        TaskService taskService = processEngine.getTaskService();

        // 3. 查詢當前用戶是否有任務
        String taskId = "2508";
//        String key="myProcess_1";
//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey(key)
//                .taskAssignee("zhangsan").singleResult();


        Map<String, Object> map = new HashMap<String, Object>();
        Holiday holiday = new Holiday();
        holiday.setNum(2F);
        holiday.setHolidayName("請假審批 2020-5-19");
        map.put("holiday", holiday);


        // 4. 判斷task!=null,說明當前用戶有任務
        if(taskId!=null){
            taskService.complete(taskId,map);
            System.out.println("任務執行完成");
        }
    }

 

    3. 當前流程實例如何設置?

 解答: 需要通過當前任務設置流程變量, 需要指定當前任務id, 如果當前執行的任務id不存在則拋出異常. 任務辦理時也是通過map<key,value>設置流程變量,一次可以設置多個變量.

通過流程實例id設置全局變量, 該流程實例必須是未執行完成的.

 

public void setGlobalVariableByExecutionId(){
    //當前流程實例執行 id,通常設置爲當前執行的流程實例
    String executionId="2501";
    RuntimeService runtimeService = processEngine.getRuntimeService();
    Holiday holiday = new Holiday();
    holiday.setNum(3);
    //通過流程實例 id設置流程變量
    runtimeService.setVariable(executionId, "holiday", holiday);
    //一次設置多個值
    //runtimeService.setVariables(executionId, variables)
   }

 

注意: 

   executionId必須當前未結束的流程實例的執行id,通常用此id設置流程實例的id,

   當然也可以通過RuntimeService.getVariable()獲取流程變量.

 

 

 

 

 

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