定時任務注解@Scheduled


概述

要使用@ 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));
}

注意:如果是多節點部署服務器,並且一個定時任務只需要執行一次的情況下,有兩種方法實現

  1. 分布式鎖
  2. 指定某一節點執行(此種情況會使多節點部署失去意義)

如果想了解分布式鎖,請關注我,下期會說分布式鎖。

本文作者:好名字
原文鏈接:定時任務注解@Scheduled
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 3.0 CN協議進行許可。轉載請署名作者且注明文章出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM