spring 定时任务 @Scheduled

@Scheduled 源码如下:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";
    String cron() default "";
    String zone() default "";
    long fixedDelay() default -1L;
    String fixedDelayString() default "";
    long fixedRate() default -1L;
    String fixedRateString() default "";
    long initialDelay() default -1L;
    String initialDelayString() default "";
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}

使用@Scheduled 首先需要开启定时任务 需要在config类上添加@EnableScheduling注解
例如:

@Configuration
@EnableScheduling
public class AppConfig {
}

@Scheduled 可以在方法及注解类上使用
例如

// 上一次开始执行时间点之后 6 秒再执行。
@Scheduled(fixedRate = 6000)
public void doSomething() {
    // something that should run periodically
}
// 上一次执行完毕时间点之后 6 秒再执行。
@Scheduled(fixedDelay = 6000)
public void doSomething() {
    // something that should run periodically
}
@Scheduled 默认的时间单位为毫秒 可以通过timeUnit属性修改

// 上一次执行完毕时间点之后 1分钟再执行。
@Scheduled(fixedDelay = 1,timeUnit = TimeUnit.SECONDS)
public void doSomething() {
    // something that should run periodically
}
initialDelay表示首次延迟多长时间后执行,单位ms,之后按照cron/fixedRate/fixedRateString/fixedDelay/fixedDelayString指定的规则执行,需要指定其中一个规则.
@Scheduled(initialDelay=1000,fixedRate=1000) //首次运行延迟1s

cron是@Scheduled的一个参数,是一个字符串,以5个空格隔开,只允许6个域(注意不是7个,7个直接会报错),分别表示秒,分,时,日,月,周.


image.png

image.png

@Scheduled(cron = "0 * * * 1 SAT") //每年的1月的所有周六的所有0秒时间执行
@Scheduled(cron = "0 0 0 1 Jan ?") //每年的1月的1日的0时0分0秒执行

还可以使用zone属性指定在哪个时区解析cron表达式。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容