【Spring全家桶】Spring Task 定时任务实战:从入门到 Cron 表达式精通

【Spring全家桶】Spring Task 定时任务实战:从入门到 Cron 表达式精通

在开发中,我们经常需要处理一些定时任务:比如每天凌晨同步数据、每隔 1 小时清理缓存、或者在宠物领养成功 30 天后自动发送回访提醒。Spring Task 为我们提供了最简单的实现方案。


一、 核心概念

Spring Task 是 Spring Framework 的一部分,通过注解即可实现任务调度。

  • TaskScheduler:任务调度器,负责执行定时任务。
  • Trigger:触发器,决定任务什么时候执行(通常使用 Cron 表达式)。

二、 快速上手步骤

1. 开启定时任务支持

在 Spring Boot 启动类或配置类上添加 @EnableScheduling 注解。

java 复制代码
@SpringBootApplication
@EnableScheduling // 开启定时任务开关
public class PetApplication {
    public static void main(String[] args) {
        SpringApplication.run(PetApplication.class, args);
    }
}

2. 编写定时任务类

只需在普通 Service 类的方法上添加 @Scheduled 注解即可。

java 复制代码
@Component
public class PetTask {

    // 每隔 5 秒执行一次
    @Scheduled(fixedRate = 5000)
    public void checkAdoptionStatus() {
        System.out.println("执行状态检查:" + LocalDateTime.now());
    }
}

三、 @Scheduled 注解参数详解

Spring Task 提供了三种主流的触发方式:

参数 含义 示例
fixedRate 固定频率。从任务开始执行时计时,每隔 X 毫秒执行。 @Scheduled(fixedRate = 5000)
fixedDelay 固定延迟。从任务结束执行时计时,间隔 X 毫秒再执行。 @Scheduled(fixedDelay = 5000)
cron Cron 表达式。支持非常复杂的定时规则。 @Scheduled(cron = "0 0 2 * * ?")

四、 重点:Cron 表达式快速通关

Cron 表达式是一个字符串,分为 6 或 7 个域,空格隔开:

复制代码
秒 分 时 日 月 周 [年]
  • 0 0 2 1 * ? :每月 1 号凌晨 2 点执行。
  • 0 0/30 9-17 * * ? :朝九晚五工作时间内,每隔 30 分钟执行。
  • 0 0 12 ? * WED :每周三中午 12 点执行。

五、 进阶:配置多线程任务池

注意:Spring Task 默认是单线程的。如果你的项目中有多个任务同时到达执行时间,它们会排队等待。

为了提高性能,建议配置线程池:

java 复制代码
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 设置 10 个线程的池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}

六、 实战场景:宠物系统定时提醒

在你的项目中,可以这样应用:

java 复制代码
@Service
public class ReminderTask {

    @Autowired
    private HealthRecordMapper healthMapper;

    /**
     * 每天早上 8 点,扫描即将需要接种疫苗的宠物并发送通知
     */
    @Scheduled(cron = "0 0 8 * * ?")
    public void vaccineReminder() {
        // 查询明天需要打疫苗的记录
        List<HealthRecord> list = healthMapper.findUpcomingVaccines();
        for (HealthRecord record : list) {
            // 发送逻辑...
            System.out.println("提醒:宠物 " + record.getPetId() + " 明天需接种疫苗");
        }
    }
}

七、 总结

Spring Task 的优势在于零配置、上手快 。但如果你的项目是分布式集群部署,需要注意 Spring Task 会在多台服务器上同时运行,产生重复任务。此时建议配合 Redis 分布式锁 使用,或者升级为 XXL-JOB 等分布式任务平台。


作者: CodeToGym

相关推荐
w_zero_one15 分钟前
算法--模拟
java·数据结构·算法
小灰灰搞电子19 分钟前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
Javatutouhouduan22 分钟前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David39 分钟前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源1 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
卷无止境1 小时前
面向arm64桌面客户端开发全景:语言、框架与生态
后端·python
秋天的怀念_David1 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122661 小时前
网络编程^
java
Thinker QAQ2 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
IT_陈寒2 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端