作家
登录

SpringBoot定时任务及Cron表达式详解

作者: 来源: 2017-08-17 12:20:28 阅读 我要评论

 
  • 2017-08-11 12:06:29.739  INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks                  : ===initialDelay: 第3次履行办法 
  • 2017-08-11 12:06:33.735  INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks                  : ===fixedRate: 第4次履行办法 
  • 2017-08-11 12:06:33.741  INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks                  : ===fixedDelay: 第4次履行办法 
  • 2017-08-11 12:06:34.738  INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks                  : ===initialDelay: 第4次履行办法  
  • 大年夜控制台输入的结不雅中我们可以看出所有的准时义务都是在同一个线程池用同一个线程来处理的,那么我们若何来并发的处理各准时义务呢,请持续向下看。

    4. 多线程处理准时义务

    "0 0 * * * *" 表示每小时0分0秒履行一次

    (8)zone:时区,默认为当前时区,一般没有效到。

    * <li>"0 0 * * * *" = the top of every hour of every day.</li>

    看到控制台输出的结不雅,所有的准时义务都是经由过程一个线程来处理的,我估计是在准时义务的设备中设定了一个SingleThreadScheduledExecutor,于是我看了源码,大年夜ScheduledAnnotationBeanPostProcessor类开端一路找下去。不雅然,在ScheduledTaskRegistrar(准时义务注册类)中的ScheduleTasks中又如许一段断定:

    1. if (this.taskScheduler == null) { 
    2.             this.localExecutor = Executors.newSingleThreadScheduledExecutor(); 
    3.             this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); 
    4.         }  

    这就解释如不雅taskScheduler为空,那么就给准时义务做了一个单线程的线程池,正好在这个类中还有一个设置taskScheduler的办法:

    * <li>"*/10 * * * * *" = every ten seconds.</li>

    1. public void setScheduler(Object scheduler) { 
    2.         Assert.notNull(scheduler, "Scheduler object must not be null"); 
    3.         if (scheduler instanceof TaskScheduler) { 
    4.             this.taskScheduler = (TaskScheduler) scheduler; 
    5.         } 
    6.         else if (scheduler instanceof ScheduledExecutorService) { 
    7.             this.taskScheduler = new ConcurrentTaskScheduler(((ScheduledExecutorService) scheduler)); 
    8.         } 
    9.         else { 
    10.             throw new IllegalArgumentException("Unsupported scheduler type: " + scheduler.getClass()); 
    11.         } 
    12.     }  

    如许问题就很简单了,我们只需用调用这个办法显式的设置一个ScheduledExecutorService就可以达到并发的效不雅了。我们要做的仅仅是实现SchedulingConfigurer接口,重写configureTasks办法就OK了;


      推荐阅读

      Linux内核态抢占机制分析

    【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索 本文起首介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的差别。接着分析L>>>详细阅读


    本文标题:SpringBoot定时任务及Cron表达式详解

    地址:http://www.17bianji.com/lsqh/36757.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)