Activiti7工作流--直接实战版本

这篇文章的目的是

让不懂,流程引擎审批的人

直接上手会做一块的技术栈开发

先讲一个基本的demo,了解这个是做什么的

我这边就一句话说明这个东西

1.创建一个流程

2.把流程持久化到数据库里

3.使用这个流程,把要审批的数据存进去,然后负责审批的人,会查询出要审批的数据

4.结束审批

1.springboot配置activit7技术栈

2.一键让数据库创建activit7需要的表

3.在bpmn上创建流程(这里是静态的流程,都是固定的)

4.使用占位符机制,动态制定需要分配到人

5.使用流程变量机制,动态计算要执行的人,要做的事情

6.使用网关机制,确定要执行的流程分叉

7.部署流程

8.制定人开启流程以及相关概念

一、先理解:什么是工作流?Activiti7是什么?

工作流(Workflow) ,就是通过计算机对业务流程自动化执行管理------让文档、信息或任务在多个参与者之间按照预定义的规则自动传递,从而实现某个业务目标。说白了,就是把"请假要经过谁审批、报销要走哪些流程"这类业务规则,从代码里抽出来,交给一个专门的"引擎"去管理。

Activiti7 就是一个用Java写的开源工作流引擎。它可以将业务系统中复杂的业务流程抽取出来,用BPMN2.0建模语言进行定义,流程按照预先定义的方式执行。有了它,流程变更时不需要改代码、重新部署系统,大大降低了维护成本。


二、整体流程概览

一个完整的Activiti7工作流开发,按你的梳理分为以下步骤:

步骤 做什么 对应你的描述
1 Spring Boot配置Activiti7 技术栈搭建
2 数据库自动创建Activiti7需要的表 一键建表
3 在BPMN上创建流程(静态流程) 创建流程
4 使用占位符(UEL表达式)动态指定处理人 动态分配人员
5 使用流程变量传递业务数据、控制走向 流程变量机制
6 使用网关控制流程分支(排他/并行) 流程分叉
7 部署流程到引擎 持久化到数据库
8 启动流程实例、查询任务、完成任务 开启流程+审批

下面逐一展开。


三、Step by Step 实现

Step 1:Spring Boot 配置 Activiti7

① 引入Maven依赖

pom.xml中添加Activiti7的Spring Boot Starter:

xml 复制代码
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>

注意版本兼容:Activiti 7.1.x 通常与 Spring Boot 2.3.x ~ 2.7.x 兼容性最佳。

② 配置 application.yml

application.yml中添加Activiti7相关配置:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/activiti?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    driver-class-name: com.mysql.jdbc.Driver
  activiti:
    # true:表不存在则自动创建,存在则更新(开发环境推荐)
    database-schema-update: true
    # 开启历史记录
    db-history-used: true
    # 历史记录级别:full 保存全部细节数据
    history-level: full
    # 不校验流程文件(避免启动时检查resources/processes下的文件)
    check-process-definitions: false

database-schema-update有几种模式:

  • false(默认):不创建/更新表,版本不匹配会抛异常(生产环境用)
  • true:表不存在则自动创建,存在则更新(开发环境用)
  • create-drop:启动时创建表,关闭时删除表(测试用)

Step 2:一键创建数据库表

配置好database-schema-update: true后,启动Spring Boot项目,Activiti7会自动创建约25张核心表

这些表按前缀分为几类:

前缀 全称 存储内容
ACT_RE_ Repository 流程定义、模型等静态部署资源
ACT_RU_ Runtime 运行时数据(流程实例、任务、变量),流程结束时删除
ACT_HI_ History 历史数据(已完成的流程实例、任务、变量)
ACT_ID_ Identity 用户、用户组及其关系
ACT_GE_ General 通用数据(流程图、部署文件等二进制资源)

你不需要手动创建任何表,全部由Activiti7自动完成。


Step 3:在BPMN上创建流程(静态流程)

① 安装IDEA插件

在IDEA中安装 actiBPM 插件,用于可视化绘制流程图。

② 创建BPMN文件

src/main/resources下新建一个processes文件夹,在里面创建.bpmn文件(如leave.bpmn)。

③ 绘制流程图

用IDEA的actiBPM插件绘制一个简单的请假审批流程图:

复制代码
开始 → 请假申请 → 部门经理审批 → 总经理审批 → 结束

每个节点(用户任务)可以设置名称、处理人等属性。

注意:如果编辑时出现中文乱码,将IDEA编码统一设置为UTF-8。


Step 4:使用占位符(UEL表达式)动态指定处理人

固定分配 是在BPMN中直接写死处理人ID(如assignee="zhangsan"),这在真实项目中基本不可行------审批人应该是动态的。

UEL表达式 就是Activiti的"占位符机制"。在BPMN的用户任务中,处理人字段写成表达式形式:

xml 复制代码
<userTask id="managerAudit" name="部门经理审批" activiti:assignee="${managerId}" />

这里的${managerId}就是一个占位符,具体值在流程启动时通过流程变量传入

UEL表达式支持两种方式:

  • UEL-Value${variableName},从流程变量中取值
  • UEL-Method${bean.method()},调用Spring Bean的方法动态计算

Step 5:使用流程变量传递业务数据、控制走向

流程变量 是Activiti中贯穿整个流程的数据载体。可以在以下时机设置:

① 启动流程时设置全局变量

java 复制代码
@Autowired
private RuntimeService runtimeService;

