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.hqwc.cn/news/579122.html

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

相关文章

基于SpringBoot民族婚纱预定系统

采用技术 基于SpringBoot民族婚纱预定系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能 摄影师列表 公告信息管理 公告类型管理 项目背景…

Redis慢日志

SLOWLOG 是用来读取和重置 Redis 慢查询日志的命令,Redis 2.2.12 版本开始支持 1.Redis 慢查询日志概述 客户端从发送命令到获取返回结果经过了以下几个步骤: 1. 客户端发送命令 2. 该命令进入 Redis 队列排队等待执行 3. Redis 开始执行命令 - Red…

ToolPlatform:烧录时TFTP报错

截图 文字 ARP Retry count exceeded; starting again 网络下载TFTP超时,可能的原因如下: 1.首先检查服务器IP是否正确,若不正确点击重新加载,加载最新的PC端IP地址; 2.检查子网掩码与网关是否配置正确; 3.检查板端IP…

探索Python中的强化学习:Q-learning

强化学习是一种机器学习方法,用于训练智能体(agent)在与环境的交互中学习如何做出最优决策。Q-learning是强化学习中的一种基于价值函数的方法,用于学习最优策略。本文将详细介绍Q-learning的原理、实现方式以及如何在Python中应用…

K8S安装和部署(kubeadmin安装1主2从)

这里用kubeadmin方式进行安装部署 1. 准备三台服务器 服务器地址 节点名称 192.168.190.200 master 主 192.168.190.201 node1 从 192.168.190.202 node2 从 2. 主机初始化(所有主机) 2.1根据规划设置主机名 #切换到192.168.190.200 hostnamectl…

QA:绑定ROS机器人控制板PCB设备ID

前言 一般情况下,主控板(树莓派、Jetson等)会同时和多个串口进行通信,这时,我们希望,用一个固定名称代表特定串口,比如用serial_motor_drive绑定电机驱动控制板,使ROS2的配置、编程和运行更加方便。 下面是…

会声会影剪刀为什么灰色 会声会影分割素材的方法 会声会影视频制作教程 会声会影2023旗舰版下载 会声会影快捷键

会声会影是一款操作简单,功能齐全,适合新手使用的视频剪辑软件。在使用会声会影剪辑的过程中,我们一般需要使用【剪刀工具】,但有时会声会影剪刀是灰色无法使用的状态,这个时候该怎么办呢?本文将为大家介绍…

个人优势能力测评,寻找你的天赋

个人优势能力测评,用来发现自己的天赋,也被称之为多元智力测评,该理论认为人的智力不仅仅是逻辑思维能力,每个人的天赋不同,具有多样性,目前的智力测试基本上都以逻辑思维,推理能力为主&#xf…

几种确定Windows电脑有多旧的方法,总有 一种适合你

前言 如果你正在考虑升级你的计算机,或者想知道你的计算机是否仍在保修期内,你需要知道你的电脑有多旧。谢天谢地,有几种方法可以做到这一点,但没有一种方法过于复杂。 如何判断你的计算机有多旧 除非另有说明,否则…

vitess执行计划缓存 测试

打开执行计划器缓存: sysbench /usr/local/share/sysbench/oltp_write_only.lua --mysql-host127.0.0.1 --mysql-port15306 --mysql-userroot --mysql-password --mysql-dbcustomer --report-interval10 100s sysbench /usr/local/share/sysbench/oltp_read_only.l…

Modelsim手动仿真实例

目录 1. 软件链接 2. 为什么要使用Modelsim 3. Modelsim仿真工程由几部分组成? 4. 上手实例 4.1. 新建文件夹 4.2. 指定目录 4.3. 新建工程 4.4. 新建设计文件(Design Files) 4.5. 新建测试平台文件(Testbench Files&…