Spring Boot 2.x 整合 Activiti 7 工作流引擎:从零搭建一个请假审批系统

📅 2026/7/23 6:38:14 👁️ 阅读次数 📝 编程学习
Spring Boot 2.x 整合 Activiti 7 工作流引擎:从零搭建一个请假审批系统

Spring Boot 2.x 整合 Activiti 7 工作流引擎:从零搭建一个请假审批系统

在企业级应用开发中,工作流引擎是处理复杂业务流程的核心组件。Activiti 作为轻量级的开源工作流引擎,与 Spring Boot 的整合能够显著提升开发效率。本文将带你从零开始,构建一个完整的请假审批系统,涵盖从环境搭建到 API 设计的全流程。

1. 环境准备与项目初始化

1.1 创建 Spring Boot 项目

使用 Spring Initializr 快速生成项目骨架,选择以下关键依赖:

curl https://start.spring.io/starter.zip \ -d dependencies=web,activiti,lombok \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.3 \ -d groupId=com.example \ -d artifactId=leave-approval \ -o leave-approval.zip

关键依赖说明:

  • Spring Web: 提供 RESTful API 支持
  • Activiti Spring Boot Starter: 工作流引擎核心
  • Lombok: 简化实体类编写

1.2 数据库配置

application.yml中配置数据源和 Activiti 参数:

spring: datasource: url: jdbc:mysql://localhost:3306/activiti_db username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver activiti: database-schema-update: true history-level: audit async-executor-activate: false

注意:database-schema-update设置为 true 时,启动时会自动创建 Activiti 所需的 28 张表

2. 流程设计与部署

2.1 绘制 BPMN 流程图

使用 Activiti Modeler 或 Eclipse BPMN2 插件设计请假流程:

<!-- leave_process.bpmn --> <bpmn2:process id="leaveProcess" name="请假流程"> <bpmn2:startEvent id="startEvent"/> <bpmn2:userTask id="applyTask" name="提交申请" activiti:assignee="${applicant}"/> <bpmn2:userTask id="approveTask" name="经理审批" activiti:assignee="${approver}"/> <bpmn2:endEvent id="endEvent"/> <!-- 省略序列流定义 --> </bpmn2:process>

2.2 程序化部署流程

创建ProcessDeployer服务类实现自动部署:

@Service public class ProcessDeployer { @Autowired private RepositoryService repositoryService; public String deployProcess(String bpmnPath) { Deployment deployment = repositoryService.createDeployment() .addClasspathResource(bpmnPath) .name("请假流程部署") .deploy(); return deployment.getId(); } }

3. 业务集成与 API 设计

3.1 请假单实体设计

@Entity @Data public class LeaveRequest { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String applicant; private String approver; private LocalDate startDate; private LocalDate endDate; private String reason; private String status; private String processInstanceId; }

3.2 核心 REST API 实现

启动流程实例
@RestController @RequestMapping("/api/leave") public class LeaveController { @Autowired private RuntimeService runtimeService; @PostMapping("/start") public String startProcess(@RequestBody LeaveRequest request) { Map<String, Object> variables = new HashMap<>(); variables.put("applicant", request.getApplicant()); variables.put("approver", request.getApprover()); ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveProcess", variables); return instance.getId(); } }
任务查询与处理
@GetMapping("/tasks") public List<TaskDTO> getTasks(@RequestParam String assignee) { return taskService.createTaskQuery() .taskAssignee(assignee) .list() .stream() .map(task -> { TaskDTO dto = new TaskDTO(); dto.setTaskId(task.getId()); dto.setName(task.getName()); dto.setCreateTime(task.getCreateTime()); return dto; }).collect(Collectors.toList()); } @PostMapping("/complete/{taskId}") public void completeTask(@PathVariable String taskId, @RequestBody Map<String, Object> variables) { taskService.complete(taskId, variables); }

4. 高级功能实现

4.1 流程变量管理

// 设置流程变量 runtimeService.setVariable(processInstanceId, "days", 3); // 获取流程变量 Integer days = (Integer) runtimeService.getVariable( processInstanceId, "days");

4.2 历史数据查询

@GetMapping("/history") public List<HistoricActivityInstance> getHistory( @RequestParam String processInstanceId) { return historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceStartTime().asc() .list(); }

4.3 邮件通知集成

application.yml中添加邮件配置:

spring: mail: host: smtp.example.com username: admin@example.com password: yourpassword

创建任务监听器:

@Component public class TaskAssignmentListener implements TaskListener { @Autowired private JavaMailSender mailSender; @Override public void notify(DelegateTask task) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(task.getAssignee()); message.setSubject("您有新的待办任务"); message.setText("任务名称: " + task.getName()); mailSender.send(message); } }

5. 系统优化与监控

5.1 性能调优建议

配置项推荐值说明
spring.activiti.async-executor-activatetrue启用异步执行器
spring.activiti.async-executor-core-pool-size4核心线程数
spring.activiti.job-executor-acquire-wait-time5000任务获取等待时间(ms)

5.2 Actuator 监控端点

启用以下端点监控工作流状态:

management: endpoints: web: exposure: include: health,info,activiti

访问/actuator/activiti可获取流程引擎状态信息。

6. 前端集成示例

提供简单的 Vue.js 前端代码片段:

// 获取待办任务 fetch('/api/leave/tasks?assignee=user1') .then(response => response.json()) .then(tasks => { this.taskList = tasks; }); // 提交审批 completeTask(taskId, { approved: true }) { fetch(`/api/leave/complete/${taskId}`, { method: 'POST', body: JSON.stringify({ approved: true }) }); }