第七节: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);
    
  3. 查看结果:
    结果

四、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>
    
  2. 使用代码获取变量
    	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);
    
  3. 结果:
    结果

欢迎访问我的个人博客:学教府

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值