一、简介
项目中使用了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.com/s/1CZAjTFqIhinzlVLnrrMUKQ(注:该图出自博主路灯下的女孩)
3.3 Elastic-job
3.3.1 简介
- 当当出品,github地址: https://github.com/elasticjob/elastic-job-lite
- 个人系列文章 Elastic-job系列(一)——– 搭建Esjob控制台
3.4 XXL-job
3.4.1 简介
- 大众点评出品,文档丰富齐全,github地址: https://github.com/xuxueli/xxl-job
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17740.html