activiti整合springBoot其他操作
如果单纯使用activiti进行流程的自动控制,是可以实现的。但是通常我们都需要结合自定义的表,便于在流程执行中更加清晰的看到每一个流程实例节点的具体信息。关联自定义表与activiti表才能完成真正的业务
BusinessKey关联
// 定义businessKey
@Test
public void addBusinessKey(){// 获取流程引擎ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();// 获取启动流程serviceRuntimeService runtimeService = engine.getRuntimeService();// 启动流程 并添加businessKey// param1:流程ID param2:businessKeyProcessInstance processInstance = runtimeService.startProcessInstanceByKey("forLeave", "1001");System.out.println("businessKey=="+processInstance.getBusinessKey());
}
当我们启动流程的时候,activiti将businessKey添加到了act_ru_execution表中。该表就是我们将自定义表和activiti表关联的重点
流程定义的挂起与激活
// 全部流程挂起与激活
@Test
public void suspendAllprocessInstance(){ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = engine.getRepositoryService();// 获取流程定义查询对象ProcessDefinition forLeave = repositoryService.createProcessDefinitionQuery().processDefinitionKey("forLeave").singleResult();// 查询当前流程任务是否为挂起状态 true挂起状态 falseboolean suspended = forLeave.isSuspended();// 流程定义idString id = forLeave.getId();if (suspended){// 挂起就激活// param1:流程任务id param2:是否挂起 param3:激活时间repositoryService.activateProcessDefinitionById(id,true,null);System.out.println("流程定义id=="+id+"已激活");// 激活状态为:1}else {// 激活就挂起// param1:流程定义id param2:是否暂停 param3:暂停时间repositoryService.suspendProcessDefinitionById(id,true,null);System.out.println("流程定义id=="+id+"已挂起");// 挂起状态为:2}
可以通过查看运行时执行表act_ru_execution的SUBPENSION_STATE查看,状态为1表示该任务已激活,状态为2表示已挂起
单个流程实例挂起与激活
@Test
public void suspendSingleProcess(){ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = engine.getRuntimeService();ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("27501").singleResult();// true 已挂起 false 已激活boolean suspended = processInstance.isSuspended();// 获取流程实例idString id = processInstance.getId();// 挂起和激活转换if (suspended){runtimeService.activateProcessInstanceById(id);System.out.println("流程实例id"+id+"已激活");}else {runtimeService.suspendProcessInstanceById(id);System.out.println("流程实例id"+id+"已挂起");}
}
可以对比流程定义和流程实例的挂起激活:
流程定义是指某一种任务类型,该类型的全部待处理任务会全部挂起或者执行。比如请假,那么不会单独针对张三或者李四的请假操作,而是针对所有的请假流程进行操作。流程定义的挂起与激活通过的是RepositoryService
流程实例是指某一流程定义下的某一个流程,比如张三的请假审批流程就是一个流程实例。那么就可以通过单个操作来对张三进行激活和挂起操作。流程实例是通过RunTimeService进行操作。
两者的激活都是通过activatePrecess***ById进行转换,挂起都是通过suspendProcess ***ById
任务负责人分配–uel表达式
首先在绘制bpmn时使用${key}
表达式,再自定义填充key。
填充完毕之后,进行流程部署然后在启动流程时利用map集合进行传参。map集合的key对应上述的uel表达式中的key,activiti会自动帮我们完成该表达式的值替换:
// 测试uel表达式分配负责人
@Test
public void test02(){ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = engine.getRuntimeService();// 启动时传入负责人// map用于替换bpmn的uel表达式Map<String, Object> map = new HashMap<>();map.put("assignee0","六六");map.put("assignee1","七七");ProcessInstance vacationIns = runtimeService.startProcessInstanceByKey("vacation", map);
}
如上述程序所示,最终可以通过查看act_ru_task表会发现对应的assignee字段是我们预先定义好的key,而后面的text字段就是替换后的值value:
流程变量
流程变量:在流程的审批执行过程中,经常会需要一些变量来作为判决跳转下一流程节点的依据,这个变量就称之为流程变量。
举例:员工想要预支薪水,如果预支金额小于月薪那么直接经部门经理审批后上报财务即可,反之如果预支金额大于月薪那么需要上报总经理,通过后再上报财务即可。此时的预支金额就是流程变量
globa变量是流程变量的默认作用域,也就是流程实例,globa变量不允许重复,如果两次或多次使用了统一globa变量名那么后续的值会覆盖前面的值
local变量:针对一个任务task和一个执行实例范围,没有globa范围大。local变量由于存在于不同的任务或者不同的实例中,所以相互间没有影响,变量名可以一致,也可以与globa变量名一致
排他网关ExclusiveGateway
网关用于控制流程分支的走向。
排他网关是当流程执行至此网关时,所有分支都会判断条件是否为true,如果为true则执行该分支。排他网关只会选择一个为true的分支执行,如果有多个分支为true,那么就会选择id值较小的一个执行
springBoot整合activiti
首先导入依赖资源
<!-- activiti整合springboot -->
<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.1.0.M1</version>
</dependency>
配置application.yaml文件
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/activiti?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourceactiviti:#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)database-schema-update: true# 检测历史信息表 activiti7默认不生成信息表 此处开启db-history-used: true# 历史记录存储等级history-level: fullcheck-process-definitions: true
在主程序处排除掉springSecurity框架
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class, SecurityAutoConfiguration.class,ManagementWebSecurityAutoConfiguration.class
})
最后我们需要保证已经编绘好的bpmn文件位于resources文件夹下的processes目录下,否则activiti会找不到文件无法创建表
如下图所示:
如果是第一次使用activi的话就直接启动主程序,activiti将会自动的在对应数据库中建表,并且如果在你的processes包下扫描到了对应的bpmn文件那么activiti也会自动的进行流程部署
测试启动流程:
@Controller
public class TestController {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@RequestMapping(value = "/hello/{id}")@ResponseBodypublic String testHello(@PathVariable("id") String id){// 测试完成任务Task task = taskService.createTaskQuery().processInstanceId(id).singleResult();taskService.complete(task.getId());return "完成任务人=="+task.getAssignee()+"获取到的id=="+id+"get到的id=="+task.getId();}@RequestMapping(value = "/create")@ResponseBodypublic String testCreate(){// 定义负责人名称Map<String, Object> maps = new HashMap<>();maps.put("a1","五一");maps.put("a2","六一");ProcessInstance holidy = runtimeService.startProcessInstanceByKey("holiday", maps);return "流程实例ID=="+holidy.getId()+"流程实例ID=="+holidy.getProcessInstanceId()+"流程定义Id=="+holidy.getProcessDefinitionId()+"流程定义Name=="+holidy.getProcessDefinitionName();}
}
相关文章:
activiti整合springBoot其他操作
如果单纯使用activiti进行流程的自动控制,是可以实现的。但是通常我们都需要结合自定义的表,便于在流程执行中更加清晰的看到每一个流程实例节点的具体信息。关联自定义表与activiti表才能完成真正的业务 BusinessKey关联 // 定义businessKey Test pub…...
深度探索C++预编译头机制
深度详见预编译头,以vs编译器实现的预编译头管理为例 预编译头是为了节省庞大的编译时间,采取的一种方法;C标准并没有规定如何实现预编译头机制;因此其具体实现方式由编译器供应商自行决定。 下面就以VS中观测的结果为例进行说明…...
Leaflet基础入门教程(一)
leaflet是一个前端的轻量的gis框架,为什么说它轻量呢。因为相比于传统的“庞大的”GIS框架比如openlayers和mapbox,leaflet不仅代码体积小,而且API构成也极为简单。是GIS行业小白入门级别学习的最好的框架,没有之一。 那么话不多说我们首先来学习一下如何使用leaflet搭建一…...
《强化学习导论》之6.5 Q-Learning
Q-Learning:Off-Policy TD Control强化学习的早期突破之一是开发了一种称为Q学习的非策略TD控制算法(Watkins,1989)。其最简单的形式,定义为(6.8)在这种情况下,学习的动作-值函数Q直接近似于最优动作-值函数࿰…...
5年软测,女朋友跑了俩,2年外包感觉自己废了一半,怎么办?
17年毕业,校招毕业就进入一家软件公司,干了2年的点工,随后进入一家外包公司工作至今,安逸使人堕落不知进取,加之随着近年的环境不景气,谈了多年将要结婚的女朋友也因为我的心态和工资要跟我闹分手我想改变现…...
【JavaWeb】HTML常用标签
HTML标签结构 HTML语言主要都是由标签构成的。 标签名 在 <> 中 如<body> 标签大部分成对出现,代表开始和结束 如 <body>标签中的内容</body> 少部分单个出现,叫单标签 </br> 代表换行 标签中可以加属性,多个…...
python编程:查找某个文件夹下所有的文件,包括子文件加下的所有文件,读取指定类型的文件
目录 一、实现要求 二、代码实现 三、效果测试 一、实现要求 1、在电脑上有一个文件夹,该文件夹下面还有子文件夹,具体层级不清楚,需要实现将该文件夹下所有的文件路径读取出来; 2、在1的基础上,只需读取指定类型的文…...
测试外包干了5年,感觉自己已经废了····
前两天有读者想我资讯: 我是一名软件测试工程师,工作已经四年多快五年了。现在正在找工作,由于一直做的都是外包的项目。技术方面都不是很深入,现在找工作都是会问一些,测试框架,自动化测试,感…...
C++17 文件与目录操作 <filesystem>
目录 路径操作 目录遍历 文件检查和操作 总结 每次写C进行目录操作时,我一般都是调平台的SDK,尤其是win32 api 非常难记,于是查一下文档看看有没有和Python中os模块一样好用的库。 于是发现 filesystem,从来没用过࿰…...
Python 如何安装 MySQLdb ?
人生苦短 我用python Python 标准数据库接口为 Python DB-API, Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库, 你可以选择适合你项目的数据库: GadFlymSQLMySQLPostgreSQLMicrosoft SQL Serve…...
总被程序员坑?你需要了解API接口
编辑导读:程序员是公司里的技术岗,也是产品经理最密切的合作伙伴。但是,程序员能看懂产品经理的工作,产品经理却不一定能明白程序员的工作,因此也常常被无良程序员坑。本文就从API接口的维度,浅析API的概念…...
信息系统基本知识(四)新技术
大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.5 新一代技术 1.5.1 物联网 概念:(The Internet of Things…...
jeesite多环境配置
jeesite多环境配置 参考网址: https://blog.csdn.net/shaoming314/article/details/129115912?spm1001.2014.3001.5501 开源项目地址: https://gitee.com/thinkgem/jeesite Spring Spring MVC mybatis Ehcache shiro mysql jsp (主要技术栈) 项目…...
项目中用到的知识点回顾---JWT(JSON Web Token)
1.JWT原理: JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,如下; {"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日…...
string类常用函数
1(substr函数):字符串截取函数,用于获取字符串的子串: //str.substr(begin,length),用于截取str中以begin为下标长度为length的字串 string s“asd”; ss.substr(0,1);//结果为a。 2(…...
hexo静态网站部署到腾讯云cos
hexo支持很多部署方案,最直接的就是部署在GitHub Pages服务上,国内gitee、coding等代码托管平台也都支持静态网站服务,而且免费。 但是GitHub在国内访问不太稳定,国内的代码托管平台资源和服务也不太稳定,后来想了想&…...
Python高性能编程
一、进程池和线程池 1.串行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import time import requests url_lists [ http://www.baidu.com, http://fanyi.baidu.com, http://map.baidu.com, http://music.baidu.com/, http://tieba.baid…...
MVVM模式下如何正确【视图绑定+数据】
概述 我如何(不在后面的代码中使用代码)自动绑定到我想要的视图?据我了解,如果正确完成,这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切,我甚至正确创建了一个资源字典(因…...
外包测试3年,离职后成功入职华为,拿到offer的那天我泪目了....
一提及外包测试,大部分人的第一印象就是:工作强度大,技术含量低,没有归属感!外包工作三年总体感受就是这份工作缺乏归属感,心里总有一种落差,进步空间不大,接触不到核心技术…...
Qt Study
按钮->点击->窗口->关闭窗口 connect(信号的发送者,发送具体信号,信号的接收者,信号的处理); 信号处理函数称为槽 信号槽的优点,松散耦合,信号发送端和接收端本身是没有关联的,通过connect连接…...
JS混淆技术探究及解密方法分析
随着Web技术的快速发展,JavaScript被广泛应用于网页开发、移动应用开发等领域。然而,JavaScript代码很容易被反编译、解密,这给保护网站和应用程序的安全性带来了严重的挑战。为了解决这个问题,JS混淆技术应运而生。JS混淆就是将J…...
智慧制硅厂 Web SCADA 生产线
我国目前是全球最大的工业硅生产国、消费国和贸易国,且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识,随着我国“双碳”目标的推进,光伏产业链快速发展,在光伏装机需求的带动下,…...
案例09-数据类型不一致导致equals判断为false
一:背景介绍 在判断课程id和班级id的时候如果一致就像课程信息进行更新,如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了,在判断的时候结果为false,就有插入…...
springsecurity中的类
Authentication AuthenticationProvider 每一个AuthenticationProvider对应一个Authentication 很多个AuthenticationProvider 由一个 ProviderManager管理 ProviderManager implements AuthenticationManager 一个ProviderManager有很多个 AuthenticationProvider Usern…...
k8s配置管理
一、configmap 1.1 configmap概述 Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。 1.2 configmap作用 我们在部署服务的时候,每个服务都有自己的配置…...
技术官方文档中的代码是用什么展示的?代码高亮插件总结
****内容预警****菜鸟教程***大佬绕道我们经常看到各种技术官方文档,有很多代码展示的区域,用于我们复制粘贴代码,比如vue 的官网当我们需要自己实现这么一个网站的时候,我就开始手忙脚乱,这到底是咋实现的?…...
2023年中职组网络安全竞赛——综合渗透测试解析
综合渗透测试 题目如下: PS:需求环境可私信博主,求个三连吧! 解析如下: 通过本地PC中的渗透测试平台KALI2020对服务器场景进行渗透攻击,获取到RSYNC服务所开放的端口,将RSYNC服务开放的端口数值进行MD5加密后作为FLAG提交(如MD5加密前:812);...
【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释)
题目链接 1044 火星数字 题目描述 火星人是以 13 进制计数的:地球人的 0 被火星人称为 tret。 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。 火星人将进位以后的 12 个高位数字分别称为:…...
rsync+xinetd+inotify+sersync
一、介绍 1.1、rsync 对比 scp 相同: 都有拷贝的功能不同: rsync:具有增量复制,每次复制的时候,会扫描对端是否在同路径下有我要发送的一样的文件或者目录,如果,如果存在,则不进行复制。边复制&…...
CSS - 扫盲
文章目录1. 前言2. CSS2.1 css 的引入方式2.2 选择器2.3 CSS 常用属性2.3.1 字体属性2.3.2 文本属性2.3.3 背景属性2.4 圆角矩形2.5 元素的显示模式2.6 盒子模型2.7 弹性布局1. 前言 上文我们简单 将 HTML 过了一遍 , 知道了 HTML 知识表示页面的结构和内容 &#x…...
商城网站建站方案/石家庄新闻网头条新闻
一、调试前提 1. Hardware 720p的DSI接口屏hx8394d,MIPI接口相关原理图如下图 通过原理图获取的信息: 1)2.8V VDD供电脚 —— LDO17; 2)1.8V VDD供电脚 —— LDO6; 3)RESET脚 —— GPIO25; 4)TE脚(一般DSI CMD模式下才会使用)—— GPIO24; 5)背光使能脚 —— G…...
网站建设的流程图示/淘宝站外引流推广方法
重构学习笔记1. 封装集合 概念:本文所讲的封装集合就是把集合进行封装,只提供调用端需要的接口。 正文:在很多时候,我们…...
wordpress theme/优化关键词的方法正确的是
题目 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 思路 解决删除重复问题的一个有效的思路就是双指针法&#x…...
互联网网站开发服务合同/友情链接交换统计表
1. 问题描述: 给定一个长度为 n 的 01 字符串。请你判断,其中是否存在子串 1111111 或 0000000。 输入格式 一行,一个 01 字符串。 输出格式 如果存在子串 1111111 或 0000000,则输出 YES,否则输出 NO。 数据范围…...
自定义网站建设团队/今日国内新闻热点
最近做了一个功能,公司是用html写的上层,需要调用android自带的语音合成和识别,原以为是直接与html交互,结果没想到上层是用cordova的框架写的,研究一天把cordova与android的交互实现了,现在记录一下实现流…...
新疆巴州建设局网站/百度seo公司哪家最好
1.什么是直方图?直方图是数字图像处理中一个简单而重要的常用工具,它从总体上刻画了一幅图像的灰度内容。具体来说,直方图描述的是图像中具有各灰度级的出现的概率(像素的个数),其横坐标为灰度级,纵坐标为图像中具有该灰度级的像素个数。由于灰度级的大小为0-255&am…...