spring @Scheduled定时任务注解使用方法及注意事项小结

 更新时间:2025年02月08日 11:17:23   作者:angen2018  
Spring的@Scheduled注解用于定时任务调度,默认单线程依次执行,可以通过配置多线程调度器或使用@Async注解实现并行执行,常见参数包括cron、fixedRate、fixedDelay、initialDelay等,本文介绍spring @Scheduled定时任务注解使用方法,感兴趣的朋友一起看看吧

@Scheduled 注解是 Spring 提供的一个注解式定时任务调度工具,用于简化定时任务的实现。它的默认行为是单线程执行,即任务默认在同一个线程中依次执行。如果任务抛出异常或执行时间过长,可能会影响后续任务的调度。

在 Spring 中,使用 @Scheduled 注解定义的多个定时任务默认是单线程依次执行的。这意味着,如果多个定时任务被触发在同一时间执行,它们会按照任务注册的顺序依次执行,而不是并行执行。

默认行为

  • 单线程执行:Spring 的 @Scheduled 注解默认使用单线程调度器(SimpleScheduledExecutor),因此多个任务会串行执行。
  • 任务阻塞:如果一个任务执行时间过长,会阻塞后续任务的执行。

如何实现并行执行

如果需要多个定时任务并行执行,可以通过以下方法实现:

方法 1:配置多线程调度器

可以通过配置 ThreadPoolTaskScheduler 来为 @Scheduled 任务提供一个线程池,从而允许多个任务并行执行。

示例代码

@Configuration
public class ScheduleConfig {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5); // 设置线程池大小
        scheduler.setThreadNamePrefix("my-scheduled-task-");
        return scheduler;
    }
}

@Scheduled 注解中指定使用自定义调度器:

@Scheduled(fixedRate = 5000, scheduler = "taskScheduler")
public void task1() {
    // 任务内容
}

方法 2:使用 @Async注解

可以通过结合 @Async 注解和 @EnableAsync 注解,使每个 @Scheduled 任务在独立的线程中异步执行。

示例代码

@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5); // 设置线程池大小
        return scheduler;
    }
}

在任务方法上添加 @Async 注解:

@Async
@Scheduled(fixedRate = 5000)
public void task1() {
    // 任务内容
}

方法 3:通过配置文件设置线程池大小

在 Spring Boot 中,可以通过配置文件直接设置 spring.task.scheduling.pool.size 属性来增加线程池大小。

示例配置

spring.task.scheduling.pool.size=5

总结

  • 默认行为@Scheduled 注解默认是单线程依次执行。
  • 并行执行:可以通过配置多线程调度器或使用 @Async 注解实现并行执行。
  • 推荐方式:配置多线程调度器(ThreadPoolTaskScheduler)是最常用的方式,适合大多数场景。

通过以上方法,可以轻松实现多个定时任务的并行执行!

以下是 @Scheduled 注解的参数大全及其详细说明:

1. cron

  • 含义:指定一个 cron 表达式,用于定义任务的执行时间。
  • 格式:cron 表达式由 6 或 7 个字段组成,分别表示秒、分、小时、日、月、星期(和年)。
  • 示例
    • 每隔 5 秒执行一次:0/5 * * * * *
    • 每天 23 点执行一次:0 0 23 * * *
    • 每月 1 号凌晨 1 点执行一次:0 0 1 1 * *

2. zone

  • 含义:指定时区,用于解析 cron 表达式。
  • 类型String,默认值为空字符串,表示使用服务器的默认时区。
  • 示例Asia/Shanghai

3. fixedRate

  • 含义:指定任务以固定的时间间隔执行,单位为毫秒。
  • 类型long,默认值为 -1,表示不使用固定速率。
  • 示例@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次

4fixedRateString

  • 含义:与 fixedRate 类似,但使用字符串类型,支持占位符。
  • 类型String,默认值为空字符串。
  • 示例@Scheduled(fixedRateString = "5000") 表示每隔 5 秒执行一次

5. fixedDelay

  • 含义:指定任务在上一次执行结束后,经过固定的时间间隔再执行下一次,单位为毫秒。
  • 类型long,默认值为 -1,表示不使用固定延迟。
  • 示例@Scheduled(fixedDelay = 5000) 表示上一次任务执行结束后,等待 5 秒再执行下一次

