03.activiti第一天: 11-12.流程变量

本文深入探讨Activiti流程引擎的使用,包括流程图绘制、流程变量设置与获取、流程实例启动及部署流程定义的方法。同时,解析流程变量的作用及其在业务参数传递、任务流向指定和动态任务办理人设定中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目: cn.itcast.d_processVariables

一. 画流程图

new -> Other -> Activiti Diagram
    > 填写File name
在这里插入图片描述

二. 配置流程图属性Properties

1. 修改流程图 相关属性配置
    点击空白处 > 点击Properties窗口
在这里插入图片描述
2. 修改任务节点 相关属性配置
    点击任务节点
在这里插入图片描述
在这里插入图片描述
: 如果保存之后发现没有自动生成 .png图片, 需要配置 Preference > Activiti > Save 勾选复选框
在这里插入图片描述

三. 流程变量

    流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。
    流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
在这里插入图片描述
在这里插入图片描述

作用:
    1. 用来传递业务参数
    2. 指定连线完成任务(流程走向: 同意?驳回?)
    3. 动态指定任务的办理人

四. 部署流程定义(3种方式)

1. 加载资源文件的几种方式
在这里插入图片描述
2. 部署流程定义

	@Test
	public void deploymentProcessDefinition_inputStream(){
		/**方式二: 加载zip资源*/
//		InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/processVariables.zip");
//		ZipInputStream zipInputStream = new ZipInputStream(in);
		
		/**方式三: 通过输入流(InputStream)加载bpmn, png资源*/
		InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
		InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
		Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
						.createDeployment()//创建一个部署对象
						.name("流程定义")//添加部署的名称
						/**方式一: 从classpath的资源中加载,一次只能加载一个文件(简单,推荐)*/
//						.addClasspathResource("diagrams/processVariables.bpmn")
//						.addClasspathResource("diagrams/processVariables.png")
//						.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
						.addInputStream("processVariables.bpmn", inputStreambpmn)//使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署
						.addInputStream("processVariables.png", inputStreampng)//使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署
						.deploy();//完成部署
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}

3. 部署对象和流程定义相关表

  • 部署对象表 act_re_deployment
    在这里插入图片描述
  • 流程定义表 act_re_procdef
    在这里插入图片描述
  • 资源文件表 act_ge_bytearray
    在这里插入图片描述
  • 主键生成策略表 act_ge_property(没有什么变化, 还是初始化时的3条数据)
    在这里插入图片描述

五. 启动流程实例

	/**启动流程实例*/
	@Test
	public void startProcessInstance(){
		//流程定义的key
		String processDefinitionKey = "processVariables";
		ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
						.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());//流程实例ID    
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID  
	}

    流程启动后, 相关表的数据变化(流程实例, 执行对象, 任务, 活动节点)

  • 正在执行的执行对象表 act_ru_execution
    在这里插入图片描述
  • 历史流程实例表 act_hi_proinst
    在这里插入图片描述
  • 正在执行的任务表 act_ru_task
    在这里插入图片描述
  • 历史任务表 act_hi_taskinst (1条数据)
    在这里插入图片描述
  • 历史活动节点表 act_hi_actinst (2条数据)
    在这里插入图片描述

六. 模拟设置和获取流程变量的场景

	/**模拟设置和获取流程变量的场景(RuntimeService和TaskService都可以)*/
	public void setAndGetVariables(){
		/**与流程实例,执行对象(正在执行)*/
		RuntimeService runtimeService = processEngine.getRuntimeService();
		/**与任务(正在执行)*/
		TaskService taskService = processEngine.getTaskService();
		
		/** 1.设置流程变量--RuntimeService */
		// ①使用执行对象ID, 流程变量名, 设置流程变量(一次只能设置一个值)
//		runtimeService.setVariable(executionId, variableName, value)
		// ②执行对象ID, 流程变量Map<name,value>集合(一次可设置多个值)
//		runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
		// ③使用 序列化 后的JavaBean
//	    runtimeService.setVariable(executionId, variableName, JavaBean)
		
		/** 2.设置流程变量--TaskService */
		// 和RuntimeService一样, 只是执行对象ID(executionId)变成任务ID(taskId)
//		taskService.setVariable(taskId, variableName, value)
//		taskService.setVariables(taskId, variables)
//		taskService.setVariable(executionId, variableName, JavaBean)
		
		/** 3.设置流程变量--RuntimeService启动流程时 */
//		runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合
		/** 4.设置流程变量--TaskService完成任务时 */
//		taskService.complete(taskId, variables)//完成任务的同时,设置流程变量,用Map集合

		
		/** 1.获取流程变量--RuntimeService */
		//使用执行对象ID和流程变量的名称, 获取流程变量的值
//		runtimeService.getVariable(executionId, variableName)
		//使用执行对象ID, 获取所有的流程变量,将流程变量放置到Map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
//		runtimeService.getVariables(executionId)
		//使用执行对象ID,获取流程变量的值,将要获取的流程变量的名称存放到集合中,返回指定流程变量键值,存放到Map集合中
//		runtimeService.getVariables(executionId, variableNames)
		
		/** 2.获取流程变量--TaskService */
		// 和RuntimeService一样, 只是执行对象ID(executionId)变成任务ID(taskId)
//		taskService.getVariable(taskId, variableName)
//		taskService.getVariables(taskId)
//		taskService.getVariables(taskId, variableNames)
		
	}

