SpringBoot:自定义线程池配置类

文章目录

  • 一、前言
  • 二、案例展示
    • 1、初始版本
    • 2、代码审核意见和优化建议
    • 3、潜在问题和风险
    • 4、优化建议
    • 5、优化后的代码
  • 三、具体使用

在这里插入图片描述

一、前言

  • 有时候我们在项目中做一些长链路的跑批任务时,基于Springboot项目的定时任务,我们可以指定一个自定义的线程配置类进行单独提供给具体跑批任务使用,而不占用整个系统资源。

二、案例展示

  • 我们观察一下第一种方式和优化后的对比在哪里,关键点什么?

1、初始版本

@Configuration
@EnableAsync
public class ScheduledConfig {/*** 创建并配置一个线程池,用于快速执行任务。* * @return Executor 返回一个配置好的线程池实例,可以用于快速执行任务。*/@Bean("baseExecutor")public Executor fastExecutor() {// 创建 ThreadPoolTaskExecutor 实例ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 设置线程名前缀executor.setThreadNamePrefix("xxxx-schedule-baseExecutor");// 设置最大线程池大小executor.setMaxPoolSize(10);// 设置核心线程池大小executor.setCorePoolSize(8);// 设置队列容量executor.setQueueCapacity(5);// 设置拒绝执行处理器,采用CallerRunsPolicy策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}

2、代码审核意见和优化建议

3、潜在问题和风险

  • 异常处理: 线程池的默认异常处理机制可能不足以处理所有任务抛出的异常。尽管设置了CallerRunsPolicy作为拒绝执行处理器,它仅在线程池饱和时工作,并不直接处理任务执行中的异常。建议增强异常处理逻辑,例如通过自定义的RejectedExecutionHandler实现或者在任务代码中加入更细粒度的异常处理。
  • 资源泄露: 当应用停止时,如果线程池没有被正确关闭,可能会导致资源泄露。虽然Spring通常会管理Bean的生命周期,但最好确认ThreadPoolTaskExecutor的实例是否加入了适当的销毁逻辑,例如调用executor.shutdown()。
  • 线程数配置: CorePoolSize被设置为8,MaxPoolSize被设置为10,这意味着在高负载情况下,线程池只能扩展到10个线程。这样的配置可能不足以处理所有高峰时段的请求。你需要根据实际的负载测试结果调整这些参数。
  • 队列容量: 队列容量被固定为5。这意味着一旦队列满了,即使线程池还没有达到最大大小,任务也会被拒绝执行。根据实际的负载情况,考虑适当增加队列容量或调整线程池的大小。

4、优化建议

