SpringBoot集成Activiti案例
前言
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。
创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建 Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。
Activiti是一个独立运作和经营的开源项目品牌,并将独立于Alfresco开源ECM系统运行。 Activiti将是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项目的是VMware的SpringSource分支,Alfresco的计划把该项目提交给Apache基础架构,希望吸引更多方面的BPM专家和促进BPM的创新。
代码实现
- 流程部署、查询流程定义
- 启动流程、查询流程
- 待办任务、完成任务
- 已结束流程、已完成任务
<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.1.0.M6</version>
</dependency>
# 服务配置
server:port: 8088# spring配置
spring:# 数据源配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/boot_activiti?useUnicode=true&useSSL=false&serverTimezone=UTC&characterEncoding=UTF8&nullCatalogMeansCurrent=trueusername: rootpassword: root# activiti7配置activiti:# 建表策略,可选值:true,false,create-drop,drop-createdatabase-schema-update: true# 自动部署检查,默认校验resources下的processes文件夹里的流程文件check-process-definitions: false# 保存历史数据等级,可选值:none,activity,audit,fullhistory-level: full# 检测历史表是否存在db-history-used: true
package com.qiangesoft.activiti.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;@Configuration
@EnableWebSecurity
public class WebSecurityConfig {@Beanpublic UserDetailsService userDetailsService() {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("admin").password(encoder.encode("123456")).roles("USER").build());return manager;}
}
package com.qiangesoft.activiti.controller;import com.qiangesoft.activiti.constant.ProcessConstant;
import com.qiangesoft.activiti.constant.R;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 流程定义 控制器** @author lq* @date 2024-02-27*/
@RestController
@RequestMapping("/definition")
public class ProcessDefinitionController {@Autowiredprivate RepositoryService repositoryService;@GetMapping("/deploy")public R deploy() {// 部署流程Deployment deployment = repositoryService.createDeployment().addClasspathResource("bpmn/test.bpmn20.xml").deploy();return R.ok(deployment);}@GetMapping("/list")public R list() {// 查询部署流程List<Deployment> deploymentList = repositoryService.createDeploymentQuery().deploymentKey(ProcessConstant.PROCESS_KEY)
// .deploymentName("").orderByDeploymenTime().desc().list();return R.ok(deploymentList);}@GetMapping("/get")public R get() {Deployment deployment = repositoryService.createDeploymentQuery().deploymentKey(ProcessConstant.PROCESS_KEY)
// .deploymentName("").latest().singleResult();return R.ok(deployment);}}
package com.qiangesoft.activiti.controller;import com.qiangesoft.activiti.constant.ProcessConstant;
import com.qiangesoft.activiti.constant.R;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 流程实例 控制器** @author lq* @date 2024-02-27*/
@RestController
@RequestMapping("/instance")
public class ProcessInstanceController {@Autowiredprivate RuntimeService runtimeService;@GetMapping("/start")public R start() {// 启动流程:提供流程key,业务key,主题String businessId = "101";ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder().processDefinitionKey(ProcessConstant.PROCESS_KEY).businessKey(ProcessConstant.BUSINESS_KEY_PREFIX + businessId).name("请假流程").start();return R.ok(processInstance.toString());}@GetMapping("/list")public R list() {// 查询进行中的流程实例List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey(ProcessConstant.PROCESS_KEY)
// .deploymentId("")
// .processInstanceId("")
// .processInstanceBusinessKey("")
// .processInstanceNameLike("请假流程").active().orderByProcessInstanceId().desc().list();return R.ok(processInstanceList.toString());}@GetMapping("/get")public R get(String instanceId) {// 某个实例ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();return R.ok(processInstance == null ? null : processInstance.toString());}}
package com.qiangesoft.activiti.controller;import com.qiangesoft.activiti.constant.R;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 流程待办 控制器** @author lq* @date 2024-02-27*/
@RestController
@RequestMapping("/task")
public class TaskController {@Autowiredprivate TaskService taskService;@GetMapping("/mine")public R mine() {// 某人的待办任务:按照时间倒序String userId = "zhangsan";List<Task> taskList = taskService.createTaskQuery()
// .processDefinitionKey("")
// .taskCandidateOrAssigned("").taskAssignee(userId).active().orderByTaskCreateTime().desc().list();return R.ok(taskList.toString());}@GetMapping("/handle")public R handle(String taskId) {// 完成任务taskService.complete(taskId);return R.ok();}}
package com.qiangesoft.activiti.controller;import com.qiangesoft.activiti.constant.ProcessConstant;
import com.qiangesoft.activiti.constant.R;
import org.activiti.engine.HistoryService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 历史 控制器** @author lq* @date 2024-02-27*/
@RestController
@RequestMapping("/history")
public class HistoryController {@Autowiredprivate HistoryService historyService;@GetMapping("/finished")public R finished() {// 已结束的流程:按照结束时间倒序List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery()
// .processInstanceId("")
// .deploymentId("")
// .processDefinitionName("")
// .processInstanceBusinessKey("").processDefinitionKey(ProcessConstant.PROCESS_KEY).finished().orderByProcessInstanceEndTime().desc().list();return R.ok(processInstanceList.toString());}@GetMapping("/completed")public R completed() {// 某人已完成的任务:按照完成时间倒序String userId = "zhangsan";List<HistoricTaskInstance> processInstanceList = historyService.createHistoricTaskInstanceQuery()
// .processInstanceId("")
// .deploymentId("")
// .processDefinitionName("")
// .processInstanceBusinessKey("").taskAssignee(userId).processDefinitionKey(ProcessConstant.PROCESS_KEY).finished().orderByHistoricTaskInstanceEndTime().desc().list();return R.ok(processInstanceList.toString());}}
点击下载
相关文章:
SpringBoot集成Activiti案例
前言 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技…...
Vulnhub靶机:basic_pentesting_2
一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.4) 靶机:basic_pentesting_2(10.0.2.7) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.c…...
复试PAT乙级day33
PAT乙级1106~1110 1106_2019数列有一个测试点过不了 1109_擅长C 这题不会,通过的是别人的代码 1110_区块反转 这题跟1105_链表合并 的处理很像。值得注意的是分段区间翻转用 大转小转 的方式。这题也有一个测试点通不过。...
npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3
在使用npm时,有时候您可能会遇到类似以下错误的权限问题: npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3 npm ERR! code EACCES npm ERR! errno -13 npm ERR! syscall open npm ERR! Error: EACCES: permission denie…...
震惊!python类型的自动化测试框架原来这么简单!
自2018年被评选为编程语言以来,Python在各大排行榜上一直都是名列前茅。目前,它在Tiobe指数中排名第三个,仅次于Java和C。随着该编程语言的广泛使用,基于Python的自动化测试框架也应运而生,且不断发展与丰富。 因此&am…...
人脸高清算法GFPGAN之TensorRT推理
1. 综述 最近由于做数字人项目,采用的是wav2lip GFPGAN进行人脸面部高清,但GFPGAN模型本身比较大,所以想着使用TensorRT来代替原始的pth推理看看能否提升运行速度,于是便开始了这趟windows1之下进行GFPGAN的trt推理的折腾之旅。…...
05 OpenCV图像混合技术
文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1:输入图像Mat …...
2326. 王者之剑(网络流,最小割,最大权独立集,最小点权覆盖)
活动 - AcWing 给出一个 nm 网格,每个格子上有一个价值 vi,j 的宝石。 Amber 可以自己决定起点,开始时刻为第 0 秒。 以下操作,在每秒内按顺序执行。 若第 i 秒开始时,Amber 在 (x,y),则 Amber 可以拿走 (x,y) 上的…...
内网信息搜集
目录 内网基础知识 基本流程图 怎么判断是否在域内 常规信息类收集-应用&服务&权限等 cs信息搜集 bloodhound安装及使用 内网基础知识 工作组:将不同的计算机按照功能分别列入不同的组,想要访问某个部门的资源,只要在【网络】里…...
微型力量,巨大作用:嵌入式技术的创新应用
微型力量,巨大作用:嵌入式技术的创新应用 嵌入式技术是一种将计算机技术嵌入到各种设备和系统中的技术,它的应用范围非常广泛,包括但不限于智能手机、智能家居、医疗设备、工业自动化等领域。这种微型的技术在各个领域中发挥着巨…...
华为 OD 一面算法原题
2.2 亿彩票公布调查结果 昨天,闹得沸沸扬扬的《10 万中 2.2 亿》的彩票事件,迎来了官方公告。 简单来说,调查结果就是:一切正常,合规合法。 关于福利彩票事件,之前的推文我们已经分析过。 甚至在后面出现《…...
FPGA-学会使用vivado中的存储器资源ROM(IP核)
问题: 某芯片,有500个寄存器,需要在上电的时候由FPGA向这些寄存器中写入初始值,初始值已经通过相应的文档给出了具体值,这些值都是已知的。 分析关键点: 数据量比较多(Verilog代码,通过case语句、always语句这种查找表的方式,数…...
自测-1 打印沙漏
文章预览: 题目算法代码 题目 算法 以前做过这个,那次是c语言写的,一点一点处理一层一层完成,这次我换了一种语言用了另一种思想使用递归去写,还是我们要先求出应该有多少层这个很容易,中间输出部分我们算…...
高级语言期末2009级B卷(计算机学院)
1.编写一个名为mystrcpy的函数,实现将字符串str1的偶数位子的字符的拷贝到另一个字符串str2中。并编写主函数,在主函数中从键盘读入一个长度<100的字符串str1,然后调用函数mystrcpy;最后输出str2,例如,读…...
c# using 用法
using命令空间 导入命名空间中的所有类型 如:using System.Text; using别名 using别名包括详细命名空间信息的具体类型,这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要…...
【Django】执行查询—跨关系查询中的跨多值关联问题
跨多值查询 跨越 ManyToManyField 或反查 ForeignKey (例如从 Blog 到 Entry )时,对多个属性进行过滤会产生这样的问题:是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter(),通过一个例子看…...
Spring八股 常见面试题
什么是Spring Bean 简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 将一个类声明为 Bean 的注解有哪些? Com…...
今年面试潮,说实话这个开发岗能不能冲?
自打华为 2019 年发布鸿蒙操作系统以来,网上各种声音百家争鸣。尤其是 2023 年发布会公布的鸿蒙 4.0 宣称不再支持 Android,更激烈的讨论随之而来。 当下移动端两大巨头瓜分了绝大部分市场: iOS 是闭源的,只有唯一的一家厂商&am…...
【前端素材】推荐优质在线花卉商城电商网页Flowery平台模板(附源码)
一、需求分析 1、系统定义 在线花卉商城是一个通过互联网提供花卉销售服务的电子商务平台,用户可以在该平台上浏览、选择和购买各种花卉产品。 2、功能需求 在线花卉商城是一个通过互联网提供花卉销售服务的电子商务平台,用户可以在该平台上浏览、选…...
★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树
★【递归前序】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树:star:思路分析递归解法 105. 从前序与中序遍历序列构造二叉树递归解法 凡是构造二叉树>>>>>>>>&…...
s2-pro参数调优实战:Max New Tokens提升长文本连贯性详解
s2-pro参数调优实战:Max New Tokens提升长文本连贯性详解 1. 引言 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,在文本转语音领域展现出强大的能力。它不仅支持基础的文本转语音功能,还能通过参考音频实现音色复用,为语音…...
基于M-LAG与V-STP构建高可靠三层网络的双活网关实践
1. 为什么需要双活网关? 在企业网络架构中,网关设备的重要性不言而喻。它就像是办公室的前台接待处,所有进出大楼的人员都需要经过这里登记和引导。传统的单网关部署有个致命弱点——一旦前台没人值班,整个公司的业务就会瘫痪。我…...
同年份的 win 和 mac 硬件对比
同年份的 Windows 笔记本之所以大多“阵亡”了,而你的 MBP 2011 还能开机,根本原因不在于系统本身(Windows vs macOS),而在于两大阵营截然不同的硬件设计哲学和制造标准。 简单来说,2011年的MacBook Pro是…...
java修饰符:abstract final static 的区别
文章目录前言一、三者的基本概念对比二、代码场景实操演示1. abstract用法演示:抽象类抽象方法2. final用法演示:类/方法/变量3. static用法演示:类成员静态方法静态代码块静态内部类4. 禁止组合的场景(面试高频坑点)总…...
深入剖析UVM Sequence机制:从基础使用到源码实现
1. UVM Sequence机制基础入门 第一次接触UVM Sequence时,我完全被它复杂的机制搞懵了。直到在实际项目中踩过几次坑后,才真正理解它的精妙之处。Sequence机制是UVM验证平台中最核心的激励生成方式,它就像是一个智能的"激励工厂"&am…...
Qwen2.5与DeepSeek-7B全面对比:上下文长度与长文档处理评测
Qwen2.5与DeepSeek-7B全面对比:上下文长度与长文档处理评测 在当今大模型百花齐放的时代,7B参数级别的模型因其在性能与资源消耗间的平衡而备受关注。通义千问2.5-7B-Instruct和DeepSeek-7B作为两个备受瞩目的开源模型,都在长文本处理方面有…...
XTU OJ 刷题笔记:如何用C语言高效解决‘相同的数码’问题(附完整代码)
XTU OJ 刷题笔记:如何用C语言高效解决‘相同的数码’问题 第一次在XTU OJ上遇到"相同的数码"这道题时,我盯着题目描述看了足足十分钟。作为一个刚接触算法竞赛的新手,进制转换类题目总是让我感到既熟悉又陌生。这道题要求我们找到一…...
【SCI复现】基于纳什博弈和ADMM的多微网主体能源共享研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...
Harness Engineering 是什么?三层演化,搞懂 AI Agent 的真正驱动力
提示词工程、上下文工程、Harness Engineering——一文说透,附四张原创图解 很多人搭 AI Agent,卡在同一个地方: 照着教程写了提示词,Agent 还是跑偏、忘事、乱执行。 问题不在提示词写得不够好——是你对整个概念体系的理解&am…...
如何5分钟搞定抖音批量下载:douyin-downloader开源工具终极指南
如何5分钟搞定抖音批量下载:douyin-downloader开源工具终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...
