第七節:Activiti6.0——Task的變量使用

歡迎訪問我的個人博客:學教府

一、概述

介紹: 在任務的執行過程中,會有很多的變量參數(比如請假任務需要天數等)。變量從作用域來分:本地變量全局變量
從類型區分:基本變量自定義變量BPMN自帶變量

二、基本變量和自定義變量

  1. 基本變量是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);
  • 查詢任務對應的數據庫:
    任務
  • 查看任務變量:
    任務變量
  1. 自定義變量:是將對象進行序列化存儲到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後會實效(在數據庫中被刪除)。全局變量是對該流程實例一直有效,可以隨時獲取。測試如下:

  1. 設計流程如下圖:
    流程
  2. 編碼如下:
	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);
  1. 查看結果:
    結果

四、BPMN文件變量

**介紹:**在bpmn文件中,我們可以根據bpmn規範直接加入變量,在使用時可以直接使用代碼獲取。由此可以減少代碼變量跟流程的耦合。測試如下:

  1. 設計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>
  1. 使用代碼獲取變量
	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);
  1. 結果:
    結果

歡迎訪問我的個人博客:學教府

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