SpringBoot:自定义线程池配置类

news/2024/6/20 21:12:43/文章来源:https://blog.csdn.net/Mango_Bin/article/details/137159053

文章目录

  • 一、前言
  • 二、案例展示
    • 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.luyixian.cn/news_show_1034321.aspx

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

相关文章

RVM安装Ruby笔记(Mac)

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…

2024最新华为OD机试试题库全 -【二叉树的广度搜索】- C卷

1. 🌈题目详情 1.1 ⚠️题目 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。 1.2 🔣输入要求 每个输入文…

【服务端】node.js详细的配置

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【面试专题】设计模式

1.说一下开发中需要遵守的设计原则? 设计模式中主要有六大设计原则,简称为SOLID ,是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的),六大设计原则分别如下: 1、单一职责原则 单一职责原则的定义描述非…

C++ —— C++11新增语法

目录 一,列表初始化 1.1 这是什么? 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二,右值引用和左值引用 2.1 是什么? 2.2 这两个东西有啥关系? 2.3 有啥用? 三,*移动构…

二维码门楼牌管理应用平台建设:实现数据高效整理与入库

文章目录 前言一、数据整理入库的重要性二、数据整理入库的流程三、数据整理入库的技术支持四、数据整理入库的挑战与对策 前言 随着城市管理的数字化和智能化发展,二维码门楼牌管理应用平台成为了城市治理的新宠。本文将探讨如何通过数据整理入库这一关键环节&…

InternLM

任务一 运行1.8B模型,并对话 User >>> 请创作一个 300 字的小故事 在一片茂密的森林里,住着一只小松鼠,它的名字叫做小雪。小雪非常活泼好动,经常在树上跳跃玩耍。有一天,小雪发现了一个神秘的洞穴&#xf…

莫队算法学习笔记

Part.1 引入 当你遇到一个区间询问但是难以用线段树等 log 算法维护的时候怎么办?那就是——莫队! 莫队这个东西能支持区间修改、区间查询的操作,但是这种算法要求离线。莫队有很多种,详细请看下文。 Part.2 普通莫队 我们先来…

Spark源码(二)-Netty简介

一、Netty简介 Netty 是一个异步事件驱动的网络通信应用框架,用于快速开发可维护的高性能服务器和客户端。简单地说Netty封装了JDK的NIO,不用再写一大堆复杂的代码,从NIO各种繁复的细节中脱离出来,让开发者重点关心业务逻辑。 二…

Java 设计模式系列:备忘录模式

简介 备忘录模式是一种软件设计模式,用于在不破坏封闭的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定…

Micron FY24 Q2业绩强劲,凭内存实现翻盘

根据TechInsights数据显示,美光科技24财年第二季度业绩强劲,公司通过技术创新和产能优化,成功抓住了AI服务器和其他高性能应用带来的市场需求增长机遇。尽管短期内面临供应紧张的问题,但美光通过加大研发投入和产能转换力度&#…

计算机网络基础——网络安全/ 网络通信介质

chapter3 网络安全与管理 1. 网络安全威胁 网络安全:目的就是要让网络入侵者进不了网络系统,及时强行攻入网络,也拿不走信息,改不了数据,看不懂信息。 事发后能审查追踪到破坏者,让破坏者跑不掉。 网络…

基于java+SpringBoot+Vue的时间管理系统设计与实现

基于javaSpringBootVue的时间管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含: 时间管理系统是一个基于Internet的应用程序,旨在…

JavaBean是什么?

Bean的本意为豌豆、子实,在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外,所以.com版(https://developer.unity.cn/)不一定稳定,学习时推荐从.cn国内版(https://developer.unity.cn/)前往下载,但是后期仍需回…

React Native框架开发APP,安装免费的图标库(react-native-vector-icons)并使用详解

一、安装图标库 要使用免费的图标库,你可以使用 React Native Vector Icons 库。 首先,确保你已经安装了 react-native-vector-icons: npm install --save react-native-vector-iconsnpm install --save-dev types/react-native-vector-ic…

最新AI工具系统ChatGPT网站运营源码SparkAi系统V6.0版本,GPTs应用、AI绘画、AI换脸、垫图混图、Suno-v3-AI音乐生成大模型全支持

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…

bugku-web-cookies

进来以后看到一个巨长的字符串 源码同样 rfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdi…

景顺长城:《重塑与创造——2024 ai+洞察报告》

近期,景顺长城发布了《重塑与创造——2024 ai洞察报告》,报告深入探讨了人工智能(AI)产业的发展现状、未来趋势以及对各行业的潜在影响。报告认为,AI产业发展是多层次、多浪潮的,目前我们处于第二阶段但未来将持续伴随…

Windows 11 专业版 23H2 Docker Desktop 下载 安装 配置 使用

博文目录 文章目录 Docker Desktop准备系统要求 (WSL 2 backend)在 Windows 上打开 WSL 2 功能先决条件开启 WSL 2 WSL下载安装启动配置使用镜像 Image卷积 Volumes容器 Containers 命令RedisMySQLPostGreSQL Docker Desktop Overview of Docker Desktop Docker Desktop 疑难解…