歡迎訪問我的個人博客:學教府
一、概述
介紹: 在任務的執行過程中,會有很多的變量參數(比如請假任務需要天數等)。變量從作用域來分:本地變量和全局變量。
從類型區分:基本變量、自定義變量和BPMN自帶變量。
二、基本變量和自定義變量
- 基本變量是activiti自帶的類型,只需要調用taskService的setVariable方法設置就行。
- 編碼如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
//直接new一個任務,不是生產上的方式,此處只爲演示
String taskId = UUID.randomUUID().toString();
Task task = taskService.newTask(taskId);
task.setName("基本變量測試任務");
taskService.saveTask(task);
//給指定任務設置任務變量。此處變量類型爲String
taskService.setVariable(taskId,"variable1", "hello");
//查詢任務變量
Object variable1 = taskService.getVariable(taskId, "variable1");
System.out.println(variable1);
//關閉
processEngine.close();
System.exit(0);
- 查詢任務對應的數據庫:
- 查看任務變量:
- 自定義變量:是將對象進行序列化存儲到act_ge_bytearray中,然後在變量表act_ru_variable中引用
- 定義實體Person:
private String id;
private String username;
private String password;
- 變量設置編碼:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.newTask("1");
task.setName("自定義變量測試任務");
taskService.saveTask(task);
//給任務設置自定義變量,變量是序列化後保存的
Person person = new Person();
person.setId("1");
person.setUsername("xjf");
person.setPassword("123456");
taskService.setVariable(task.getId(),"person1",person);
//查詢任務變量
Person person1 = taskService.getVariable(task.getId(), "person1", Person.class);
System.out.println("查詢到的變量:" person1);
processEngine.close();
System.exit(0);
- 查看數據庫變量:
- 真正存儲的act_ge_bytearray:
三、本地變量和全局變量
**介紹:**本地變量是指在一個任務節點的變量,該變量只在當前節點有效,當該節點complete後會實效(在數據庫中被刪除)。全局變量是對該流程實例一直有效,可以隨時獲取。測試如下:
- 設計流程如下圖:
- 編碼如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
//發佈
Deployment deployment = repositoryService.createDeployment().addClasspathResource("variable.bpmn").deploy();
//獲取流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//創建流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("當前任務:" task.getName());
//設置任務本地變量:該變量只在當前任務節點有效
taskService.setVariableLocal(task.getId(),"date","2019-11-20");
//獲取本地變量
System.out.println("當前任務本地變量:" taskService.getVariableLocal(task.getId(), "date"));
//設置全局變量
taskService.setVariable(task.getId(),"days","9");
//可以查看數據庫,本地變量存在,complete之後再查看會沒有了
Thread.sleep(10000);
//當前任務結束
taskService.complete(task.getId());
System.out.println("============================分隔符===========================");
//繼續獲取下個任務
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("當前任務:" task.getName());
System.out.println("再次獲取上個任務的本地變量:" taskService.getVariableLocal(task.getId(), "date"));
System.out.println("獲取全局變量:" taskService.getVariable(task.getId(),"days"));
System.out.println("getVariableLocal方法獲取全局變量:" taskService.getVariableLocal(task.getId(),"days"));
processEngine.close();
System.exit(0);
- 查看結果:
四、BPMN文件變量
**介紹:**在bpmn文件中,我們可以根據bpmn規範直接加入變量,在使用時可以直接使用代碼獲取。由此可以減少代碼變量跟流程的耦合。測試如下:
- 設計bpmn文件(跟上面的bpmn文件一致,只是加了變量如下):
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
<!--此處爲變量對象-->
<dataObject id="personName" name="personName"
itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>dale</activiti:value>
</extensionElements>
</dataObject>
<startEvent id="_2" name="StartEvent"/>
<userTask activiti:exclusive="true" id="_3" name="請假填寫"/>
<userTask activiti:exclusive="true" id="_4" name="經理審批"/>
<endEvent id="_5" name="EndEvent"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
<sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
<sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
</process>
- 使用代碼獲取變量
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("dataobject.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
System.out.println(processDefinition.getId());
//獲取流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//獲取任務
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//獲取bpmn中帶的變量
System.out.println("變量:" taskService.getVariable(task.getId(), "personName"));
processEngine.close();
System.exit(0);
- 結果:
歡迎訪問我的個人博客:學教府