七. 设置流程变量

	/**设置流程变量*/
	@Test
	public void setVariables(){
		/**与任务(正在执行)*/
		TaskService taskService = processEngine.getTaskService();
		//任务ID
		String taskId = "2104";
		/**一:设置流程变量,使用基本数据类型*/
//		taskService.setVariableLocal(taskId, "请假天数", 5);//Local方法会与当前任务ID绑定
//		taskService.setVariable(taskId, "请假日期", new Date());
//		taskService.setVariable(taskId, "请假原因", "回家探亲,一起吃个饭");
		/**二:设置流程变量,使用javabean类型*/
		/**
		 * 当一个javabean(实现序列号)放置到流程变量中,要求javabean的属性不能再发生变化
		 *    * 如果发生变化,再获取的时候(反序列化),抛出异常
		 *  
		 * 解决方案:将对象实现Serializable; 添加序列化ID, 固定版本号:
		 * 		private static final long serialVersionUID = 6757393795687480331L;
		 * */
		Person p = new Person();
		p.setId(20);
		p.setName("徐凤年");
		taskService.setVariable(taskId, "人员信息(添加固定版本)", p);
		
		System.out.println("设置流程变量成功!");
	}

    涉及的JavaBean:
在这里插入图片描述

八. 关于设置变量时的local方法

  1. setVariableLocal方法设置的变量会与当前任务绑定, 当前任务完成后, 用下个任务的id无法再查询到该变量(正在执行的流程变量表已经没有这条数据了, 但历史表中还存在)
    在这里插入图片描述
    在这里插入图片描述
  2. setVariableLocal方法设置的变量不会被覆盖. 如果变量名相同, 非local的变量会被后一次的赋值覆盖(无论是正在的还是历史的).

     : 根据需求设置, local方法一般用到不多.

九. 获取流程变量

	/**获取流程变量*/
	@Test
	public void getVariables(){
		/**与任务相关(正在执行的)Service*/
		TaskService taskService = processEngine.getTaskService();
		//任务ID
		String taskId = "2104";
		/**一:获取流程变量,使用基本数据类型*/
//		Integer days = (Integer) taskService.getVariable(taskId, "请假天数");
//		Date date = (Date) taskService.getVariable(taskId, "请假日期");
//		String resean = (String) taskService.getVariable(taskId, "请假原因");
//		System.out.println("请假天数:"+days);
//		System.out.println("请假日期:"+date);
//		System.out.println("请假原因:"+resean);
		/**二:获取流程变量,使用javabean类型*/
		Person p = (Person)taskService.getVariable(taskId, "人员信息(添加固定版本)");
		System.out.println(p.getId()+"        "+p.getName());
	}

十. 查询流程变量的历史表

	/**查询流程变量的历史表*/
	@Test
	public void findHistoryProcessVariables(){
		List<HistoricVariableInstance> list = processEngine.getHistoryService()//
						.createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询对象
						.variableName("请假天数")
						.list();
		if(list!=null && list.size()>0){
			for(HistoricVariableInstance hvi:list){
				System.out.println(hvi.getId()+"   "+hvi.getProcessInstanceId()+"   "+hvi.getVariableName()+"   "+hvi.getVariableTypeName()+"    "+hvi.getValue());
				System.out.println("###############################################");
			}
		}
	}	
	

十一. 流程变量相关表

  • 正在执行的流程变量表 act_ru_variable
    在这里插入图片描述
  • 历史的流程变量表 act_hi_varinst
    在这里插入图片描述注:
        1. 当流程结束后, 正在执行的流程变量表 act_ru_variable 中与该流程相关的变量会被清空, 存储到历史的流程变量表中 act_hi_varinst
         2. act_hi_varinst 和 act_ru_variable 表结构完全一致, 就只是少了一个TYPE_字段.
### 解决 Maven 依赖问题 对于 `org.activiti:activiti-explorer:5.18.0.ext` 这一特定版本的依赖找不到的情况,通常是因为该版本并未发布到中央仓库或其他公共仓库中。为了确保能够正确引入此依赖项,建议采取以下措施: #### 方法一:检查本地仓库和远程仓库设置 确认项目的 `pom.xml` 文件中的 `<repositories>` 部分已包含必要的仓库地址。如果使用的是私有库,则需添加对应的镜像源链接。 ```xml <repositories> <!-- 添加阿里云Maven仓库 --> <repository> <id>nexus-aliyun</id> <url>https://maven.aliyun.com/repository/public/</url> </repository> <!-- 如果适用, 可以尝试其他社区维护的Activiti扩展库 --> <repository> <id>jboss-public-repository-group</id> <name>JBoss Public Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url> </repository> </repositories> ``` #### 方法二:手动下载并安装 JAR 包至本地仓库 当无法通过网络获取所需资源时,可以从官方文档或开发者论坛寻找对应版本的手动下载方式,并利用命令行工具将其部署到本地 `.m2` 目录下: ```bash mvn install:install-file \ -Dfile=/path/to/downloaded/jar/file.jar \ -DgroupId=org.activiti \ -DartifactId=activiti-explorer \ -Dversion=5.18.0.ext \ -Dpackaging=jar ``` #### 方法三:考虑升级 Activiti 版本 考虑到当前使用的可能是较旧版本的 Activiti 组件,在新项目开发过程中推荐尽可能采用最新稳定版来减少兼容性和支持方面的问题。例如,根据已有信息可知存在更高版本如 `7.x` 系列可供选择[^2]。 #### 示例 POM 配置片段 下面是一个完整的 `pom.xml` 中关于 Activiti Explorer 的配置实例,适用于大多数场景下的快速入门应用: ```xml <!-- 引入 Activiti 流程引擎核心包 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <!-- 若确实需要使用 activiti-explorer 插件界面 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-explorer</artifactId> <version>5.18.0</version><!-- 注意这里没有 .ext 后缀 --> </dependency> ``` 需要注意的是,`.ext` 并不是一个标准的版本命名约定;因此在实际操作前应当核实具体需求以及所处环境的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值