初识Spring Task

27 阅读2分钟

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 仅需三步:

  1. 导入坐标:通常 spring-boot-starter 已包含基础依赖,无需额外导入 spring-context
  2. 开启调度:在项目启动类上添加 @EnableScheduling 注解。
  3. 编写任务类:在定时任务类上添加 @Component,在具体方法上添加 @Scheduled(cron = "...")

4. 示例代码实现逻辑

在处理订单状态时,定时任务类会调用对应的持久层方法(如 getByStatusAndOrdertimeLT),查询出符合超时条件(如状态为待支付且下单时间小于“当前时间-15分钟”)的订单,然后循环更新其状态为“已取消”。

概念类比: Spring Task 就像是给系统定了一个**“全自动闹钟”**: 你不需要手动盯着时间去处理任务,只需要给闹钟定好规矩(cron 表达式),比如“每分钟响一次”或“每天夜里 1 点响”。闹钟一响,系统就会自动跳起来去检查数据库里有没有该处理的事情(任务代码),干完活后它会再次安静下来,等待下一次闹钟响起。