概述
要使用@ Scheduled注解,首先需要在啟動類添加@ EnableScheduling,啟用Spring的計划任務執行功能,這樣可以在容器中的任何Spring管理的bean上檢測@ Scheduled注解,執行計划任務。
注解定義
/**
* An annotation that marks a method to be scheduled. Exactly one of
* the {@link #cron()}, {@link #fixedDelay()}, or {@link #fixedRate()}
* attributes must be specified.
*
* <p>The annotated method must expect no arguments. It will typically have
* a {@code void} return type; if not, the returned value will be ignored
* when called through the scheduler.
*
* <p>Processing of {@code @Scheduled} annotations is performed by
* registering a {@link ScheduledAnnotationBeanPostProcessor}. This can be
* done manually or, more conveniently, through the {@code <task:annotation-driven/>}
* element or @{@link EnableScheduling} annotation.
*
* <p>This annotation may be used as a <em>meta-annotation</em> to create custom
* <em>composed annotations</em> with attribute overrides.
*
* @author Mark Fisher
* @author Dave Syer
* @author Chris Beams
* @since 3.0
* @see EnableScheduling
* @see ScheduledAnnotationBeanPostProcessor
* @see Schedules
*/
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
/**
* A cron-like expression, extending the usual UN*X definition to include
* triggers on the second as well as minute, hour, day of month, month
* and day of week. e.g. {@code "0 * * * * MON-FRI"} means once per minute on
* weekdays (at the top of the minute - the 0th second).
* @return an expression that can be parsed to a cron schedule
* @see org.springframework.scheduling.support.CronSequenceGenerator
*/
String cron() default "";
/**
* A time zone for which the cron expression will be resolved. By default, this
* attribute is the empty String (i.e. the server's local time zone will be used).
* @return a zone id accepted by {@link java.util.TimeZone#getTimeZone(String)},
* or an empty String to indicate the server's default time zone
* @since 4.0
* @see org.springframework.scheduling.support.CronTrigger#CronTrigger(String, java.util.TimeZone)
* @see java.util.TimeZone
*/
String zone() default "";
/**
* Execute the annotated method with a fixed period in milliseconds between the
* end of the last invocation and the start of the next.
* @return the delay in milliseconds
*/
long fixedDelay() default -1;
/**
* Execute the annotated method with a fixed period in milliseconds between the
* end of the last invocation and the start of the next.
* @return the delay in milliseconds as a String value, e.g. a placeholder
* @since 3.2.2
*/
String fixedDelayString() default "";
/**
* Execute the annotated method with a fixed period in milliseconds between
* invocations.
* @return the period in milliseconds
*/
long fixedRate() default -1;
/**
* Execute the annotated method with a fixed period in milliseconds between
* invocations.
* @return the period in milliseconds as a String value, e.g. a placeholder
* @since 3.2.2
*/
String fixedRateString() default "";
/**
* Number of milliseconds to delay before the first execution of a
* {@link #fixedRate()} or {@link #fixedDelay()} task.
* @return the initial delay in milliseconds
* @since 3.2
*/
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));
}
注意:如果是多節點部署服務器,並且一個定時任務只需要執行一次的情況下,有兩種方法實現
- 分布式鎖
- 指定某一節點執行(此種情況會使多節點部署失去意義)
如果想了解分布式鎖,請關注我,下期會說分布式鎖。
本文作者:好名字
原文鏈接:定時任務注解@Scheduled
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 3.0 CN協議進行許可。轉載請署名作者且注明文章出處。