springboot flowable(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在企业级应用开发中,业务流程管理(BPM)是提升系统效率和规范性的关键环节。Spring Boot 作为 Java 后端开发的热门框架,以其快速启动和轻量级特性深受开发者青睐。而 Flowable 则是开源领域内功能强大的工作流引擎,能够灵活支持复杂的流程定义与执行。本文将从零开始,结合 Spring Boot 与 Flowable 的技术栈,为编程初学者和中级开发者系统讲解如何构建基于流程引擎的业务系统。通过实际案例和代码示例,帮助读者掌握核心概念与开发技巧,并理解两者如何协同解决真实场景中的业务需求。
环境搭建与基础配置
依赖引入与工程初始化
首先,创建一个 Spring Boot 工程,并在 pom.xml
中添加 Flowable 的核心依赖:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
这里引入了 Flowable 的基础启动器和 MySQL 数据库驱动。Flowable 会自动生成流程相关的数据库表结构,因此无需手动创建表。
配置数据库连接
在 application.properties
中配置数据库信息:
spring.datasource.url=jdbc:mysql://localhost:3306/flowable?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
通过 ddl-auto=update
确保 Flowable 自动更新数据库表结构,避免手动维护的复杂性。
核心概念解析
流程引擎(Process Engine)
Flowable 的核心是流程引擎,它负责解析 BPMN 流程定义文件、管理流程实例的生命周期,并协调任务执行。可以将其想象为一个“交通指挥系统”:
- 流程定义(Process Definition):类似交通规划图,描述流程的各个节点(如开始事件、用户任务、网关等)。
- 流程实例(Process Instance):相当于一辆行驶中的车辆,代表某次具体流程的执行过程。
- 任务(Task):流程中的具体操作节点,如审批、填写表单等。
BPMN 2.0 标准
Flowable 基于 BPMN 2.0 标准定义流程。例如,以下 XML 片段描述了一个简单的请假审批流程:
<process id="leaveRequest" name="请假流程">
<startEvent id="startEvent"/>
<userTask id="applyTask" name="提交请假申请"/>
<sequenceFlow sourceRef="startEvent" targetRef="applyTask"/>
<endEvent id="endEvent"/>
<sequenceFlow sourceRef="applyTask" targetRef="endEvent"/>
</process>
通过 <userTask>
定义用户需要执行的任务,<sequenceFlow>
控制流程的流转方向。
实战案例:搭建请假审批系统
步骤一:设计流程定义文件
创建 src/main/resources/processes/leave.bpmn
,定义完整的请假流程:
<process id="leaveRequest" name="请假流程">
<startEvent id="startEvent"/>
<userTask id="applyTask" name="提交请假申请" activiti:formKey="applyForm"/>
<sequenceFlow sourceRef="startEvent" targetRef="applyTask"/>
<userTask id="approveTask" name="部门经理审批" activiti:formKey="approveForm"/>
<sequenceFlow sourceRef="applyTask" targetRef="approveTask"/>
<exclusiveGateway id="gateway"/>
<sequenceFlow sourceRef="approveTask" targetRef="gateway"/>
<userTask id="financeTask" name="财务确认" activiti:formKey="financeForm"/>
<sequenceFlow sourceRef="gateway" targetRef="financeTask" conditionExpression="${approved}"/>
<endEvent id="endEvent"/>
<sequenceFlow sourceRef="financeTask" targetRef="endEvent"/>
</process>
此流程包含:
- 提交申请 → 2. 部门经理审批 → 3. 根据审批结果(
approved
变量)决定是否进入财务确认 → 4. 结束。
步骤二:部署流程定义
通过 Spring Boot 的 @Component
注入流程引擎,并在启动时部署流程:
@Component
public class ProcessDeployer {
@Autowired
private RepositoryService repositoryService;
@PostConstruct
public void deployProcess() {
repositoryService.createDeployment()
.name("请假流程部署")
.addClasspathResource("processes/leave.bpmn")
.deploy();
}
}
@PostConstruct
确保部署在应用启动时自动执行。
步骤三:启动流程实例
创建一个控制器来触发流程的开始:
@RestController
@RequestMapping("/leave")
public class LeaveController {
@Autowired
private RuntimeService runtimeService;
@PostMapping("/apply")
public String startProcess() {
Map<String, Object> variables = new HashMap<>();
variables.put("employeeName", "张三");
variables.put("days", 3);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
"leaveRequest", variables);
return "流程启动成功,实例ID:" + processInstance.getId();
}
}
通过 startProcessInstanceByKey
方法启动名为 leaveRequest
的流程,并传递初始变量。
流程任务管理与操作
查询当前待办任务
用户可能需要查看自己的待办任务列表。使用 TaskService
实现:
@GetMapping("/tasks")
public List<Task> getMyTasks() {
return taskService.createTaskQuery()
.taskAssignee("manager") // 根据分配人过滤
.list();
}
通过 taskAssignee
参数指定当前用户,返回所有待处理任务。
完成任务与变量传递
在审批完成后,更新变量并完成任务:
@PostMapping("/complete/{taskId}")
public String completeTask(@PathVariable String taskId, @RequestParam boolean approved) {
Map<String, Object> variables = new HashMap<>();
variables.put("approved", approved);
taskService.complete(taskId, variables);
return "任务已完成,审批结果:" + approved;
}
complete
方法会根据流程定义中的条件网关(如 <exclusiveGateway>
)决定后续流向。
流程监控与调试技巧
查看流程图与实例状态
Flowable 提供了内置的管理控制台,可通过以下方式启用:
flowable.idm.enabled=true
flowable.task.service.enabled=true
访问 http://localhost:8080/flowable-idm/app
登录后,可查看部署的流程、正在运行的实例及任务详情。
使用日志追踪流程执行
在流程定义中添加 activiti:trace
属性,或通过日志框架记录关键节点的执行情况:
@Value("${logging.level.org.flowable:INFO}")
private String flowableLogLevel;
通过调整日志级别,开发者可以跟踪流程变量的变化和任务分配情况。
进阶功能与优化建议
动态流程调整
Flowable 支持在运行时修改流程定义,例如通过 ProcessEngineConfiguration
配置:
@Configuration
public class FlowableConfig {
@Autowired
public void configureEngine(ProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setHistory("full");
processEngineConfiguration.setDeploymentResourceNamePattern("processes/*.bpmn");
}
}
通过 setDeploymentResourceNamePattern
自动扫描流程文件,实现热更新。
与 Spring Security 集成
将流程任务与用户权限结合,例如在任务分配时关联 Spring Security 的用户角色:
@Autowired
private Authentication authentication;
// 在任务查询时
.taskCandidateGroup(authentication.getAuthorities().iterator().next().getAuthority())
确保只有具备相应角色的用户才能处理任务。
总结
通过本文的讲解,开发者可以掌握如何利用 Spring Boot Flowable 构建灵活的业务流程系统。从环境搭建到核心概念解析,再到实际案例的全流程演示,我们覆盖了从基础到进阶的多个维度。Flowable 的强大之处在于其对 BPMN 标准的深度支持和与 Spring Boot 的无缝集成,这使得开发者能够专注于业务逻辑的实现,而非底层流程引擎的复杂性。建议读者在学习后,尝试将此技术应用到实际项目中,例如订单审批、工单处理等场景,以巩固知识并探索更多高级功能。