详解tomcat中的jmx监控

目录

1.概述

2.如何开启tomcat的JMX

3.tomcat如何实现JMX的源码分析


1.概述

本文是博主JAVA监控技术系列文章的第二篇,前面一篇文章中我们介绍了JAVA监控技术的基石------jmx:

【JMX】JAVA监控的基石-CSDN博客

本文我们将从使用和源码实现两个方面聊一下jmx的落地实现范例------tomcat中的jmx。

tomcat作为一个web server,其选用jmx来实现监控功能。之所以选择jmx是因为jmx是java se原生的能力,不需要第三方依赖,在web server这种基础组件中,选用原生的技术可以避免很多三方依赖带来的不便。

2.如何开启tomcat的JMX

jmx是由JVM来支持实现的标准,所以开启jmx本质上就是通过配置启动参数的方式来实现的,例如,以下是一个简单的 Java 命令,启用了 JMX 监听,并配置了 JMX 服务器的地址和端口:

java -Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=9999

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-jar myapplication.jar

tomcat本质也是个Java程序,所以也是通过配置启动参数来开启jmx的。本文是基于Windows环境来配置的,Linux环境其实也大差不差。配置Catalina.bat,在Execute The Requested Command下面加上下面的配置:

set JAVA_OPTS=%JAVA_OPTS% -Djava.rmi.server.hostname=192.168.56.1 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

然后启动tomcat,打开jconsole:

连接上我们启动的这个tomcat,MBean列表里面可以看到tomcat的所有MBean,对tomcat源码熟悉的读者会发现,tomcat的核心组件都以MBean的方式被注册进JMX Server中了。

3.tomcat如何实现JMX的源码分析

首先博主去github上下载了tomcat7.0.105版本的源码。前面我们聊过jmx,要使用jmx,就要先注册相关的MBean。tomcat里面有一个jmxEnabled接口,这个接口就是用来实现MBean的注册的。它定义了两个方法,一个用来注册MBean,一个用来卸载MBean。

这个接口的实现类是LifecycleMBeanBase,这个类里实现了注册和卸载MBean的方法。对tomcat源码有了解的读者对这个类会很熟悉(当然不了解也别怕),LifecycleMBeanBase这个类是tomcat中用来管理各个组件的生命周期的,也就是说这个组件里会实现一些在各个组件初始化或者销毁的时候要做的额外动作。

来我们好好读一下这里的源码:

复制代码
protected void initInternal() throws LifecycleException {
 ? ? ?  // If oname is not null then registration has already happened via
 ? ? ?  // preRegister().
 ? ? ?  if (oname == null) {
 ? ? ? ? ?  获取MBeanServer
 ? ? ? ? ?  mserver = Registry.getRegistry(null, null).getMBeanServer();
            //注册MBean
 ? ? ? ? ?  oname = register(this, getObjectNameKeyProperties());
 ? ? ?  }
 ?  }
//注册MBean的方法 ? 
protected final ObjectName register(Object obj,
 ? ? ? ? ?  String objectNameKeyProperties) {
?
 ? ? ?  // Construct an object name with the right domain
 ? ? ?  StringBuilder name = new StringBuilder(getDomain());
 ? ? ?  name.append(':');
 ? ? ?  name.append(objectNameKeyProperties);
?
 ? ? ?  ObjectName on = null;
?
 ? ? ?  try {
 ? ? ? ? ?  on = new ObjectName(name.toString());
 ? ? ? ? ?  //将自己注册到MBeanServer中
 ? ? ? ? ?  Registry.getRegistry(null, null).registerComponent(obj, on, null);
 ? ? ?  } catch (MalformedObjectNameException e) {
 ? ? ? ? ?  log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
 ? ? ? ? ? ? ? ? ?  e);
 ? ? ?  } catch (Exception e) {
 ? ? ? ? ?  log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
 ? ? ? ? ? ? ? ? ?  e);
 ? ? ?  }
?
 ? ? ?  return on;
 ?  }
相关推荐
Rain的Java大神之路7 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
counting money7 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
xiaohaiAIgeo8 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计8 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质8 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军8 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐8 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫8 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
kisbad9 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
憧憬成为java架构高手的小白9 小时前
langchain4j框架学习
java