@ScheduledSpring 框架提供的注解,用于声明一个方法按照一定的计划执行,即所谓的定时任务。这个注解可以被用于任何 Spring 管理的 Bean 上的方法,使得这个方法成为一个定时任务。下面是 @Scheduled 注解的一些详细说明和使用方式:

基本使用

        要使用 @Scheduled 注解,首先需要在 Spring 配置中开启定时任务的支持,通常在 Spring Boot 应用的主类上添加 @EnableScheduling 注解:

@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

注解参数

        @Scheduled 注解支持几个参数,用于定义任务的执行计划:

  1. cron:使用 cron 表达式来定义执行计划。
  2. fixedRate:任务每次执行完毕后,等待指定的时间再执行下一次。
  3. fixedDelay:任务每次执行完毕后,等待指定的时间再执行下一次,但与 fixedRate 不同的是,fixedDelay 会等待上一次任务执行完毕后再开始计时。
  4. initialDelay:任务开始执行前的初始延迟时间。
  5. zone:指定时区。

使用 Cron 表达式

        Cron 表达式是一个字符串,格式如 second minute hour day month day-of-week year。例如,0 0/30 * * * ? 表示每半小时执行一次。

@Scheduled(cron = "0 0/30 * * * ?")
public void executeTaskWithCron() {
    // 任务代码
}

使用 fixedRate

        fixedRate参数指定了两次任务执行之间的固定时间间隔(以毫秒为单位)。

@Scheduled(fixedRate = 5000)
public void executeTaskWithFixedRate() {
    // 任务代码
}

使用 fixedDelay

        fixedDelay参数指定了任务执行完毕后,等待指定的时间再执行下一次任务。

@Scheduled(fixedDelay = 5000)
public void executeTaskWithFixedDelay() {
    // 任务代码
}

使用 initialDelay

        initialDelay参数指定了任务开始执行前的初始延迟时间(以毫秒为单位)。

@Scheduled(initialDelay = 1000, fixedRate = 5000)
public void executeTaskWithInitialDelay() {
    // 任务代码
}

配置时区

        zone 参数允许你指定一个时区,这样定时任务会根据指定的时区来执行。

@Scheduled(cron = "0 0/30 * * * ?", zone = "GMT+8")
public void executeTaskWithZone() {
    // 任务代码
}

错误处理

        默认情况下,如果一个定时任务抛出异常,Spring 会尝试重新执行它。你可以通过设置 @Scheduled 注解的 shouldRetryOnFailure 属性为 false 来改变这个行为,使得任务在失败后不再重试。

@Scheduled(cron = "0 0/30 * * * ?", shouldRetryOnFailure = false)
public void executeTaskNoRetry() {
    // 任务代码
}

注意事项

  • 使用 @Scheduled 注解的方法必须是 public 的。
  • 如果你的方法需要参数,那么它必须接受一个 java.util.Date 参数,这将被 Spring 自动填充为任务执行时的日期。
  • 定时任务默认是非并发的,即同一时间只有一个任务在执行。如果你需要并发执行,可以使用 @Async 注解,但这需要额外的配置。
  • 定时任务的执行计划是基于应用服务器的系统时钟。如果系统时钟被修改,可能会影响任务的执行计划。

        

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部