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

使用 MBean 和 日志查看 Tomcat 线程池核心属性数据

文章目录

  • CustomTomcatThreadPoolMBean
  • CustomTomcatThreadPool


CustomTomcatThreadPoolMBean

com.qww.config;public interface CustomTomcatThreadPoolMBean {String getStatus();
}

CustomTomcatThreadPool

package com.qww.config;import com.alibaba.fastjson.JSON;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.context.WebServerApplicationContext;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Service
public class CustomTomcatThreadPool implements CustomTomcatThreadPoolMBean {private final static Logger logger = LoggerFactory.getLogger(CustomTomcatThreadPool.class);@AutowiredWebServerApplicationContext webServerApplicationContext;@Overridepublic String getStatus() {return buildStatus();}private String buildStatus() {logger.info("==>>: webServerApplicationContext:{} ", webServerApplicationContext);ThreadPoolExecutor executor = (ThreadPoolExecutor) ((TomcatWebServer) webServerApplicationContext.getWebServer()).getTomcat().getConnector().getProtocolHandler().getExecutor();logger.info("==>>: 这行日志如果没有输出,就是上一行代码报错了。虽然报错,但由于当前线程[RMP TCP Connection(x)-ip]的特殊性,并不会在控制台打印堆栈");Map<String, String> returnMap = new LinkedHashMap<>();returnMap.put("核心线程数(corePoolSize)", String.valueOf(executor.getCorePoolSize()));returnMap.put("最大线程数(maximumPoolSize)", String.valueOf(executor.getMaximumPoolSize()));returnMap.put("活跃线程数(activeCount)", String.valueOf(executor.getActiveCount()));returnMap.put("池中当前线程数(poolSize)", String.valueOf(executor.getPoolSize()));returnMap.put("历史最大线程数(largestPoolSize)", String.valueOf(executor.getLargestPoolSize()));returnMap.put("工作队列任务数量(workQueue.size)", String.valueOf(executor.getQueue().size()));returnMap.put("线程允许空闲时间/s(keepAliveTime)", String.valueOf(executor.getKeepAliveTime(TimeUnit.SECONDS)));returnMap.put("核心线程数是否允许被回收(allowCoreThreadTimeOut)", String.valueOf(executor.allowsCoreThreadTimeOut()));returnMap.put("提交任务总数(submittedCount)", String.valueOf(executor.getSubmittedCount()));returnMap.put("历史执行任务的总数(近似值)(taskCount)", String.valueOf(executor.getTaskCount()));returnMap.put("历史完成任务的总数(近似值)(completedTaskCount)", String.valueOf(executor.getCompletedTaskCount()));returnMap.put("拒绝策略(ejectedExecutionHandler.class)", executor.getRejectedExecutionHandler().getClass().getCanonicalName());String res = JSON.toJSONString(returnMap);logger.info("==>>: {}", res);return res;}@PostConstructpublic void post() {MBeanServer server = ManagementFactory.getPlatformMBeanServer();ObjectName objectName = null;try {objectName = new ObjectName("qww:type=CustomTomcatThreadPool");} catch (MalformedObjectNameException e) {e.printStackTrace();}try {// 这里的key 必须使用Spring 中注册的对象,也就是当前对象server.registerMBean(this, objectName);} catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {e.printStackTrace();}}}
http://www.lryc.cn/news/130821.html

相关文章:

  • Visual Studio 2019源码编译cpu版本onnxruntime
  • Go和Java实现模板模式
  • angular:quill align的坑
  • 设计模式篇---抽象工厂(包含优化)
  • Azure创建可用性集
  • SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)
  • Elasticsearch集群shard过多后导致的性能问题分析
  • Unity框架学习--5 事件中心管理器
  • (二)结构型模式:3、过滤器模式(Filter、Criteria Pattern)(C++示例)
  • 谷歌在Chrome浏览器中推进抗量子加密技术
  • Kotlin的数组
  • centos 安装docker
  • Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容
  • File 类的用法, InputStream和Reader, OutputStream和Writer 的用法
  • AtCoder Beginner Contest 315 Task:A/B/C/E
  • 【项目实践】基于LSTM的一维数据扩展与预测
  • webshell实践,在nginx上实现负载均衡
  • LVS+Keepalived集群
  • Java的网络编程
  • kafka配置远程连接
  • css实现渐变色border
  • 管理 IBM Spectrum LSF
  • 117页数字化转型与产业互联网发展趋势及机会分析报告PPT
  • 【JavaWeb】实训的长篇笔记(上)
  • 如何使用Docker安装AWVS?
  • vue命名规范
  • 第05天 SpringBoot自动配置原理
  • AlphaZero能否从围棋和国际象棋飞跃到量子计算?
  • 进程切换
  • ES踩坑记录之UNASSIGNED分片无法恢复