当前位置: 首页 > news >正文

Activiti 5 + Spring Boot全流程开发指南

目录

一、环境搭建(Spring Boot 2.x)

1.1 依赖配置

1.2 配置文件

二、流程定义与部署

2.1 创建BPMN文件(leave.bpmn)

2.2 流程部署服务

三、流程操作核心实现

3.1 启动流程实例

3.2 查询待办任务

四、审批流程处理

4.1 通过审批

4.2 驳回流程

4.3 撤回流程

五、流程状态管理

5.1 流程历史查询

5.2 流程图生成

六、完整流程示例

6.1 请假流程时序图

七、常见问题解决方案

7.1 流程版本控制

7.2 流程变量管理

结语


一、环境搭建(Spring Boot 2.x)

1.1 依赖配置

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>5.22.0</version></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies>

1.2 配置文件

spring:activiti:database-schema-update: truehistory-level: fullcheck-process-definitions: falsedatasource:url: jdbc:h2:mem:testdbdriverClassName: org.h2.Driverusername: sapassword: 

二、流程定义与部署

2.1 创建BPMN文件(leave.bpmn)

<process id="leaveProcess" name="请假流程"><startEvent id="start"/><userTask id="apply" name="提交申请" activiti:assignee="${applicant}"/><userTask id="managerApprove" name="经理审批" activiti:assignee="${approver}"/><exclusiveGateway id="exclusiveGw"/><sequenceFlow sourceRef="start" targetRef="apply"/><sequenceFlow sourceRef="apply" targetRef="managerApprove"/><sequenceFlow sourceRef="managerApprove" targetRef="exclusiveGw"/><endEvent id="end"/>
</process>

2.2 流程部署服务

@Service
public class ProcessService {@Autowiredprivate RepositoryService repositoryService;public void deployProcess(String bpmnPath) {repositoryService.createDeployment().addClasspathResource(bpmnPath).deploy();}
}

三、流程操作核心实现

3.1 启动流程实例

@Service
public class RuntimeService {@Autowiredprivate org.activiti.engine.RuntimeService activitiRuntimeService;public String startProcess(String processKey, String businessKey, Map<String, Object> variables) {return activitiRuntimeService.startProcessInstanceByKey(processKey, businessKey, variables).getId();}
}

3.2 查询待办任务

@Service 
public class TaskService {@Autowiredprivate org.activiti.engine.TaskService activitiTaskService;public List<Task> getTasksByUser(String userId) {return activitiTaskService.createTaskQuery().taskAssignee(userId).list();}
}

四、审批流程处理

4.1 通过审批

public void completeTask(String taskId, Map<String, Object> variables) {activitiTaskService.complete(taskId, variables);
}

4.2 驳回流程

public void rejectTask(String taskId, String targetTaskKey) {Task currentTask = activitiTaskService.createTaskQuery().taskId(taskId).singleResult();activitiRuntimeService.createProcessInstanceModification(currentTask.getProcessInstanceId()).cancelActivityInstance(currentTask.getExecutionId()).startBeforeActivity(targetTaskKey).execute();
}

4.3 撤回流程

public void withdrawProcess(String processInstanceId) {activitiRuntimeService.deleteProcessInstance(processInstanceId, "用户撤回");
}

五、流程状态管理

5.1 流程历史查询

public List<HistoricActivityInstance> getHistory(String processInstanceId) {return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
}

5.2 流程图生成

public InputStream generateDiagram(String processInstanceId) {ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());return processDiagramGenerator.generateDiagram(bpmnModel, "png", runtimeService.getActiveActivityIds(processInstanceId));
}

六、完整流程示例

6.1 请假流程时序图



七、常见问题解决方案

7.1 流程版本控制

public List<ProcessDefinition> getProcessVersions(String processKey) {return repositoryService.createProcessDefinitionQuery().processDefinitionKey(processKey).orderByProcessDefinitionVersion().desc().list();
}

7.2 流程变量管理

// 设置变量
taskService.setVariable(taskId, "approveComment", "同意申请");// 获取变量
String comment = (String) taskService.getVariable(taskId, "approveComment");

结语

最佳实践建议:

  1. 使用@Transactional注解保证流程操作与业务数据

相关文章:

Activiti 5 + Spring Boot全流程开发指南

目录 一、环境搭建&#xff08;Spring Boot 2.x&#xff09; 1.1 依赖配置 1.2 配置文件 二、流程定义与部署 2.1 创建BPMN文件&#xff08;leave.bpmn&#xff09; 2.2 流程部署服务 三、流程操作核心实现 3.1 启动流程实例 3.2 查询待办任务 四、审批流程处理 4.1 …...

spring结合mybatis多租户实现单库分表

实现单库分表 思路&#xff1a;student表数据量大&#xff0c;所以将其进行分表处理。一共有三个分表&#xff0c;分别是student0&#xff0c;student1&#xff0c;student2&#xff0c;在新增数据的时候&#xff0c;根据请求头中的meta-tenant参数决定数据存在哪张表表。 数…...

面向对象编程(OOP)基础:Java入门指南

引言 随着计算机技术的发展&#xff0c;软件的应用越来越复杂&#xff0c;单个程序的功能也逐渐增多。为了提高代码的复用性和可维护性&#xff0c;Java语言引入了**面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;**这一设计理念。 OOP是一种设计程序…...

day7作业

编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff08;Atx&#xff09;&#xff0c;防御&#xff08;Defense&#xff09;&#xff0c;速度&#xff08;Speed)&#xff0c;生命值&#xff08;Blood)&#xff0c;以及所有的set get 方…...

