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

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%。关键点在于合理控制历史数据量和采用异步处理机制。

http://www.jsqmd.com/news/905914/

相关文章:

  • windows上的codex安装后无法使用应用内的浏览器
  • 2026年国产多参数水质分析仪十大品牌深度排名:技术实力、行业渗透率与服务能力全景解析 - 液体流量液位品牌推荐
  • 华为eNSP模拟器实战:从IPv4到IPv6的平滑过渡,一个实验搞定RIPng、BGP和6to4隧道
  • 网安已饱和?还是真缺人?戳破行业最扎心的就业怪圈
  • 基于Arduino与PID控制的智能循迹机器人设计与实现
  • 监控局域网的软件有哪些?实用PC端大盘点!企业都在用
  • 使用Taotoken CLI工具一键配置多开发环境下的模型调用密钥
  • 什么是OPC(一人公司)?
  • 从游戏资源解构到创意重构:Harepacker复活版的现代游戏编辑哲学
  • 百度竞价代运营网络推广哪家强?2026年靠谱服务商排名与选型指南 - GEO优化
  • 基于CentOS7.9部署LAMP(二)基于域名的虚拟主机配置wordpress和discuz
  • 卖 PLC 可编程控制器怎么找客户?下游工厂都在哪
  • 从0到63%:Gemini企业客户30日留存跃迁路径(含Prompt工程×会话记忆×状态持久化三重加固)
  • 2026权威实测:16款降AIGC软件横评,论文安全过关就靠它!
  • CAXA 尺寸驱动
  • ctf show web入门259
  • 硬件工程师别只懂技术,职场思维同样重要
  • 数据库基础概述
  • 2026 排烟防火阀厂家推荐盘点:3C 全认证 + GB15930-2024合规 - 资讯快报
  • 体验TaoToken聚合API的稳定性,在多日连续调用中观察延迟表现
  • 代码即玩法:非典型游戏开发的英文提示词实践
  • 卖真空泵怎么找客户?下游工厂都在哪里
  • Veo 2 API沙箱环境即将下线倒计时!仅剩最后14天迁移窗口,这份跨版本兼容性迁移矩阵请立刻保存
  • CAXA 标注间距
  • 揭秘Java世界中safepoint之调用过程和生命周期解析
  • 基于Arduino与NRF24L01的厨房油烟机智能联动控制系统设计与实现
  • 对比使用前后Taotoken如何让我的模型API账单变得清晰易懂
  • 2025-2026 AI全媒体营销服务商选型 - 资讯快报
  • Arduino驱动MAX7219点阵屏:从SPI通信原理到动态显示实战
  • 【TSP问题】基于遗传算法GA求解TSP问题附Matlab代码