SpringBoot 线程池配置
java1234
共 3045字,需浏览 7分钟
· 2020-11-16
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | 明天,你好啊
来源 | urlify.cn/EjE7be
springboot 集成异步线程池
目的:通过实现AsyncConfigurer自定义线程池,包含异常处理。 实现AsyncConfigurer接口对异常线程池更加细粒度的控制
/**
* @Description: 线程池配置
* @Author: mingtian
* @CreateDate: 2020/11/12 15:57
* @Version: 1.0
*/
@Configuration
@EnableAsync
public class ThreadPoolConfig implements AsyncConfigurer {
/**
* 打印日志
*/
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* cpu 核心数量
*/
public static final int cpuNum = Runtime.getRuntime().availableProcessors();
/**
* 线程池配置
*
* @return
*/
@Bean("taskExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 配置核心线程池数量
taskExecutor.setCorePoolSize(cpuNum);
// 配置最大线程池数量
taskExecutor.setMaxPoolSize(cpuNum * 2);
/// 线程池所使用的缓冲队列
taskExecutor.setQueueCapacity(2);
// 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
taskExecutor.setAwaitTerminationSeconds(60);
// 空闲线程存活时间
taskExecutor.setKeepAliveSeconds(60);
// 等待任务在关机时完成--表明等待所有线程执行完
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
// 线程池名称前缀
taskExecutor.setThreadNamePrefix("thread-pool-");
// 线程池拒绝策略
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
// 线程池初始化
taskExecutor.initialize();
logger.info("线程池初始化......");
return taskExecutor;
}
/**
* 重写捕获异常类
*
* @return
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncExceptionHandler();
}
/**
* 自定义异常处理类
*/
class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
//手动处理捕获的异常
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
logger.error("ExceptionMessage:{}", throwable.getMessage());
logger.error("MethodName:{}", method.getName());
for (Object param : obj) {
logger.error("Parameter:{}", param);
}
}
}
}
模拟发送消息业务层
/**
* @Description: 模拟异步发送消息方法
* @Author: mingtian
* @CreateDate: 2020/11/12 16:29
* @Version: 1.0
*/
@Component
public class SendMessageService {
/**
* 打印日志
*/
private Logger logger = LoggerFactory.getLogger(getClass());
@Async
public void sendMessage() {
logger.info("发送消息");
System.out.println("子线程名称:" + Thread.currentThread().getName());
}
}
测试类
/**
* @Description: 测试类
* @Author: mingtian
* @CreateDate: 2020/11/12 16:30
* @Version: 1.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test {
@Autowired
private SendMessageService messageService;
@org.junit.Test
public void testAsync() {
System.out.println("主线程名称:" + Thread.currentThread().getName());
for (int i = 0; i < 100; i++) {
messageService.sendMessage();
}
}
}
控制台打印结果:
主线程名称:main
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-6] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-5] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-6] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-7] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-5] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-8] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-4] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-1] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-3] c.example.threadpool.SendMessageService : 异步发送发送消息
2020-11-12 16:47:48.985 INFO 16728 --- [ thread-pool-2] c.example.threadpool.SendMessageService : 异步发送发送消息
由以上的结果得出配置的线程池是有效的。
粉丝福利:实战springboot+CAS单点登录系统视频教程免费领取
???
?长按上方微信二维码 2 秒 即可获取资料
感谢点赞支持下哈
评论
英伟达Blackwell平台网络配置分析
本文来自“英伟达Blachwell平台网络配置详解”。GTC大会英伟达展示了全新的 Blackwell 平台系列产品,包括 HGX B100 服务器、NVLINK Switch、GB200Superchip Computer Node、Quantum X800 交换机和 CX8 网卡(InfiniB
架构师技术联盟
0
从原理到实践:掌握DPDK内存池技术
前言:本文整理下之前的学习笔记,基于DPDK17.11版本源码分析。主要分析一下内存管理部分代码。一、概述内存管理是数据面开发套件(DPDK)的一个核心部分,以此为基础,DPDK的其他部分和用户应用得以发挥其最佳性能。本系列文章将详细介绍DPDK提供的各种内存管理的功能。但在此之前,有必要先谈一谈为
开源Linux
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
springboot第70集:字节跳动后端三面经,一文让你走出微服务迷雾架构周刊
创建一个使用Kubernetes (K8s) 和 Jenkins 来自动化 GitLab 前端项目打包的CI/CD流水线,需要配置多个组件。下面,我将概述一个基本的设置步骤和示例脚本,以帮助你理解如何使用这些工具整合一个自动化流程。前提条件确保你已经有:Kubernetes 集群:用于部署 Jenk
程序源代码
0
三年前端还不会配置Nginx,被老板打了,今天一口气学完
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群引言先来看看为何需要做请求负载。 早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务
程序员成长指北
4
LangChain:安装与环境配置
使用以下命令安装 LangChain:pip install langchain或者:conda install langchain -c conda-forge环境设定使用LangChain通常需要与一个或多个模型提供程序、数据存储、 A
Python之王
0
性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:azdebug.blog.csdn.net/article/details/103697108前言具体实现细节测试结果总结前言开发目的: 提高百万级数据
Java架构师社区
0
Linux 配置和管理网络接口的基本命令
更多Python学习内容:ipengtao.com在Linux系统中,网络接口的配置和管理是系统管理员日常工作的一部分。了解如何有效地使用命令行工具进行网络接口配置是至关重要的。本文将详细介绍一些基本的Linux网络接口管理命令,提供详实的示例代码,帮助管理员更全面地了解和掌握这些工具。ifconf
良许Linux
0