public void startLeaveProcess(String applicantId, String managerId) {
    Map<String, Object> variables = new HashMap<>();
    variables.put("applicantId", applicantId);  // 申请人
    variables.put("managerId", managerId);      // 部门经理(动态分配)
    variables.put("days", 3);                   // 请假天数(用于网关判断)
    
    ProcessInstance instance = runtimeService
        .startProcessInstanceByKey("leave", variables);
}

② 完成任务时设置变量

java 复制代码
@Autowired
private TaskService taskService;

public void completeTask(String taskId, boolean approved) {
    Map<String, Object> variables = new HashMap<>();
    variables.put("approved", approved);
    taskService.complete(taskId, variables);
}

流程变量在act_ru_variable运行时表中存储,流程结束后会被清除。


Step 6:使用网关控制流程分支

网关用于处理流程中的分支情况。

① 排他网关(Exclusive Gateway) ------ 多条分支只选一条执行

比如请假审批:3天以内部门经理批就行,3天以上需要总经理批。

在BPMN中,排他网关的出口连线上配置条件表达式:

  • 连线1:${days <= 3} → 走部门经理审批
  • 连线2:${days > 3} → 走总经理审批

② 并行网关(Parallel Gateway) ------ 所有分支同时执行

比如重大事项需要主编和副主编同时审核,两人都通过才能继续。

并行网关会创建多个并发的子流程,所有分支都执行完毕后才会聚合继续往下走。

网关本身在Java代码中不需要特殊处理,逻辑完全在BPMN流程图中配置。


Step 7:部署流程

流程定义(BPMN文件)需要部署到Activiti引擎中,才能被识别和使用。

方式一:自动部署

把BPMN文件放在resources/processes/目录下,Spring Boot启动时会自动扫描并部署该目录下的流程文件。

方式二:编程部署

java 复制代码
@Autowired
private RepositoryService repositoryService;

public void deployProcess() {
    Deployment deployment = repositoryService.createDeployment()
        .addClasspathResource("processes/leave.bpmn")
        .name("请假流程")
        .deploy();
    System.out.println("部署ID:" + deployment.getId());
}

部署后,流程定义会存入ACT_RE_PROCDEF表,BPMN文件内容存入ACT_GE_BYTEARRAY表。


Step 8:启动流程实例、查询任务、完成任务

流程部署后,就可以开始使用了。

① 启动流程实例

java 复制代码
@Autowired
private RuntimeService runtimeService;

public void startProcess() {
    Map<String, Object> variables = new HashMap<>();
    variables.put("managerId", "zhangsan");
    variables.put("days", 2);
    
    ProcessInstance instance = runtimeService
        .startProcessInstanceByKey("leave", variables);
    System.out.println("流程实例ID:" + instance.getId());
}

启动流程实例,就相当于"张三发起了一次请假申请"。每次发起都是一次独立的流程实例。

② 查询待办任务

java 复制代码
@Autowired
private TaskService taskService;

public List<Task> getMyTasks(String userId) {
    return taskService.createTaskQuery()
        .taskAssignee(userId)  // 查询分配给该用户的任务
        .list();
}

③ 完成任务

java 复制代码
public void completeTask(String taskId) {
    taskService.complete(taskId);
}

每完成一个任务,流程自动推进到下一个节点,直到走完全部节点,流程结束。


四、总结

用一张图总结整个流程:

复制代码
1. 引入依赖 + 配置application.yml
         ↓
2. 启动项目 → Activiti7自动创建25张数据库表
         ↓
3. 用actiBPM插件画流程图(.bpmn文件)
   - 节点处理人写UEL占位符:${managerId}
   - 网关出口写条件表达式:${days > 3}
         ↓
4. 部署流程(自动部署 或 编程部署)
         ↓
5. 业务代码调用API:
   - 启动流程(传入流程变量)
   - 查询待办任务
   - 完成任务(传入新的流程变量)
         ↓
6. 流程自动流转,直到结束

核心思想 :把"流程怎么走"画在BPMN图里(静态),把"谁审批、数据是什么"通过流程变量在运行时动态传入(动态)。这样流程变更只需要改BPMN图重新部署,不需要改Java代码

相关推荐
2601_9624408410 小时前
计算机毕业设计之健身房管理系统的设计与实现
java·开发语言·课程设计·旅游·宠物
TeamDev10 小时前
JxBrowser 9.3.0 版本发布啦!
java·后端·c#·混合应用·jxbrowser·浏览器控件·异步媒体设备
深盾科技_Virbox10 小时前
深盾科技·Virbox产品体系全景解读:软件安全如何从加密锁走向全生命周期
java·大数据·算法·安全·软件需求
豆瓣鸡10 小时前
Knife4j 接口文档
java
格子软件11 小时前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo
C++、Java和Python的菜鸟11 小时前
第1章 集合高级
java·jvm·python
ShiXZ21311 小时前
PDF-OCR文件识别篇(八):配置、运维与排错
java·运维·ocr·dubbo·springboot
彦为君11 小时前
Redis最新版本特性
java·数据库·redis·算法·bootstrap
格子软件12 小时前
2026年GEO优化系统源码解构:核心状态机与高并发流控深度剖析
java·vue.js·spring boot·vue·geo
weixin1997010801612 小时前
[特殊字符]《京东订单API(jd.order.detail.get)对接ERP:企业认证+OAuth授权避坑指南》(附Python源码)
java·数据库·python