admin管理员组

文章数量:1567813

一、简介

             项目中使用了springboot的@schedule注解来执行定时任务。不过该注解不做特殊设置时是存在隐患的。该注解内部默认的是采用的一个线程的线程池来串行执行任务的。

              这样就会出现隐患,一是  定义了俩个任务,A任务凌晨3点执行, B任务凌晨4点执行, 此时如果A任务执行时间为一个半小时,则B任务会一直阻塞到点半才会开始执行,而非定义的4点执行,这就造成了B任务没有定时执行的假象。还有一个隐患是 如果A任务执行过程中假死,则B任务和其它任务则会一直阻塞不执行,这就玩大发了。 

二、解决方法

             可以通过自定义定时执行任务的线程个数将串行改为并行即可,springboot可以通过添加如下配置类来解决:

@Configuration
@EnableAsync
public class AsyncConfig {

   /*
   此处成员变量应该使用@Value从配置中读取
   */
   private int corePoolSize = 10;
   private int maxPoolSize = 200;
   private int queueCapacity = 10;

   @Bean
   public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(queueCapacity);
    executor.initialize();
    return executor;
   }

}

三、分布式任务调度框架(TODO)

3.1 引入原因

         如果少量服务器还好说,但是当大规模集群的时候,仅仅使用@schedule注解就不行了,这样无法看到任务是否执行完成,成功或失败,任务数量,任务分布,链路追踪等等等等。这时就需要引入分布式任务调度框架了。

3.2 分布式框架对比

3.2.1 对比图

  •  对比图  https://pan.baidu/s/1CZAjTFqIhinzlVLnrrMUKQ(注:该图出自博主路灯下的女孩)

3.3 Elastic-job

3.3.1 简介

  • 当当出品,github地址: https://github/elasticjob/elastic-job-lite
  • 个人系列文章  Elastic-job系列(一)-------- 搭建Esjob控制台

3.4 XXL-job

3.4.1 简介

  • 大众点评出品,文档丰富齐全,github地址: https://github/xuxueli/xxl-job

 

 

本文标签: SpringBootschedule