详解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;
 ?  }
相关推荐
乡野码圣16 分钟前
【RK3588 Android12】RCU机制
java·jvm·数据库
JAVA+C语言20 分钟前
如何优化 Java 多主机通信的性能?
java·开发语言·php
编程彩机1 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
小酒窝.2 小时前
【多线程】多线程打印1~100
java·多线程
君爱学习2 小时前
基于SpringBoot的选课调查系统
java
APIshop2 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
血小板要健康2 小时前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
淼淼7632 小时前
安装jdk1.8
java·开发语言
毕设源码-朱学姐3 小时前
【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案
java
过期动态3 小时前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea