一、注解介绍
@Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行。
二、源码
package org.springframework.scheduling.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;
import org.springframework.aot.hint.annotation.Reflective;
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
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;
String scheduler() default "";
}
三、Spring接入说明
@Scheduled需要配合@EnableScheduling使用。使用时,将@Scheduled注解放在待定时的方法名上方,将 @EnableScheduling放在项目主启动类类名上方。
@Scheduled主要有三种配置执行时间的方式:cron、fixedRate和fixedDelay。
四、主要参数说明
参数 | 说明 |
---|---|
cron | 任务执行的cron表达式 |
zone | cron表达时解析使用的时区,默认为服务器的本地时区。使用java.util.TimeZone#getTimeZone(String)方法解析 GMT-8:00 |
fixedRate | 固定速率。上一次任务执行开始到下一次执行开始的间隔时间固定,单位为ms。若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后,马上执行下一次任务 |
fixedRateString | 与fixedRate一致,只是间隔时间使用java.time.Duration#parse解析 |
fixedDelay | 固定延迟。上一次任务执行结束到下一次执行开始的间隔时间固定,单位为ms。 |
fixedDelayString | 与fixedDelay一致,只是间隔时间使用java.time.Duration#parse解析 |
initialDelay | 首次延迟多长时间后执行,单位ms。之后按照fixedRate、fixedRateString、fixedDelay、fixedDelayString指定的规则执行,需要指定其中一个规则。注意:不能和cron一起使用 |
initialDelayString | 与initialDelay 一致,只是间隔时间使用java.time.Duration#parse解析 |
timeUnit | 时间单位。默认为毫秒。 |
五、Cron表达式
参考 Cron表达式详解
cron表达式*和?的区别
-
星号(* ):
在cron表达式中,星号(*)表示该字段的每一个可能值。
例如,在分钟字段中使用*
表示“每分钟”。
在其他字段中,*
也表示接受所有可能的值。、 -
问号(?):
问号(?)只在日期和星期字段中使用。
当在日期和星期字段中同时出现*
时,?
用于屏蔽其中一个字段,以确保任务只在满足另一个字段条件的时间触发。
?
通常表示“无意义的值”,相当于一个占位符。
例如,如果日期和星期字段都设置为1
,那么任务将在每月的第一天触发。但是,如果这两个字段同时设置为1
,而实际上每个月的第一天可能不总是星期一,这时可以使用?
来屏蔽其中一个字段,确保任务只在满足特定条件的时间触发。例如,1 * * * * ?
表示每天的整点触发任务,而1 ? * * * *
表示每月第一天的整点触发任务。12