  • 性能监控: 考虑添加监控机制来跟踪线程池的性能指标,如活跃线程数、队列大小和拒绝执行的任务数等。这有助于及时发现和调整配置参数,以保证系统的稳定性。
  • 可调整性: 考虑将线程池的配置参数(如corePoolSize, maxPoolSize, queueCapacity等)设置为可从外部配置(例如应用配置文件)的方式获取。这样可以在不修改代码的情况下调整这些参数,以适应不同的运行环境。
  • 定制化: 如果有更复杂的需求,比如需要执行周期性任务或需要更细粒度的控制任务执行,可以考虑使用Spring提供的其他任务调度组件,如 ScheduledThreadPoolExecutor 或者集成 Quartz 等第三方库。

5、优化后的代码

@Configuration
@EnableAsync
public class ExecutorConfig {// 名字可以根据项目业务随意起@Bean("baseExecutor")public Executor fastExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 线程名前缀保持不变executor.setThreadNamePrefix("xxxx-schedule-base");// 调整核心线程池大小、最大线程池大小和队列容量,以适应可能的更高负载executor.setCorePoolSize(16); // 增加核心线程数executor.setMaxPoolSize(20); // 增加最大线程数executor.setQueueCapacity(100); // 增加队列容量// 使用自定义的RejectedExecutionHandler来处理任务被拒绝的情况executor.setRejectedExecutionHandler(new CustomRejectedExecutionHandler());// 确保在应用停止时线程池能被正确关闭Runtime.getRuntime().addShutdownHook(new Thread(() -> {executor.shutdown();}));return executor;}// 自定义的拒绝执行处理器,以更好地处理任务被拒绝的情况static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 这里可以加入更详细的日志记录或发送警报等逻辑System.out.println("Task " + r.toString() + " rejected from executor " + executor.toString());}}
}

三、具体使用

@Async("baseExecutor")
@Scheduled(cron = "0 0/5 * * * ?"){
// 具体业务
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的全栈开发前端与后端的完美融合【第160篇—全栈开发】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的全栈开发:前端与后端的完美融合 全栈开发已成为当今软件开发领域中的…

华为OD机试 - 查找舆情热词(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/1]

​ 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 专栏介绍 YOLOv9作为最新的YOLO系列模型,对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

HackTheBox-Machines--Topology

文章目录 1 端口扫描2 漏洞探测三 权限提升 Topology 测试过程 1 端口扫描 nmap -sC -sV 10.129.23.122 漏洞探测 端口扫描发现22和80端口,访问80端口,发现LaTeX方程生成器,访问该按钮发现子域: latex.topology.htb。 将域名添加…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集,还不熟悉,继续熟悉; 现在有一个文件型的数据源,名为swtest1;它前面小图标上有UDX三个字母,表明这是一个UDX类型的数据源;在此数据源上右击&#x…

SSH端口转发

SSH介绍 SSH通过网络远程访问主机提供保护,可以对客户端和服务端之间的数据传输进行压缩和加密,有身份验证、SCP、SFTP、和端口转发的功能 SSH转发常用的参数介绍: -C请求压缩所有数据-D动态转发、即socks代理-f后台执行SSH指令-g允许远程…

hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境 unbentu,docker https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz 二、解析 PHP Filter 当中有一种 convert.iconv 的 Filter ,可以用来将数据从字符集 A 转换为字符集 B ,其中这两个字符集可以…

蓝桥杯算法题-图形排版

题目描述 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。   假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照图片顺序,在宽度 M 以内&…

企业客户信息反馈平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

《数据结构学习笔记---第九篇》---循环队列的实现

文章目录 1.循环队列的定义 2.循环队列的判空判满 3.创建队列并初始化 4.入队和出队 5. 返回队尾队首元素 6.释放循环队列 1.循环队列的定义 定义:存储队列元素的表从逻辑上被视为一个环。 我们此次实现的循环队列,采用顺序表 typedef struct {int…

Xception模型详解

简介 Xception的名称源自于"Extreme Inception",它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构,用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…

图像生成:SD lora加载代码详解与实现

文章目录 前言一、SD模型介绍二、模型加载1. 模型架构加载2. safetensors权重加载3. lora权重加载 三、Name匹配四、权重融合1、构建net类2、匹配lora weight和model weight3、基于lora权重创建lora模块4、权重融合 五、整体pipeline总结 前言 SD中lora的加载相信都不陌生&…

VSCode美化

今天有空收拾了一下VSCode,页面如下,个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多,有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网:Maple-Font 我只安装了下图两个字体,使…

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&am…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址,我们通过nginx可以很便捷的将其改为外网访问,但是在外网访问这个地址后&#xff0c…

windows 使用 wsl 安装 linux 子系统

windows 使用 wsl 安装 linux 子系统 介绍使用如何启动设置基本配置安装和配置 SSH 服务 介绍 WSL(Windows Subsystem for Linux)是微软为Windows 10和Windows 11操作系统提供的一个功能,它允许用户在Windows上直接运行GNU/Linux环境。WSL提…

剑指offer--数组中重复的数字

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…

【力扣一刷】代码随想录day28(93.复原IP地址、78.子集、90.子集II )

目录 【93.复原IP地址】中等题(偏难,坑很多) 【78.子集】中等题(偏简单) 【90.子集II】中等题 【93.复原IP地址】中等题(偏难,坑很多) 思路:以101023为例子 1、将题目…

输出100~200之间的素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现素数判断函数&#xff1b; int Prime(int number) {//初始化变量值&#xff1b;int divided 2;int JudgementCondition 0;//循环判断素数&#xff1b;wh…

(C)1007 素数对猜想

1007 素数对猜想 问题描述 输入样例&#xff1a; 20 输出样例&#xff1a; 4 解决方案&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> int main(){int n,d;int a[100000];int flag,jishu0;scanf("%d",&n);memset(a,-1,…