Spring Task 是 Spring 框架提供的任务调度工具,用于按照约定的时间自动执行某段 Java 代码。它在企业级应用中非常常见,主要用于处理需要定时触发的业务逻辑。
1. 应用场景
Spring Task 广泛应用于各种自动化处理场景,包括:
- 通用场景:信用卡或银行贷款每月还款提醒、火车票系统处理未支付订单、入职纪念日自动发送通知等。
- 本项目场景:每分钟检查一次并自动取消支付超时(超过 15 分钟未支付)的订单,以及每天凌晨 1 点自动处理处于“派送中”但未点击完成的异常订单。
2. 核心配置:cron 表达式
cron 表达式是一个字符串,通过 6 或 7 个域(秒、分、时、日、月、周、年)来定义任务触发的时间。
- 通配符含义:例如
*表示所有值(每秒/每分),?表示不说明具体值(通常在“日”和“周”中冲突时使用)。 - 经典示例:
*/5 * * * * ?代表每隔 5 秒执行一次;0 0 1 * * ?代表每天凌晨 1 点执行一次。 - 建议:由于语法较复杂,通常推荐使用在线生成器来生成所需的表达式。
3. 代码实现步骤
在 Spring Boot 项目中,使用 Spring Task 仅需三步:
- 导入坐标:通常
spring-boot-starter已包含基础依赖,无需额外导入spring-context。 - 开启调度:在项目启动类上添加
@EnableScheduling注解。 - 编写任务类:在定时任务类上添加
@Component,在具体方法上添加@Scheduled(cron = "...")。
4. 示例代码实现逻辑
在处理订单状态时,定时任务类会调用对应的持久层方法(如 getByStatusAndOrdertimeLT),查询出符合超时条件(如状态为待支付且下单时间小于“当前时间-15分钟”)的订单,然后循环更新其状态为“已取消”。
概念类比: Spring Task 就像是给系统定了一个**“全自动闹钟”**: 你不需要手动盯着时间去处理任务,只需要给闹钟定好规矩(cron 表达式),比如“每分钟响一次”或“每天夜里 1 点响”。闹钟一响,系统就会自动跳起来去检查数据库里有没有该处理的事情(任务代码),干完活后它会再次安静下来,等待下一次闹钟响起。