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-activate | true | 启用异步执行器 |
| spring.activiti.async-executor-core-pool-size | 4 | 核心线程数 |
| spring.activiti.job-executor-acquire-wait-time | 5000 | 任务获取等待时间(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 }) }); }