概述
要使用@ Scheduled注解,首先需要在启动类添加@ EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@ Scheduled注解,执行计划任务。
注解定义
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
参数说明
| 参数 | 参数说明 | 示例 |
|---|---|---|
| cron | 任务执行的cron表达式 | @ Scheduled(cron=”0/1 * * * * ?”) |
| zone | cron表达时解析使用的时区,默认为服务器的本地时区,使用java.util.TimeZone#getTimeZone(String)方法解析 | @ Scheduled(zone =” GMT-8:00”) |
| fixedDelay | 上一次任务执行结束到下一次执行开始的间隔时间,单位为ms | @ Scheduled(fixedDelay = 1000 * 60) |
| fixedDelayString | 上一次任务执行结束到下一次执行开始的间隔时间,使用java.time.Duration#parse解析 | @ Scheduled(fixedDelayString = “PT15M”) |
| fixedRate | 以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间,单位为ms, 若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务 | @ Scheduled(fixedRate = 2000) |
| fixedRateString | 与fixedRate逻辑一致,只是使用java.time.Duration#parse解析 | @ Scheduled( fixedRateString=”PT15M”) |
| initialDelay | 首次任务执行的延迟时间 | @ Scheduled(initialDelay = 1000) |
| initialDelayString | 首次任务执行的延迟时间,使用java.time.Duration#parse解析 | @ Scheduled(initialDelayString = “PT15M”) |
cron表达式语法
[秒] [分] [小时] [日] [月] [周] [年]
注:[年]不是必须的域,可以省略[年],则一共6个域
使用说明
定时任务执行默认是单线程模式,会创建一个本地线程池,线程池大小为1。当项目中有多个定时任务时,任务之间会相互等待,同步执行
源码
// org.springframework.scheduling.config.ScheduledTaskRegistrar#scheduleTasks
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
// java.util.concurrent.Executors#newSingleThreadScheduledExecutor()
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
- 注意:如果是多节点部署服务器,并且一个定时任务只需要执行一次的情况下,有两种方法实现
- 分布式锁
- 指定某一节点执行(此种情况会使多节点部署失去意义)



