关于tomcat繁忙线程数获取

2023-11-17

        在某些情况下,我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控。那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数?

        首先,我们应该想到tomcat本身是否为我们提供了类似的方法,博主在实际开发中拜读了一遍tomcat的源码,的确也找到了获取当前服务繁忙线程数的方法。但是它本身并未对外提供,并且使用的时候需要进行一些初始化操作。大家如果有兴趣的话可以下载tomcat源文件,找到org.apache.coyote.http11.AbstractHttp11Processor这个类,在process中有disableKeepAlive这个函数。进入函数查看具体实现



我们可以看到tomcat本事是从线程池中取得活跃数,那么我们也可以通过类似的办法取得tomcat线程池中的活跃数。博主使用的jsp,大家可以对应改为后台代码。

bean来解析线程池

public static class MBeans {

	private final MBeanServer mbeanServer;

	MBeans() {
		this(getPlatformMBeanServer());
	}

	private MBeans(MBeanServer mbeanServer) {
		super();
		this.mbeanServer = mbeanServer;
	}
	static MBeanServer getPlatformMBeanServer() {
		return ManagementFactory.getPlatformMBeanServer();
	}
	Set<ObjectName> getTomcatThreadPools() throws MalformedObjectNameException {
		return mbeanServer.queryNames(new ObjectName("*:type=ThreadPool,*"), null);
	}

	Set<ObjectName> getTomcatGlobalRequestProcessors() throws MalformedObjectNameException {
		return mbeanServer.queryNames(new ObjectName("*:type=GlobalRequestProcessor,*"), null);
	}

	Object getAttribute(ObjectName name, String attribute) throws JMException {
		return mbeanServer.getAttribute(name, attribute);
	}
}

然后用一个方法获取信息,这里可以添加函数获取到其他信息,例如最大连接数等。

public static class TomcatInformations implements Serializable {

	private static final boolean TOMCAT_USED = System.getProperty("catalina.home") != null;

	private static final long serialVersionUID = -6145865427461051370L;

	@SuppressWarnings("all")
	private static final List<ObjectName> THREAD_POOLS = new ArrayList<ObjectName>();
	@SuppressWarnings("all")
	private static final List<ObjectName> GLOBAL_REQUEST_PROCESSORS = new ArrayList<ObjectName>();

	private final String name;
	private final int maxThreads;
	private final int currentThreadCount;
	private static int currentThreadsBusy=0;
	private final long bytesReceived;
	private final long bytesSent;
	private final int requestCount;
	private final int errorCount;
	private final long processingTime;
	private final long maxTime;

	private TomcatInformations(MBeans mBeans, ObjectName threadPool) throws JMException {
		super();
		name = threadPool.getKeyProperty("name");
		maxThreads = (Integer) mBeans.getAttribute(threadPool, "maxThreads");
		currentThreadCount = (Integer) mBeans.getAttribute(threadPool, "currentThreadCount");
		currentThreadsBusy = (Integer) mBeans.getAttribute(threadPool, "currentThreadsBusy");
		ObjectName grp = null;
		for (final ObjectName globalRequestProcessor : GLOBAL_REQUEST_PROCESSORS) {
			if (name.equals(globalRequestProcessor.getKeyProperty("name"))) {
				grp = globalRequestProcessor;
				break;
			}
		}
		if (grp != null) {
			bytesReceived = (Long) mBeans.getAttribute(grp, "bytesReceived");
			bytesSent = (Long) mBeans.getAttribute(grp, "bytesSent");
			requestCount = (Integer) mBeans.getAttribute(grp, "requestCount");
			errorCount = (Integer) mBeans.getAttribute(grp, "errorCount");
			processingTime = (Long) mBeans.getAttribute(grp, "processingTime");
			maxTime = (Long) mBeans.getAttribute(grp, "maxTime");
		} else {
			bytesReceived = 0;
			bytesSent = 0;
			requestCount = 0;
			errorCount = 0;
			processingTime = 0;
			maxTime = 0;
		}
	}

	public static List<TomcatInformations> buildTomcatInformationsList() {
		if (!TOMCAT_USED) {
			return Collections.emptyList();
		}
		try {
			synchronized (THREAD_POOLS) {
				if (THREAD_POOLS.isEmpty() || GLOBAL_REQUEST_PROCESSORS.isEmpty()) {
					initMBeans();
				}
			}
			final MBeans mBeans = new MBeans();
			final List<TomcatInformations> tomcatInformationsList = new ArrayList<TomcatInformations>(
					THREAD_POOLS.size());
			for (final ObjectName threadPool : THREAD_POOLS) {
				tomcatInformationsList.add(new TomcatInformations(mBeans, threadPool));
			}
			return tomcatInformationsList;
		} catch (final InstanceNotFoundException e) {
			return Collections.emptyList();
		} catch (final AttributeNotFoundException e) {
			return Collections.emptyList();
		} catch (final JMException e) {
			throw new IllegalStateException(e);
		}
	}

