SpringBoot之@Scheduled注解用法解读

 更新时间:2025年03月24日 16:42:35   作者:王小工  
这篇文章主要介绍了SpringBoot之@Scheduled注解用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

SpringBoot之@Scheduled注解用法

@Scheduled 是 Spring Framework 中用于实现定时任务的核心注解,能够方便地配置方法在特定时间或周期执行。

以下是详细解析:

1. 启用定时任务‌

在 Spring Boot 中,需在配置类添加 @EnableScheduling 注解以启用定时任务支持:

@Configuration
@EnableScheduling
public class AppConfig {
}

‌2. 基本用法‌

直接在方法上添加 @Scheduled 注解,并配置执行规则:

@Component
public class ScheduledTasks {

    // 固定延迟(任务结束后的间隔)
    @Scheduled(fixedDelay = 5000)
    public void taskWithFixedDelay() {
        // 每隔5秒执行一次(任务完成后开始计时)
    }

    // 固定速率(任务开始的间隔)
    @Scheduled(fixedRate = 3000)
    public void taskWithFixedRate() {
        // 每隔3秒执行一次(任务开始后开始计时)
    }

    // 初始延迟(首次执行前的等待时间)
    @Scheduled(initialDelay = 10000, fixedRate = 5000)
    public void taskWithInitialDelay() {
        // 首次延迟10秒,之后每隔5秒执行一次
    }

    // Cron表达式(复杂时间规则)
    @Scheduled(cron = "0 0 12 * * ?")
    public void taskWithCronExpression() {
        // 每天中午12点执行
    }
}

‌3. 参数详解‌

‌(1) fixedDelay‌

  • 作用‌:任务结束后的固定延迟时间(单位:毫秒)。
  • 示例‌:@Scheduled(fixedDelay = 5000) 表示任务结束后等待5秒再执行下一次。
  • 适用场景‌:需确保前一次任务完成后再执行下一次。

‌(2) fixedRate‌

  • 作用‌:任务开始的固定时间间隔(单位:毫秒)。
  • ‌示例‌:@Scheduled(fixedRate = 3000) 表示每隔3秒执行一次(无论前一次任务是否完成)。
  • 注意‌:若任务执行时间超过间隔时间,可能导致任务重叠(需结合线程池配置)。

‌(3) initialDelay‌

  • 作用‌:首次任务执行前的初始延迟时间(单位:毫秒)。
  • ‌示例‌:@Scheduled(initialDelay = 10000, fixedRate = 5000) 表示首次延迟10秒后执行,之后每隔5秒执行一次。

‌(4) cron‌

  • ‌作用‌:通过 Cron 表达式定义复杂调度规则。
  • Cron 表达式格式‌:秒 分 时 日 月 周 年(可选)
  • ‌常用示例‌:
    • 0 0 10 * * ?:每天上午10点执行。
    • 0 0/5 14 * * ?:每天下午2点开始,每隔5分钟执行一次。
    • 0 15 10 ? * MON-FRI:每周一至周五上午10:15执行。
  • ‌在线工具‌:推荐使用 Cron表达式生成器。

‌4. 线程池配置‌

默认情况下,定时任务使用单线程执行。若任务耗时较长,需配置线程池避免阻塞:

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10); // 自定义线程数
    }
}

‌5. 注意事项‌

1‌. 避免长时间阻塞‌:若任务执行时间超过调度间隔,需合理设计逻辑或配置线程池。

2‌. 分布式环境问题‌:在集群中,定时任务可能被多个实例重复执行。解决方案:

  • 使用分布式锁(如 Redis 或 ZooKeeper)。
  • 通过数据库唯一标识控制任务执行。

‌3. 动态调整‌:默认 @Scheduled 参数不支持动态修改。如需动态调度,可结合 ScheduledTaskRegistrar 或使用 Quartz 框架。

‌6. 常见问题‌

‌Q1:Cron 表达式中的 ? 和 * 有什么区别?‌

  • * 表示任意值(如:* 在“日”字段表示每天)。
  • ? 用于“日”和“周”字段的互斥条件(避免冲突)。

‌Q2:如何避免任务重复执行?‌

  • 单机环境:确保任务幂等性。
  • 分布式环境:使用分布式锁或数据库唯一约束。

‌Q3:如何调试定时任务?‌

  • 开启 Spring 的调试日志:logging.level.org.springframework.scheduling=DEBUG

‌总结‌

@Scheduled 是 Spring 中实现定时任务的便捷工具,通过灵活配置 fixedDelay、fixedRate 或 cron 表达式,可以满足大多数调度需求。

在复杂场景(如动态任务或分布式环境)中,可结合 Quartz 或其他分布式调度框架实现更高级功能。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的Semaphore原理解析

    Java中的Semaphore原理解析

    这篇文章主要介绍了Java中的Semaphore原理解析,Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源,需要的朋友可以参考下
    2024-01-01
  • java将excel转为pdf的方法步骤

    java将excel转为pdf的方法步骤

    之前工作需要,查了挺多种Excel转PDF的方法,下面这篇文章主要给大家介绍了关于java将excel转为pdf的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java实现泡泡堂对战版游戏的示例代码

    Java实现泡泡堂对战版游戏的示例代码

    本文将利用Java制作经典游戏《泡泡堂》,文中使用了MVC模式,分离了模型、视图和控制器,使得项目结构清晰易于扩展,感兴趣的可以了解一下
    2022-04-04
  • 关于java开发的性能问题总结(必看)

    关于java开发的性能问题总结(必看)

    下面小编就为大家带来一篇关于java开发的性能问题总结(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 基于Spring-cloud-gateway实现全局日志记录的方法

    基于Spring-cloud-gateway实现全局日志记录的方法

    最近项目在线上运行出现了一些难以复现的bug需要定位相应api的日志,通过nginx提供的api请求日志难以实现,于是在gateway通过全局过滤器记录api请求日志,本文给大家介绍基于Spring-cloud-gateway实现全局日志记录,感兴趣的朋友一起看看吧
    2023-11-11
  • JNDI具体用法详解

    JNDI具体用法详解

    JNDI是java命名和目录接口,本文主要介绍了JNDI具体用法详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • struts2框架的登录制作图文教程

    struts2框架的登录制作图文教程

    下面小编就为大家带来一篇struts2框架的登录制作图文教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • springboot数据库操作图文教程

    springboot数据库操作图文教程

    本文以图文并茂的形式给大家介绍了springboot数据库操作,感兴趣的朋友一起看看吧
    2017-07-07
  • 使用Java实现简单的区块链程序的方法

    使用Java实现简单的区块链程序的方法

    这篇文章主要介绍了使用Java实现简单的区块链程序的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • java 中设计模式(装饰设计模式)的实例详解

    java 中设计模式(装饰设计模式)的实例详解

    这篇文章主要介绍了java 中设计模式(装饰设计模式)的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论