news 2026/5/28 22:49:04

Activiti 5.22 保姆级入门:从25张表结构到第一个流程实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Activiti 5.22 保姆级入门:从25张表结构到第一个流程实例

Activiti 5.22 实战入门:从零构建请假审批系统

在数字化转型浪潮中,工作流引擎已成为企业级应用的核心组件。作为Java领域最成熟的流程引擎之一,Activiti以其轻量级架构和BPMN2.0标准支持,成为众多企业的首选方案。本文将基于5.22版本,通过一个完整的请假审批案例,带您从环境搭建到流程实例运行,掌握Activiti的核心使用逻辑。

1. 环境准备与基础配置

1.1 项目初始化

新建Spring Boot项目时,需添加以下关键依赖(以Maven为例):

<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>

配置文件中需要声明数据库连接和Activiti基础参数:

# 启用自动创建表结构 spring.activiti.database-schema-update=true # 禁用Activiti自带的用户体系 spring.activiti.db-identity-used=false

1.2 表结构快速解读

Activiti的25张表按功能可分为五类:

表前缀功能描述典型表举例
ACT_RE流程定义与资源存储ACT_RE_PROCDEF(流程定义)
ACT_RU运行时实例数据ACT_RU_TASK(运行中任务)
ACT_HI历史记录ACT_HI_PROCINST(历史实例)
ACT_ID身份认证(通常不使用)ACT_ID_USER(用户信息)
ACT_GE通用数据ACT_GE_BYTEARRAY(二进制)

提示:开发阶段建议开启database-schema-update,生产环境应改为false并通过SQL脚本管理表结构

2. 请假流程设计与部署

2.1 BPMN可视化设计

使用Eclipse插件或在线工具Camunda Modeler设计请假流程:

<!-- 简化的请假流程定义 --> <process id="leaveProcess" name="员工请假流程"> <startEvent id="start"/> <userTask id="applyLeave" name="提交请假申请"/> <userTask id="managerApprove" name="主管审批"/> <exclusiveGateway id="decision"/> <endEvent id="end"/> <sequenceFlow sourceRef="start" targetRef="applyLeave"/> <sequenceFlow sourceRef="applyLeave" targetRef="managerApprove"/> <sequenceFlow sourceRef="managerApprove" targetRef="decision"/> <sequenceFlow sourceRef="decision" targetRef="end"> <conditionExpression>${approved}</conditionExpression> </sequenceFlow> </process>

2.2 流程部署实战

通过RepositoryService部署流程定义:

public class ProcessDeployer { @Autowired private RepositoryService repositoryService; public void deployProcess() { Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/leave.bpmn20.xml") .name("员工请假流程v1.0") .deploy(); System.out.println("部署ID: " + deployment.getId()); } }

部署成功后可在ACT_RE_PROCDEF表中查询到流程定义信息,关键字段包括:

  • ID_: 流程定义唯一标识(格式:processKey:version:generatedId)
  • KEY_: 流程业务标识(对应XML中的id属性)
  • VERSION_: 版本号(每次部署相同KEY的流程会自动递增)

3. 流程实例运行与任务处理

3.1 启动流程实例

模拟员工张三发起请假申请:

public class LeaveStarter { @Autowired private RuntimeService runtimeService; public void startProcess() { Map<String, Object> variables = new HashMap<>(); variables.put("applicant", "zhangsan"); variables.put("days", 3); ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveProcess", variables); System.out.println("流程实例ID: " + instance.getId()); } }

此时数据库变化:

  • ACT_RU_EXECUTION新增执行记录
  • ACT_RU_TASK生成待办任务(提交请假申请)
  • ACT_RU_VARIABLE存储流程变量

3.2 任务处理与审批

获取并完成任务的标准操作:

public class TaskServiceDemo { @Autowired private TaskService taskService; public void completeTask(String taskId) { // 查询任务 Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); // 完成任务时传递审批结果 Map<String, Object> vars = new HashMap<>(); vars.put("approved", true); taskService.complete(taskId, vars); } }

任务处理后的状态迁移:

