详解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;
 ?  }
相关推荐
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491114 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
zww89491117 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥8 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato9 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
xcl09259 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析
Kyrie_kk9 小时前
Java--IO--Path文件访问
java·后端
qinqinzqq9 小时前
Maven POM 格式、Schema 与 XSD:一篇讲透
java·maven