Spring Boot中使用@Scheduled做定时任务的基本步骤

 更新时间:2026年09月02日 09:50:13   作者:J2虾虾  
Spring Boot是一个流行的Java框架,它极大地简化了企业级应用程序的开发,其中@Scheduled注解用于定时执行任务,这为开发者提供了强大的计划任务执行功能,这篇文章主要介绍了Spring Boot中使用@Scheduled做定时任务的基本步骤,需要的朋友可以参考下

前言

在 Spring Boot 中,@Scheduled 注解是实现定时任务最常用且便捷的方式,它基于 Spring 的 Task Scheduling 框架,支持多种触发规则,如固定间隔、固定延迟和 Cron 表达式。

基本使用步骤

  • 启用定时任务‌:在 Spring Boot 的主启动类或任意 @Configuration 配置类上添加 @EnableScheduling 注解,以开启对 @Scheduled 注解的支持。

    @SpringBootApplication
    @EnableScheduling
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    
  • 创建定时任务‌:在任意 Spring 管理的 Bean(如 @Component@Service 等)中,将需要定时执行的方法上添加 @Scheduled 注解,并指定触发规则。

@Scheduled 的触发方式

@Scheduled 注解提供了多种方式来定义任务执行的时间规则,‌必须且只能选择其中一种‌。

  • cron 表达式(最灵活)‌:使用 Cron 表达式可以精确控制任务在特定的时间点执行,例如每天、每周的特定时刻。

    @Component
    public class CronTask {
        // 每天凌晨 2 点执行
        @Scheduled(cron = "0 0 2 * * ?")
        public void dailyTask() {
            System.out.println("每日定时任务执行: " + new Date());
        }
    
        // 每 5 秒执行一次
        @Scheduled(cron = "0/5 * * * * ?")
        public void everyFiveSeconds() {
            System.out.println("每5秒执行: " + new Date());
        }
    }
    
  • fixedRate(固定速率)‌:从‌上一次任务开始执行的时间点‌算起,每隔指定的毫秒数执行一次。‌无论上一次任务是否执行完毕,到时间点就会触发下一次执行‌。

    @Component
    public class FixedRateTask {
        // 每 5000 毫秒(5秒)执行一次,从方法开始执行时计时
        @Scheduled(fixedRate = 5000)
        public void fixedRateTask() {
            System.out.println("固定速率任务执行: " + new Date());
            try {
                Thread.sleep(3000); // 模拟任务执行耗时3秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
  • fixedDelay(固定延迟)‌:从‌上一次任务执行结束的时间点‌算起,等待指定的毫秒数后,再执行下一次任务。这种方式能确保任务不会重叠。

    @Component
    public class FixedDelayTask {
        // 上一次任务执行结束后,等待 5000 毫秒(5秒)再执行下一次
        @Scheduled(fixedDelay = 5000)
        public void fixedDelayTask() {
            System.out.println("固定延迟任务执行: " + new Date());
            try {
                Thread.sleep(3000); // 模拟任务执行耗时3秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
  • initialDelay(初始延迟)‌:通常与 fixedRate 或 fixedDelay 配合使用,用于指定任务在应用启动后,‌首次执行前的延迟时间‌。

@Component
public class InitialDelayTask {
    // 应用启动后延迟 10 秒,之后每隔 5 秒执行一次
    @Scheduled(initialDelay = 10000, fixedRate = 5000)
    public void initialDelayTask() {
        System.out.println("初始延迟任务执行: " + new Date());
    }
}

Cron 表达式语法

Cron 表达式由 6 或 7 个字段组成(秒 分 时 日 月 周 [年]),字段间用空格分隔。常用符号如下:

字段允许值特殊符号说明
0-59* / , -* 表示每秒,/ 表示间隔(如 5/15 表示 5, 20, 35, 50 秒),, 表示列举(如 5,20
0-59* / , -
0-23* / , -
1-31* / , - ? L W? 表示不指定,L 表示最后一天,W 表示最近的工作日
1-12 或 JAN-DEC* / , -
1-7 或 SUN-SAT* / , - ? L #? 表示不指定,L 表示最后一天,# 表示第几个(如 6#3 表示每月第三个星期五)
1970-2099* / , -可选

常见示例‌:

  • 0 0 12 * * ?:每天中午 12:00:00 执行。
  • 0 15 10 ? * *:每天上午 10:15:00 执行。
  • 0 0/5 * * * ?:每 5 分钟执行一次。
  • 0 0 2 ? * 6L:每月最后一个星期五的凌晨 2:00:00 执行。
  • 0 0 12 15 * ?:每月 15 日中午 12:00:00 执行。

多线程与并发执行

默认情况下,Spring Boot 的 @Scheduled 任务是‌单线程串行执行‌的。这意味着如果一个任务执行时间过长,会阻塞其他任务的执行。

要实现‌多任务并发执行‌,需要自定义一个 TaskScheduler Bean,并设置线程池大小:

@Configuration
public class SchedulerConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 设置线程池大小为10
        scheduler.setThreadNamePrefix("scheduled-task-");
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        scheduler.initialize();
        return scheduler;
    }
}

此外,如果任务本身是耗时操作(如调用外部 API),可以结合 @Async 注解实现异步执行,但这需要额外配置 @EnableAsync

注意事项

  • 时区问题‌:Cron 表达式默认使用服务器的本地时区。如需指定时区,可使用 zone 属性,例如 @Scheduled(cron = "0 0 2 * * ?", zone = "Asia/Shanghai")
  • 分布式环境‌:在多个服务实例部署时,每个实例都会执行定时任务,可能导致任务重复执行。此时应考虑使用分布式调度框架(如 XXL-JOB、Quartz)或结合 Redis 分布式锁来保证任务的唯一性。
  • 任务持久化‌:@Scheduled 任务是内存级的,应用重启后任务信息会丢失。如需持久化,需集成 Quartz 等框架。

总结

到此这篇关于Spring Boot中使用@Scheduled做定时任务的基本步骤的文章就介绍到这了,更多相关SpringBoot @Scheduled做定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java连接MySQL数据库命令行程序过程

    Java连接MySQL数据库命令行程序过程

    SQL编程包括两种形式,一种是过程化编程,主要通过数据库交互式工具,通过存储过程、触发器、函数等形式的编程;另一种是嵌入式SQL编程,将SQL语句嵌入到高级开发语言,完成数据的各种操作
    2021-10-10
  • Mybatis有查询结果但存不进实体类的解决方案

    Mybatis有查询结果但存不进实体类的解决方案

    这篇文章主要介绍了Mybatis有查询结果但存不进实体类的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java 插入排序之希尔排序的实例

    Java 插入排序之希尔排序的实例

    这篇文章主要介绍了Java 插入排序之希尔排序的实例的相关资料,需要的朋友可以参考下
    2017-07-07
  • 25行Java代码将普通图片转换为字符画图片和文本的实现

    25行Java代码将普通图片转换为字符画图片和文本的实现

    这篇文章主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 命令行编译java文件方式

    命令行编译java文件方式

    这篇文章主要介绍了命令行编译java文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot使用Apache POI实现导出Word和PPT的完整代码

    SpringBoot使用Apache POI实现导出Word和PPT的完整代码

    POI-TL(POI Template Language)是一个基于Apache POI的Word模板引擎,这篇文章主要介绍了SpringBoot如何使用Apache POI实现导出Word和PPT,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-03-03
  • Mybatis Plus框架项目落地实践分析总结

    Mybatis Plus框架项目落地实践分析总结

    这篇文章主要为大家介绍了Mybatis Plus框架项目落地实践分析总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Springboot如何读取resources下的json配置文件

    Springboot如何读取resources下的json配置文件

    这篇文章主要介绍了Springboot如何读取resources下的json配置文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring中Properties的配置方式

    Spring中Properties的配置方式

    这篇文章主要介绍了Spring中Properties的配置方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java编程生产者消费者实现的四种方法

    Java编程生产者消费者实现的四种方法

    Java生产者和消费者问题是线程安全模型中的经典问题:生产者和消费者在同一个时间段共用同一个存储空间,生产者向存储空间中添加产品呢,消费者取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞
    2021-10-10

最新评论