@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个直接会报错),分别表示秒,分,时,日,月,周.
@Scheduled(cron = "0 * * * 1 SAT") //每年的1月的所有周六的所有0秒时间执行
@Scheduled(cron = "0 0 0 1 Jan ?") //每年的1月的1日的0时0分0秒执行
还可以使用zone属性指定在哪个时区解析cron表达式。