Spring Boot多个定时任务阻塞问题的解决方法
作者:不才陈某 时间:2023-09-20 11:43:36
前言
为什么Spring Boot 定时任务是单线程的?
想要解释为什么,一定要从源码入手,直接从@EnableScheduling这个注解入手,找到了这个ScheduledTaskRegistrar类,其中有一段代码如下:
protected void scheduleTasks() {
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
}
如果taskScheduler为null,则创建单线程的线程池:Executors.newSingleThreadScheduledExecutor()。
多线程定时任务如何配置?
下面介绍三种方案配置多线程下的定时任务。
1、重写SchedulingConfigurer#configureTasks()
直接实现SchedulingConfigurer这个接口,设置taskScheduler,代码如下:
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//设定一个长度10的定时任务线程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
2、通过配置开启
Spring Boot quartz 已经提供了一个配置用来配置线程池的大小,如下;
spring.task.scheduling.pool.size=10
只需要在配置文件中添加如上的配置即可生效!
3、结合@Async
@Async这个注解都用过,用来开启异步任务的,使用@Async这个注解之前一定是要先配置线程池的,配置如下:
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.setCorePoolSize(4);
poolTaskExecutor.setMaxPoolSize(6);
// 设置线程活跃时间(秒)
poolTaskExecutor.setKeepAliveSeconds(120);
// 设置队列容量
poolTaskExecutor.setQueueCapacity(40);
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
return poolTaskExecutor;
}
然后在@Scheduled方法上标注@Async这个注解即可实现多线程定时任务,代码如下:
@Async
@Scheduled(cron = "0/2 * * * * ? ")
public void test2() {
System.out.println("..................执行test2.................");
}
来源:https://mp.weixin.qq.com/s/b_pIs6nKiINRDzowmxW2Ww
标签:springboot,定时,任务
0
投稿
猜你喜欢
浅谈c#.net中巧用ToString()将日期转成想要的格式
2022-02-02 18:14:07
C#针对xml文件转化Dictionary的方法
2021-09-12 12:33:48
详解java中的PropertyChangeSupport与PropertyChangeListener
2023-10-20 06:19:27
Android EditText每4位自动添加空格效果
2022-04-30 20:08:17
Android中简单的电话管理与短信管理App编写实例
2021-10-11 13:45:50
Android不规则封闭区域填充色彩的实例代码
2022-10-17 08:33:05
Android中查看USB连接的外接设备信息的代码实例
2022-08-07 08:08:41
java 读取系统Properties代码实例
2023-02-22 04:21:52
Java中关于Map四种取值方式
2022-04-22 09:24:09
Android studio实现简单计算器的编写
2022-08-21 05:58:55
Hadoop之Mapreduce序列化
2022-05-08 10:18:19
Java 泛型总结及详解
2023-10-29 07:17:16
在Java中判断两个Long对象是否相等
2022-09-01 11:22:10
android调用国家气象局天气预报接口json数据格式解释
2022-09-16 21:08:24
Spring Cloud Alibaba实现服务的无损下线功能(案例讲解)
2022-07-05 08:14:25
Java Zookeeper分布式分片算法超详细讲解流程
2023-07-08 06:56:36
一文详解Java中的Stream的汇总和分组操作
2021-12-24 17:32:54
Android二维码的生成与扫码-zxing示例代码
2022-10-17 11:33:49
C# 中使用正则表达式匹配字符的含义
2023-11-19 02:59:38
FeignClient中name和url属性的作用说明
2023-06-04 13:21:55