Spring Boot @Scheduled 注解速查:核心语法与实用示例

本文适合收藏备查。定时任务的配置不再令人头疼。

核心语法

注解 说明
@Scheduled 用于标记需要定时执行的方法
cron 使用 Cron 表达式定义任务执行时间,格式为 cron="秒 分 时 日 月 周"
fixedRate 每隔固定时间(单位:毫秒)执行一次任务,格式为 fixedRate=1000
fixedDelay 在上一次任务完成后,延迟固定时间(单位:毫秒)再执行下一次任务,格式为 fixedDelay=1000
initialDelay 在应用启动后,延迟一定时间(单位:毫秒)后开始执行任务,格式为 initialDelay=5000

配置启用

在 Spring Boot 应用中启用定时任务,需要在主类或配置类上添加 @EnableScheduling 注解:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

基本示例

每 5 秒执行一次
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)
    public void runEvery5Seconds() {
        System.out.println("每 5 秒执行一次任务");
    }
}
每 5 秒执行一次,上一次任务完成后延迟 1 秒
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(fixedDelay = 5000, initialDelay = 1000)
    public void runWithDelay() {
        System.out.println("上一次任务完成后延迟 1 秒,每 5 秒执行一次任务");
    }
}

Cron 表达式示例

每分钟执行一次
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 * * * * ?")
    public void runEveryMinute() {
        System.out.println("每分钟执行一次任务");
    }
}
每天午夜 12 点执行
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 0 0 * * ?")
    public void runAtMidnight() {
        System.out.println("每天午夜 12 点执行一次任务");
    }
}
每周一早上 8 点执行
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 0 8 ? * MON")
    public void runOnMondayMorning() {
        System.out.println("每周一早上 8 点执行一次任务");
    }
}
每小时执行一次,从 15 分钟开始
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 15 * * * ?")
    public void runEveryHourStartingAt15() {
        System.out.println("每小时执行一次,从 15 分钟开始");
    }
}

高级用法

动态 Cron 表达式

可以通过 @Value 注解从配置文件中读取 Cron 表达式:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;

@Component
public class ScheduledTasks {

    @Value("${cron.expression}")
    private String cronExpression;

    @Scheduled(cron = "${cron.expression}")
    public void dynamicCron() {
        System.out.println("使用动态 Cron 表达式执行任务");
    }
}
多线程执行

通过配置 TaskScheduler 可以实现多线程执行定时任务:

spring:
  task:
    scheduling:
      pool:
        size: 10
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)
    public void runInParallel() {
        System.out.println("多线程执行任务");
    }
}

常见问题

  • 如何停止定时任务? 使用 @Scheduled 注解无法直接停止定时任务,可以通过 ScheduledTaskTaskScheduler 实现任务的动态管理。

  • 如何处理任务执行中的异常? 可以在方法中捕获异常,或使用 @SchedulederrorHandler 属性指定异常处理器。

  • 如何调试定时任务? 使用日志记录任务的执行情况,或在开发环境中设置断点进行调试。

实用工具推荐

Cron 表达式生成器 - 快速生成符合需求的 Cron 表达式,支持中文描述转换。

Hey Cron 还提供以下实用工具:

  • 正则表达式生成器 - 快速生成符合需求的正则表达式。
  • 中英互译 - 实时翻译中英文,支持多语言互译。
  • JSON 格式化 - 格式化 JSON 字符串,便于阅读和调试。
  • Base64 编码解码 - 快速编码和解码 Base64 字符串。
  • 时间戳转换 - 转换时间戳与日期时间。
  • JWT 解析 - 解析 JWT 令牌,查看其内容。

这些工具都能在实际开发中大大提升效率,建议收藏备用。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