图像处理之图像边缘检测算法

目录 1 图像边缘检测算法简介 2 Sobel边缘检测 3 经典的Canny边缘检测算法 4 演示Demo 4.1 开发环境 4.2 功能介绍 4.3 下载地址 参考 1 图像边缘检测算法简介 图像边缘检测是计算机视觉和图像处理中的基本问题&#xff0c;主要目的是提取图像中明暗变化明显的边缘细节…...

第二十五 :搭建 pinia 环境

第一步&#xff1a;npm install pinia 第二步&#xff1a;操作src/main.ts import { createApp } from vue import App from ./App.vue ​ /* 引入createPinia&#xff0c;用于创建pinia */ import { createPinia } from pinia ​ /* 创建pinia */ const pinia createPinia(…...

学习Java数组操作:从基础到高级技巧详解

在Java编程中&#xff0c;数组是一种非常基础且常用的非 primitives 数据结构&#xff0c;它用于存储一组相同类型的值。无论是数据处理、遍历还是其他操作&#xff0c;数组都是一个不可或缺的工具。本文将从数组的基本概念开始&#xff0c;逐步介绍常用的操作方法&#xff0c;…...

算法题(79):两个数组的交集

审题&#xff1a; 本题需要我们查找两个给定数组的无重复数据交集&#xff0c;并以数组的形式返回 思路&#xff1a; 方法一&#xff1a;set 之前我们学习过unordered_set的使用&#xff0c;但是unordered_set是无序的&#xff0c;而这里我们的比对算法需要有序数据&#xff0c…...

TFChat:腾讯大模型知识引擎+飞书机器人实现AI智能助手

效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1&#xff0c;项目为sanic和redis实现&#xff0c;利用httpx异步处理流式响应&#xff0c;同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…...

Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;四&#xff09;修改远程配置文件&#xff0c;取消root禁用&#xff0c;便于使用root身份远程 前言一、远程连接的用途和原因二、通过 ssh 远程登陆系统三、默认限制及解决方案&#xff08;一&#xff09;非常规方法一&#…...

验证码介绍及生成与验证(HTML + JavaScript实现)

验证码介绍及生成与验证&#xff08;HTML JavaScript实现&#xff09; 验证码 验证码&#xff08;全自动区分计算机和人类的图灵测试&#xff0c;‌CAPTCHA &#xff0c;C‌ompletely ‌A‌utomated ‌P‌ublic ‌T‌uring test to tell ‌C‌omputers and ‌H‌umans ‌A‌…...

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…...

WebRTC解析

一、WebRTC 协议概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;是由 Google 发起并成为 W3C 标准的实时音视频通信技术&#xff0c;核心特点&#xff1a; 零插件&#xff1a;浏览器原生支持端到端加密&#xff08;SRTP DTLS&#xff09;P2P 优先架构&…...

升级Office软件后,Windows 系统右键里没有新建Word、Excel、PowerPoint文件的解决办法

我办公用的电脑&#xff0c;Office 2013 已经用了好多年&#xff0c;最近突发奇想给升级到了 Ofiice 2024。升级过程还蛮顺利的&#xff0c;但是安装完成后&#xff0c;发现点右键里没有新建Word、Excel、PowerPoint&#xff0c;开始菜单里 Word、Excel、PowerPoint 使用都正常…...

车载DoIP诊断框架 --- 连接 DoIP ECU/车辆的故障排除

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

洛谷每日1题-------Day4__陶陶摘苹果

# P1046 [NOIP 2005 普及组] 陶陶摘苹果 ## 题目描述 陶陶家的院子里有一棵苹果树&#xff0c;每到秋天树上就会结出 $10$ 个苹果。苹果成熟的时候&#xff0c;陶陶就会跑去摘苹果。陶陶有个 $30$ 厘米高的板凳&#xff0c;当她不能直接用手摘到苹果的时候&#xff0c;就会踩…...

萌新学 Python 之模块管理

模块就是一个 python 代码文件&#xff0c;模块可以包含函数、类&#xff0c;可以提高代码复用率提高效率 python 模块主要分为三种&#xff1a; 1.内置模块&#xff1a;python 自带的模块&#xff0c;导入后可以直接使用&#xff0c;比如 import 模块名 2.第三方模块&#…...

6.3 - UART串口数据发送之中断

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验使用中断方式实现UART串口数据的连续发送。 2 系统框图 参见6.1。 3 软件设计 注意事项&#xff1a; 系统上电、程序下载后&#xff0c;此时TX FIFO虽然为空&#xff0c;但并不会触发空中断&#xff1b;空中断…...

Fisher信息矩阵(Fisher Information Matrix, FIM)与自然梯度下降:机器学习中的优化利器

Fisher信息矩阵与自然梯度下降&#xff1a;机器学习中的优化利器 在机器学习尤其是深度学习中&#xff0c;优化模型参数是一个核心任务。我们通常依赖梯度下降&#xff08;Gradient Descent&#xff09;来调整参数&#xff0c;但普通的梯度下降有时会显得“笨拙”&#xff0c;…...

Mysql基础-多表查询(详细版)

目录 一、表的关系类型与适用场景二、连接方式与使用场景三、易错点与注意事项四、总结 一、表的关系类型与适用场景 1. 一对一关系 场景&#xff1a;一个表的记录对应另一个表的唯一记录 案例&#xff1a;用户表 用户详情表 CREATE TABLE users (id INT PRIMARY KEY,name…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...