当前位置: 首页 > 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;}}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 云手机在海外社交媒体运营中的作用
  • 【视觉SLAM】 十四讲ch7习题
  • 使用Docker Compose进行容器编排的最佳实践
  • 产业园物业满意度调研指标设计
  • c++中的标准库
  • C++标准模板(STL)- 类型支持 (类型属性,检查类型是否拥有强结构相等性,std::has_strong_structural_equality)
  • 清除 Nuxt 状态缓存:clearNuxtState
  • SQL进阶
  • AI学习记录 - 如何进行token理论知识,以GPT2为举例
  • 【鸿蒙学习】鸿蒙开发学习路径:迈向鸿蒙高级认证之路
  • python-热杆上的蚂蚁(赛氪OJ)
  • C/C++数字与字符串互相转换
  • 240808opencv中反向投影
  • 【学习笔记】Day 7
  • PHP MySQL 读取数据
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Apache的基本使用
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ECS应用管理最佳实践
  • JS学习笔记——闭包
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • nodejs调试方法
  • overflow: hidden IE7无效
  • python docx文档转html页面
  • spring boot 整合mybatis 无法输出sql的问题
  • 安装python包到指定虚拟环境
  • 从零搭建Koa2 Server
  • 缓存与缓冲
  • 判断客户端类型,Android,iOS,PC
  • 前端面试总结(at, md)
  • 悄悄地说一个bug
  • 如何编写一个可升级的智能合约
  • 微信开源mars源码分析1—上层samples分析
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 再谈express与koa的对比
  • Java数据解析之JSON
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​iOS实时查看App运行日志
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ( 10 )MySQL中的外键
  • (03)光刻——半导体电路的绘制
  • (12)Linux 常见的三种进程状态
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (翻译)terry crowley: 写给程序员
  • (四) 虚拟摄像头vivi体验
  • (转)memcache、redis缓存
  • .Family_物联网
  • .NET程序员迈向卓越的必由之路
  • .net网站发布-允许更新此预编译站点
  • @EventListener注解使用说明
  • @NestedConfigurationProperty 注解用法