当前位置: 首页 > news >正文

Spring boot tomcat使用自定义线程池监控线程数量告警

Spring boot tocmat 使用自定义线程池

线程池 接近最大线程数量 警戒值告警

修改tomcat线程池中线程名字

配置文件上代码

server:port: 9898servlet:context-path: /testtomcat:connection-timeout: 5000max-connections: 5accept-count: 5
tomcat_thread_max_number_warn: 350
tomcat_thread_max_number: 500
tomcat_waiter_number: 500

自定义线程池TomcatMonitorConfig

package com.company.config;import lombok.extern.slf4j.Slf4j;
import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.ProtocolHandler;
import org.apache.tomcat.util.security.PrivilegedSetTccl;
import org.apache.tomcat.util.threads.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;@Slf4j
@Configuration
public class TomcatMonitorConfig {@Value("${tomcat_thread_max_number_warn}")private int maxThreadNumberWarn;@Value("${tomcat_thread_max_number}")private int maxThreadNumber;@Value("${tomcat_waiter_number}")private int waiterNumber;@Beanpublic WebServerFactoryCustomizer myWebServerFactoryCustomizer() {TaskThreadFactory tf = new TaskThreadFactory("tomcat-http" + "-exec-", true, 1);return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {@Overridepublic void customize(TomcatServletWebServerFactory factory) {Executor executor = (Executor)new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),maxThreadNumber,60,TimeUnit.SECONDS,new LinkedBlockingQueue<>(waiterNumber),tf);factory.addConnectorCustomizers((connector) -> {ProtocolHandler handler = connector.getProtocolHandler();TaskQueue taskqueue = new TaskQueue();if (handler instanceof AbstractProtocol) {AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;protocol.setExecutor(executor);}});}};}class TaskThreadFactory implements ThreadFactory {private final ThreadGroup group;private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;private final boolean daemon;private final int threadPriority;public TaskThreadFactory(String namePrefix, boolean daemon, int priority) {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();this.namePrefix = namePrefix;this.daemon = daemon;this.threadPriority = priority;}@Overridepublic Thread newThread(Runnable r) {int number = threadNumber.getAndIncrement();if(number>=maxThreadNumberWarn) {log.warn("Thread number is greater than "+maxThreadNumberWarn);}TaskThread t = new TaskThread(group, r, namePrefix + number);t.setDaemon(daemon);t.setPriority(threadPriority);// Set the context class loader of newly created threads to be the class// loader that loaded this factory. This avoids retaining references to// web application class loaders and similar.if (Constants.IS_SECURITY_ENABLED) {PrivilegedAction<Void> pa = new PrivilegedSetTccl(t, getClass().getClassLoader());AccessController.doPrivileged(pa);} else {t.setContextClassLoader(getClass().getClassLoader());}return t;}}}

http://www.lryc.cn/news/418568.html

相关文章:

  • K8S子节点加入主节点访问MaterAPI报错:Unauthorized 401
  • C++ Poco服务端框架中JSON的使用
  • leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝
  • 赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!
  • Nacos-配置中心
  • ava中的文件操作、IO流、递归和字符集
  • 生成式人工智能安全评估体系构建
  • NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测+交叉验证
  • synchronized实现原理及优化
  • NLP 之词的表示与语言模型
  • 每天一个数据分析题(四百七十一)- 假设检验
  • 《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-04-数据访问层设计
  • 【视觉SLAM】 十四讲ch7习题
  • K-近邻算法(二)
  • WPF学习(2)-UniformGrid控件(均分布局)+StackPanel控件(栈式布局)
  • ANTSDR E310
  • MySQL 5.7 DDL 与 GH-OST 对比分析
  • 【Python】爬取网易新闻今日热点列表数据并导出
  • 软件设计之HTML5
  • CnosDB 元数据集群 – 分布式时序数据库的大脑
  • 白骑士的Matlab教学进阶篇 2.5 Simulink
  • linux安装anaconda
  • python装饰器作用和使用场景
  • Apache Tomcat 7下载、安装、环境变量配置 详细教程
  • SQL注入实例(sqli-labs/less-20)
  • Linux Shell面试题大全及参考答案(3万字长文)
  • 速盾:cdn优化静态资源加载速度机制
  • 04.C++类和对象(中)
  • 【代码随想录训练营第42期 Day23打卡 回溯Part2 - LeetCode 39. 组合总和 40.组合总和II 131.分割回文串
  • 书生.浦江大模型实战训练营——(三)Git基本操作与分支管理