专栏首页指缝阳光第七节:Activiti6.0——Task的变量使用

第七节: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. 设计流程如下图:
  1. 编码如下:
	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. 结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Activiti6.0——个人开发经验总结

    我的一个集成项目:springboot集成activiti6.0 https://github.com/fanrendale/springboot-activ...

    凡人飞
  • 第三节:Activiti6.0——Query的API使用

    介绍:对于数据库的信息都可以使用Query接口提供的方法进行查询。此处介绍Query接口的所有API方法使用。为方便演示,使用的是act_id_group表。以...

    凡人飞
  • 第一节:实现Activiti6.0的第一个demo

    lib:存放需要使用的jar包,可从下面链接直接下载解压,记得加入将包加入项目中,如下: jar包提取码:c0zq

    凡人飞
  • Activiti6.0工作流编程讲义-安装和运行

    Activiti 的第一个正式版本发布于 2010 年 12 月 1 日,经过多年的发展,Activiti 已经成为一个较为成熟的工作流引擎,作为一个开源的工作...

    程序源代码
  • 第13节 常量的使用

    第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

    小尘哥
  • 变量类型测试函数的使用:七、is_resource的用法

    讲完PHP变量类型测试函数【is_object】的用法,今天来讲讲PHP变量类型测试函数【is_resource】的用法。

    大脸猫
  • js不使用第三方变量交换两个变量的方法

      除了第一种是运算顺序、最后一种是解构赋值,其它的方法主要的思路都是:先产生一个与这两个变量有关的一个新的值,然后重新计算。

    用户1149564
  • 不使用第三个变量,怎么交换两个变量的值?

    于是,我们开始翻阅各种武学宝典,功夫不负有心人!终于让我找到了!---->偷天换日!!

    moon聊技术
  • 第四节:Activiti6.0——使用zip、bpmn代码生成流程图的资源部署以及资源的查询

    说明:从存储服务RepositoryService可以获取发布生成器DeploymentBuilder,该生成器中可以调用添加资源的方法,有不同资源的添加,然后...

    凡人飞
  • 大数据干货系列(六)-Spark总结

    本文共计1611字,预计阅读时长八分钟 Spark总结 一、本质 Spark是一个分布式的计算框架,是下一代的MapReduce,扩展了MR的数据处理流程 二、...

    企鹅号小编
  • Flink面试通关手册

    2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark ...

    大数据真好玩
  • Flink面试通关手册

    2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark ...

    王知无-import_bigdata
  • Spark程序开发调优(后续)

    如果因为业务需要,一定要使用 shuffle 操作,无法用 map 类的算子来替代,那么尽量使用可以 map-side 预聚合的算子。

    木野归郎
  • 一个简易小工具,七牛Uploader for Octopress

    春节假期,带着电脑回家,蹭着邻居的网,除夕晚上用ruby写了一个简单的工具。安利一下,广而告之。

    技术小黑屋
  • 漫谈并发和并行:概述

    木东居士
  • 万字详解 Spark开发调优(建议收藏)

    在大数据计算领域,Spark 已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark 的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机...

    大数据老哥
  • Ansible playbook简单示例

    1、 YAML基本语法 YAML使用的Unicode字符。 使用空白字符未文件缩排来表示结构;不过不能使用跳格字符。 注解由#开始,可以出现在一行中的任何位置,...

    程裕强
  • OpenGL 从入门到成魔-第6章- Uniform 变量的使用

    注:参考自bilibili系列视频,OpenGL 从入门到成魔-第6章- Uniform 变量的使用https://www.bilibili.com/video...

    瑶瑶
  • 不使用第3个变量,实现两个数的对调

    Youth is a beautiful but also a time to go, it is the beginning of all the brigh...

    小Bob来啦

扫码关注云+社区

领取腾讯云代金券