定时任务注解@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协议进行许可。转载请署名作者且注明文章出处。

    posted @   Java技术债务  阅读(1371)  评论(0编辑  收藏  举报
    点击右上角即可分享
    微信分享提示
    💬
    评论
    📌
    收藏
    💗
    关注
    👍
    推荐
    🚀
    回顶
    收起
    1. 1 404 not found REOL
    404 not found - REOL
    00:00 / 00:00
    An audio error has occurred.