6. fixedDelayString

含义:与 fixedDelay 类似,但使用字符串类型,支持占位符。

类型String,默认值为空字符串。

示例@Scheduled(fixedDelayString = "5000") 表示上一次任务执行结束后,等待 5 秒再执行下一次

7. initialDelay

  • 含义:指定任务首次执行前的延迟时间,单位为毫秒。
  • 类型long,默认值为 -1,表示不使用初始延迟。
  • 示例@Scheduled(initialDelay = 5000, fixedRate = 10000) 表示首次延迟 5 秒后执行,之后每隔 10 秒执行一次

8. initialDelayString

  • 含义:与 initialDelay 类似,但使用字符串类型,支持占位符。
  • 类型String,默认值为空字符串。
  • 示例@Scheduled(initialDelayString = "5000", fixedRateString = "10000") 表示首次延迟 5 秒后执行,之后每隔 10 秒执行一次

9. CRON_DISABLED

  • 含义:一个特殊的 cron 表达式值,用于禁用定时任务。
  • "-",当 cron 表达式设置为 "-" 时,任务将被禁用

总结

  • cron:适合复杂的定时任务调度,如按特定时间点执行。
  • fixedRatefixedDelay:适合简单的定时任务调度,如每隔固定时间执行。
  • initialDelay:用于控制任务的首次执行时间。
  • zone:用于指定时区,确保任务按正确的时区执行。

通过合理使用这些参数,可以灵活地配置定时任务的执行计划,满足各种业务需求。

到此这篇关于spring @Scheduled定时任务注解使用方法以及注意事项的文章就介绍到这了,更多相关spring @Scheduled定时任务注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java读写ini文件、FileOutputStream问题

    java读写ini文件、FileOutputStream问题

    这篇文章主要介绍了java读写ini文件、FileOutputStream问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Mybatis的@select和@SelectProvider注解方式动态SQL语句解读

    Mybatis的@select和@SelectProvider注解方式动态SQL语句解读

    这篇文章主要介绍了Mybatis的@select和@SelectProvider注解方式动态SQL语句,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Maven版本冲突的三种解决方法

    Maven版本冲突的三种解决方法

    在Maven项目中,依赖传递可能导致Jar包版本冲突,常见的解决策略包括依赖排除、版本锁定和使用maven-shade-plugin插件,本文就来介绍一下这三种解决方法,感兴趣的可以了解一下
    2024-10-10
  • SpringBoot文件上传功能的实现方法

    SpringBoot文件上传功能的实现方法

    这篇文章主要介绍了SpringBoot文件上传功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java实战之仿天猫商城系统的实现

    Java实战之仿天猫商城系统的实现

    这篇文章主要介绍了如何利用Java制作一个基于SSM框架的迷你天猫商城系统,文中采用的技术有JSP、Springboot、SpringMVC、Spring等,需要的可以参考一下
    2022-03-03
  • SpringBoot 将配置文件挂到 jar 包外面的操作方法

    SpringBoot 将配置文件挂到 jar 包外面的操作方法

    在 SpringBoot 中,可以将配置文件放在 jar 包外面,这样可以方便地修改配置而不需要重新打包和部署,这篇文章主要介绍了SpringBoot 如何将配置文件挂到 jar 包外面,需要的朋友可以参考下
    2023-03-03
  • JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

    JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

    这篇文章主要介绍了JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码,需要的朋友可以参考下
    2014-02-02
  • 为什么不建议使用Java自定义Object作为HashMap的key

    为什么不建议使用Java自定义Object作为HashMap的key

    这篇文章主要介绍了为什么不建议使用Java自定义Object作为HashMap的key,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java中List集合去重方法以及效率对比

    Java中List集合去重方法以及效率对比

    这篇文章主要给大家介绍了关于Java中List集合去重方法以及效率对比的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解SpringBoot开发使用@ImportResource注解影响拦截器

    详解SpringBoot开发使用@ImportResource注解影响拦截器

    这篇文章主要介绍了详解SpringBoot开发使用@ImportResource注解影响拦截器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论