	private static void initMBeans() throws MalformedObjectNameException {
		final MBeans mBeans = new MBeans();
		THREAD_POOLS.clear();
		GLOBAL_REQUEST_PROCESSORS.clear();
		THREAD_POOLS.addAll(mBeans.getTomcatThreadPools());
		GLOBAL_REQUEST_PROCESSORS.addAll(mBeans.getTomcatGlobalRequestProcessors());
	}

	public static long getCurrentThreadsBusy(){
		buildTomcatInformationsList();
		return currentThreadsBusy;
	}
}

博主经过测试可以得到当前tomcat的活跃(繁忙)线程数,希望可以帮到大家。当然,tomcat也提供了管理功能,在管理功能里面可以根据关键字获得对应的数值。这也是一种获取tomcat繁忙线程数的方式。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于tomcat繁忙线程数获取 的相关文章

  • 声纳违规:安全性 - 使用 byte[] 时直接存储数组

    我确实遇到过以下两篇关于类似问题的帖子声纳违规 https stackoverflow com questions 11580948 sonar violation security array is stored directly and
  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • Restlet 和 MULTIPART_FORM_DATA 或通过 Restlet 将文件放在 Google App Engine 上的其他方式

    我尝试通过 Restlet 接收文件 但只获得完整的 MULTIPART FORM DATA 如何提取我的特定文件 我找到了一些代码块 但它们的类型不可用 RESTlet 如何处理多部分 表单数据请求 https stackoverflow
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 如何检查字符串是否具有特定模式[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户输入任意字符串 程序会区分该字符
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • 如何在 Ivy 中使用不同的分类器下载多个 Maven 依赖项?

    我试图依靠Neo4j 服务器 jar http repo neo4j org content repositories snapshots org neo4j app neo4j server 1 5 SNAPSHOT neo4j serv
  • 如何使用 UUID 生成唯一的正 Long

    我需要为我的数据库主键列生成唯一的长 ID 我以为我可以用UUID randomUUID getMostSignificantBits 但有时它也会产生一些负多头 这对我来说是个问题 是否可以从 UUID 中仅生成正长 将会有数十亿个条目
  • kafka Avro 多个主题的消息反序列化器

    我正在尝试以 avro 格式反序列化 kafka 消息 我使用以下代码 https github com ivangfr springboot kafka debezium ksql blob master kafka research c
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s

随机推荐

  • 用C语言实现一个简单的静态栈

    栈是我们经常会用到的一种数据结构 下面我们就来看一下如何使用C语言来实现一个静态栈 并且使用它来解决一个经典的问题 括号匹配问题 首先我们来看一下栈的自定义类型 我们需要一个数组来存放栈中的元素 并且需要一个数字来表明目前栈顶所在的位置 所
  • mysql同时插入两个字段_mysql 怎么给一个表一次增加多个字段? ?

    DIEA mysql为一个表增加多个字段的语法为 ALTER TABLE 表名 ADD COLUMN 字段名1 数据类型 长度 DEFAULT NULL ADD COLUMN 字段名2 数据类型 长度 DEFAULT NULL 其中 def
  • 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p

    http www cnblogs com rushuizhijing archive 2011 08 26 2154737 html 深入理解const char p char const p char const p const char
  • flutter生命周期

    原文地址 https www jianshu com p 7e8dff26f81a Flutter跟安卓的Activity iOS的ViewController一样拥有自己的生命周期 Flutter中一切都是Widget 渲染方式有点像H5
  • Matlab 随机采样

    Matlab 随机采样 随机采样是统计学和数据分析中常用的一种方法 可以用来生成代表性的样本数据 在 Matlab 中 我们可以通过 rand 函数来实现随机采样 下面我们来介绍几种常见的随机采样方法及其实现 简单随机采样 简单随机采样是最
  • RocketMQ的架构及概念

    RocketMQ就是一个消息中间键用于实现异步传输与解耦 那什么是消息中间键呢 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流 并基于数据通信来进行分布式系统的集成 通过提供消息传递和消息排队模型 它可以在分布式环境下扩展进程间
  • 后端id设置long类型时,传到前端,超过19位最后两位为00

    前言 整理后端id的long类型的情况下 数据太大 前端拿到的数据出现自动转00问题 也就是 从后台传入的雪花id在前端被截断 问题情况 出现问题的原因 Java中Long的取值范围为 9223372036854775808到9223372
  • ctfshow web入门题解(一) web1-10

    ctfshow web入门题解 一 web1 10 被带佬丢进坑里了 备考的时候顺便做做题目 就当放松了 狗比套妈人拐进来自己跑掉 遇见他记得喊人贩子 信息搜集 ctfshow web入门题解 一 web1 10 web1 web2 web
  • eclipse2019 从头创建web项目到运行网页的过程总结

    简介 今天朋友在github上下载了一个老版本的eclipse项目 叫我帮忙配置运行环境且运行出网页页面 由于我一开始学习java就是用的IDEA 几乎对eclipse没有任何的接触 对怎么使用也是一点都不清楚 更别说别的了 经过一下午的不
  • OpenCV在Python上的调用( import cv2的解决办法)

    OpenCV是一个图像处理的经典库 而且关键是一直在升级 为了在Python中调用opencv 特别是看到好多代码都是import cv2 而这个在python中是无法直接进行pip install安装的 查了下 才知道需要从opencv库
  • PS接入人工智能!Photoshop (Beta) AI PS最新AI版支持创意AI文生图

    adobe 在 Photoshop最新的 Beta 版本中 新增AI创意填充功能让你只需要使用简单的文字提示就可以帮你完成对图像内容的添加 扩展 移除 在几秒钟内实现令您感到惊叹 喜悦和震撼的逼真效果 实际体验后我发现这一功能将改变传统作图
  • 关于安卓手机如何访问Tomcat服务器详解

    关于安卓手机访问Tomcat服务器 Tomcat的安装整备 运行Tomcat 手机接入局域网 关于查找IP 启动cmd exe 找到自己的ip 关闭防火墙 将文件放入Tomcat的webapps 手机端连接服务器 Tomcat的安装整备 下
  • Flutter与Android iOS 的双向通信

    本文章中的完整代码在这里 GitHub zhaolongs Flutter Android iOS Flutter 与 Android iOs 的双向通信 demo demo运行注意 1 Json数据解析异常 org json JSONEx
  • 443.压缩字符串

    443 压缩字符串 给你一个字符数组 chars 请使用下述算法压缩 从一个空字符串 s 开始 对于 chars 中的每组 连续重复字符 如果这一组长度为 1 则将字符追加到 s 中 否则 需要向 s 追加字符 后跟这一组的长度 压缩后得到
  • String内部一次性替换多个字符串

    问题 String进行字符串的替换的时候 可以使用 s replace 但是只能替换一个字符 所以说 当需要多个字符串进行替换是 会有些麻烦 解决 使用StrUtil removeAll 引入hutool包 使用 StrUtil remov
  • 电感相关知识总结

    一 定义及原理 电感就是将导线绕制成线圈形状 当电流流过时 在线圈 电感 两端就会形成较强的磁场 由于电磁感应的作用 会对电流的变化起阻碍作用 因此 电感对直流呈现很小的电阻 近似于短路 对交流呈现的阻抗较高 其阻值的大小与所通过交流信号的
  • 一、深度学习框架究竟是什么?

    1 引言 一直在说深度学习框架 最近也在使用tensorflow进行了简单的实验 但是对其中关系的理解还是不够到位 他们里面究竟是怎样的一个运行机制呢 2 说明 深度学习框架也就像Caffe tensorflow这些是深度学习的工具 简单来
  • k8s从入门到放弃-第九章安全认证

    文章目录 9 1访问控制概述 9 2认证管理 9 3授权管理 9 4准入控制 本章节主要介绍Kubernetes的安全认证机制 9 1访问控制概述 Kubernetes作为一个分布式集群的管理工具 保证集群的安全性是其一个重要的任务 所谓的
  • Java基础语法-标识符

    标识数据的符号称为标识符 变量名称就是标识符 标识符主要用于起名 String name zhangsan 标识符的命名规则 1 英文拉丁字母 String name zhangsan 2 符号 标识符只能采用下划线 和美元 符号其他符号不
  • 关于tomcat繁忙线程数获取

    在某些情况下 我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控 那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数 首先 我们应该想到tomcat本身是否为我们提供了类似的方法 博主在实际开发中拜