美文网首页我爱编程
Spring Boot - 定时任务

Spring Boot - 定时任务

作者: yuanzicheng | 来源:发表于2018-04-09 15:27 被阅读60次

    1.快速实现

    使用@EnableScheduling注解开启定时任务扫描,通常用在SpringBoot启动类上

    import org.springframework.boot.autoconfigure.SpringBootApplication
    import org.springframework.boot.runApplication
    import org.springframework.scheduling.annotation.EnableScheduling
    
    /**
     * kotlin的SpringBoot启动类
     */
    @EnableScheduling
    @SpringBootApplication
    class Application
    
    fun main(args: Array<String>) {
        runApplication<Application>(*args)
    }
    

    使用@Scheduled注解定义定时任务及频率(单线程)

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Task {
    
        private Logger logger = LoggerFactory.getLogger(Task.class);
    
        //定时任务每30秒执行一次
        @Scheduled(cron = "*/30 * * * * ?")
        public void task1() {
            logger.info("定时任务1...");
        }
    
        //定时任务每1分钟执行一次
        @Scheduled(cron = "0 */1 * * * ?")
        public void task2() {
            logger.info("定时任务2...");
        }
    }
    

    如果要使用多线程执行定时任务,仅需要实现SchedulingConfigurer接口,并使用@Configuration注解

    import org.jetbrains.annotations.NotNull;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    
    import java.util.concurrent.Executors;
    
    @Configuration
    public class TaskConfig implements SchedulingConfigurer {
        @Override
        public void configureTasks(@NotNull ScheduledTaskRegistrar taskRegistrar) {
            //定时任务使用线程数为10的线程池
            taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
        }
    }
    

    2.Cron表达式

    Cron表达式共有7个位置,其中最后一个位置为可选项

    * * * * * * *
    
    位置 说明 允许值 特殊值
    1 [秒] 0-59 , - * /
    2 [分] 0-59 , - * /
    3 [小时] 0-23 , - * /
    4 [日] 1-31 , - * / ? L W C
    5 [月] 1-12 或 JAN-DEC , - * /
    6 [周] 1-7 或 SUN-SAT , - * / ? L C #
    7(可选) [年] 1970-2099 , - * /

    3.Cron表达式中的特殊值

    • *
      表示匹配该位置的任意值,比如在秒*, 就表示每秒都会触发事件。
    • ?
      只能用在[日]和[周]两个位置。表示不指定值,当[日]、[周]其中之一被指定了值以后,为了避免冲突,需要将另一个的值设为“?”。
    • -
      表示范围,例如在[分]使用5-20,表示从5分到20分钟每分钟触发一次。
    • /
      表示起始时间开始触发,然后每隔固定时间触发一次,例如在分域使用5/20,则意味着5分,25分,45分,分别触发一次。
    • ,
      表示列出枚举值。例如:在[分]使用5,20,则意味着在5和20分时触发一次。
    • L
      表示最后,只能出现在[周]和[日],如果在[周]使用1L,意味着在最后的一个星期日触发。
    • W
      表示有效工作日(周一到周五),只能出现在[日],系统将在离指定日期的最近的有效工作日触发事件。注意一点,W的最近寻找不会跨过月份。
    • LW
      两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
    • #
      表示每个月第几个星期几,只能出现在[日]。例如1#3,表示某月的第三个星期日。

    4.Cron表达式示例

    0 0 * * * *            表示每小时0分0秒执行一次
    */10 * * * * *         表示每10秒执行一次
    0 0 8-10 * * *         表示每天8,9,10点执行
    0 0/30 8-10 * * *      表示每天8点到10点,每半小时执行
    0 0 9-17 * * MON-FRI   表示每周一至周五,9点到17点的0分0秒执行
    0 0 0 25 12 ?          表示每年圣诞节(12月25日)0时0分0秒执行
    

    相关文章

      网友评论

        本文标题:Spring Boot - 定时任务

        本文链接:https://www.haomeiwen.com/subject/hnkihftx.html