  1. 当前任务从ACT_RU_TASK删除
  2. 新任务(主管审批)插入ACT_RU_TASK
  3. 历史记录写入ACT_HI_TASKINST

4. 高级特性与实战技巧

4.1 流程变量管理

Activiti支持多种变量类型:

变量类型Java类型数据库存储方式
字符串StringACT_RU_VARIABLE.TEXT_
数字Integer/Double等ACT_RU_VARIABLE.DOUBLE_
序列化对象实现Serializable的类ACT_RU_VARIABLE.BYTES_
自定义类型实现VariableType接口根据实现决定

设置变量的三种方式:

// 1. 启动流程时设置 runtimeService.startProcessInstanceWithVariables(); // 2. 任务完成时设置 taskService.complete(taskId, variables); // 3. 运行时设置 runtimeService.setVariable(executionId, varName, value);

4.2 历史数据查询

通过HistoryService获取已完成流程信息:

// 查询某用户发起的流程 List<HistoricProcessInstance> instances = historyService .createHistoricProcessInstanceQuery() .startedBy("zhangsan") .list(); // 获取流程变量历史 List<HistoricVariableInstance> variables = historyService .createHistoricVariableInstanceQuery() .processInstanceId(instanceId) .list();

4.3 异常处理实践

常见问题及解决方案:

  1. 外键约束错误

    • 现象:删除部署时报错
    • 方案:使用级联删除
    repositoryService.deleteDeployment(deploymentId, true);
  2. 事务超时问题

    • 现象:长时间运行流程报TransactionException
    • 方案:调整事务超时时间
    spring.activiti.async-executor-activate=true spring.activiti.async-executor-default-timeout=300000
  3. 流程版本冲突

    • 现象:新部署流程后旧实例报版本错误
    • 方案:明确指定流程定义版本
    runtimeService.startProcessInstanceById( "leaveProcess:2:32503", variables);

5. 性能优化建议

经过多个项目实践,总结出以下优化方向:

数据库层面

  • 定期清理历史数据(配置history-level为适当级别)
  • 为常用查询字段建立索引(如ACT_RU_TASK.ASSIGNEE_

代码层面

  • 批量操作使用saveBatch方法替代循环单条处理
  • 避免在流程变量中存储大对象

架构层面

graph TD A[客户端] --> B[API网关] B --> C[业务微服务] C --> D[Activiti服务] D --> E[数据库集群]

典型优化配置示例:

# 启用异步执行器处理定时任务 spring.activiti.async-executor-activate=true # 设置JPA批量插入大小 spring.jpa.properties.hibernate.jdbc.batch_size=50 # 历史数据保留策略 spring.activiti.history-level=audit

在电商订单审核系统中,通过上述优化方案,流程处理吞吐量提升了3倍,数据库负载降低40%。关键点在于合理控制历史数据量和采用异步处理机制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 22:46:08

8086/8088中断栈操作详解

1. 完整压栈过程&#xff08;从中断触发到当前&#xff09;第一阶段&#xff1a;硬件自动压栈&#xff08;中断响应时&#xff09;当 INT 1 指令执行或单步中断触发时&#xff0c;CPU 自动按顺序压入&#xff1a;顺序压入内容大小SP 变化1FLAGS2 字节SP ← SP - 22CS2 字节SP ←…

作者头像 李华
网站建设 2026/5/28 22:46:05

【C++】零基础入门 · 第 10 节:结构体与类

在前面的章节中,我们学习了变量、数组、函数、指针和动态内存。这些都是 C++ 的基础构件,但随着程序变得越来越复杂,你会发现一个问题:相关的数据散落在各个变量里,传递和管理起来非常麻烦。比如要表示一个学生的信息(姓名、年龄、成绩),你得定义三个独立的变量,每次传…

作者头像 李华
网站建设 2026/5/28 22:44:21

项目介绍 MATLAB实现基于偏最小二乘回归(PLS)进行回归预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

MATLAB实现基于偏最小二乘回归(PLS)进行回归预测的详细项目实例项目背景介绍偏最小二乘回归&#xff0c;简称 PLS&#xff0c;是一种兼顾降维、特征提取与回归建模的统计学习方法&#xff0c;在高维、多共线、样本量有限、噪声干扰明显的真实工程场景中具有很高的实用价值。许多…

作者头像 李华
网站建设 2026/5/28 22:43:26

随机变形对模型训练结果的影响

0、结论1、全部随机变形时的训练结果2、80%随机变形时的训练结果3、60%随机变形时的训练结果4、40%随机变形时的训练结果5、20%随机变形时的训练结果6、0%随机变形时的训练结果

作者头像 李华
网站建设 2026/5/28 22:40:00

3D打印机改造笔式绘图仪:硬件组装、固件配置与G代码生成全攻略

1. 项目概述与核心思路拆解将一台闲置或常用的3D打印机改造为笔式绘图仪&#xff0c;这个想法听起来像是创客圈子里才会有的“疯狂”点子&#xff0c;但实际操作下来&#xff0c;你会发现它逻辑自洽&#xff0c;且极具实用价值。我手头这台Anycubic Kobra 2 Neo&#xff0c;作为…

作者头像 李华