什么是JMX

JMX,全称Java Management Extensions,用于我们管理和监控java应用程序。JMX有以下用途:

  1. 监控应用程序的运行状态和相关统计信息。
  2. 修改应用程序的配置(无需重启)。
  3. 状态变化或出错时通知处理。

举个例子,我们可以通过jconsole监控应用程序的堆内存使用量、线程数、类数,查看某些配置信息,甚至可以动态地修改配置。另外,有时还可以利用JMX来进行测试。

本文将介绍以下内容:

  1. 什么是JMX
  2. JMX的基础架构;
  3. 如何使用JMX

JMX的基础架构

首先,看下这种图:

这里简单介绍下这三层结构:

层次 描述
Instrumentation 主要包括了一系列的接口定义和描述如何开发MBean的规范。在JMXMBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为
Agent 用来管理相应的资源,并且为远端用户提供访问的接口。该层的核心是MBeanServer,所有的MBean都要向它注册,才能被管理。注册在MBeanServer上的MBean并不直接和远程应用程序进行通信,他们通过协议适配器(Adapter)和连接器(Connector)进行通信。
Distributed 定义了一系列用来访问Agent的接口和组件,包括AdapterConnector的描述。注意,AdapterConnector的区别在于:Adapter是使用某种Internet协议来与 Agent获得联系,Agent端会有一个对象 (Adapter)来处理有关协议的细节。比如SNMP AdapterHTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector

怎么使用JMX

需求

  1. 测试本地连接管理MBean
  2. 测试远程连接管理MBean,包括代码实现、启动参数、启动参数+配置文件等方式。
  3. 如何开启账号密码认证。

工程环境

JDK:1.8.0_231

maven:3.6.1

IDE:eclipse 4.12

主要步骤

  1. 定义MBean接口,并编写实现类;
  2. 注册MBeanMBeanServe
  3. 启动程序;
  4. 使用jconsole连接管理该程序。

创建项目

项目类型Maven Project,打包方式jar

引入依赖

入门案例暂时不需要引入外部依赖。

编写MBean接口

注意,接口名格式必须为:被管理的类的类名+MBean

public interface UserMBean {

	String getName();

	void setName(String name);

	Integer getAge();

	void setAge(Integer age);

	String getAddress();

	void setAddress(String address);

	String sayHello();

}

编写实现类

这里简单实现下就行。当属性被设置时,会在控制台打印相关内容。

public class User implements UserMBean {

	private String name;

	private Integer age;

	private String address;

	public String getName() {
return name;
} public void setName(String name) {
System.err.println("set name to " + name);
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
System.err.println("set age to " + age);
this.age = age;
} public String getAddress() {
return address;
} public void setAddress(String address) {
System.err.println("set address to " + address);
this.address = address;
} public String sayHello() {
return "Hello!";
} }

本地连接

注册MBean

路径为test目录下的cn.zzs.jmx,类名JMXTest。只有将MBean注册到MBeanServerMBean才能被管理。MBean的对象名格式为:域名:type=MBean类型,name=MBean名称。其中,域名MBean名称可以随便取,对象名中除了type,我们还可以自定义其他条目,以方便管理。

注意,为了让这个程序持续工作,这里强制线程睡眠。

	public static void main(String[] args) throws Exception {
// 设置MBean对象名,格式为:“域名:type=MBean类型,name=MBean名称”
String jmxName = "cn.zzs.jmx:type=user,name=user001";
// 获得MBeanServer
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
// 创建ObjectName
ObjectName objectName = new ObjectName(jmxName);
// 创建并注册MBean
server.registerMBean(new User(), objectName);
Thread.sleep(60 * 60 * 1000);
}

测试

启动程序,打开jconsole(在JDK安装路径的bin目录下),出现如下界面,这时可以看到我们测试的程序:

选择JMXTest后,点击连接,这时如果弹窗“安全连接失败,是否以不安全的方式重试”,这是因为我们没有开启ssl加密,可以不去理会它。点击不安全的连接,即可进入以下页面:

通过这个窗口我们可以查看程序的堆内存使用量、线程、类等信息,我们再点击MBean选项卡,可以看到我们编写的MBean,我们定义的对象名为cn.zzs.jmx:type=user,name=user001,其中cn.zzs.jmx作为第一级目录,type=user作为第二级目录,name=user001对应具体的对象,它具备属性和操作。其中,usersettergetter方法被合并在了一起。

通过这个界面,我们可以查看和设置user的属性,或调用它的方法。例如,我先设置name的值,通过程序控制台可以看到该方法被调用了:

接着我再调用sayHello方法:

通过以上例子,可以看到,JMX还是非常有用的,除了查看类的属性外,我们还可以在不重启程序的情况下进行配置或执行某些方法。

以上例子中,我们只能在本地访问JMXTest,接下来介绍如何实现远程连接。本文介绍三种方式,可根据实际场景选择:

  1. 代码实现;
  2. 启动参数配置;
  3. 启动参数+文件配置。

远程连接方式一(代码实现)

本例子在本地连接的基础上修改。

开启远程连接

注意,这里的localhost最好改为你的IP,不然可能连接不上。

	public static void main(String[] args) throws Exception {
// 设置MBean对象名,格式为:“域名:type=MBean类型,name=MBean名称”
String jmxName = "cn.zzs.jmx:type=user,name=user001";
// 获得MBeanServer
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
// 创建ObjectName
ObjectName objectName = new ObjectName(jmxName);
// 创建并注册MBean
server.registerMBean(new User(), objectName);
// 注册一个端口
LocateRegistry.createRegistry(9999);
// URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
jcs.start();
}

测试

打开jconsole,使用远程连接方式,输入我们设置好的ip和端口,点击连接即可:

远程连接方式二(启动参数)

本例子在本地连接的基础上修改。在程序启动时加入以下启动参数,也可以实现远程连接:

-Djava.rmi.server.hostname=<your-ip> // 你的ip
-Dcom.sun.management.jmxremote.port=9999 // 开放端口号
-Dcom.sun.management.jmxremote.local.only=false // 是否只能本地连接
-Dcom.sun.management.jmxremote.ssl=false // 是否使用ssl加密
-Dcom.sun.management.jmxremote.authenticate=false // 是否需要账号密码认证

可以看到,我们关闭了ssl加密和账号密码认证。

远程连接方式三(启动参数+配置文件)

本例子在本地连接的基础上修改。

启动参数

在程序启动时加入以下启动参数,并结合配置文件,也可以实现远程连接:

-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties // 配置文件路径
-Djava.rmi.server.hostname=<your-ip>

配置文件

在配置文件中配置以下参数:

# 开放端口号
com.sun.management.jmxremote.port=9999
# 是否只能本地连接
com.sun.management.jmxremote.local.only=false
# 是否使用ssl加密
com.sun.management.jmxremote.ssl=false
# 是否需要账号密码认证
com.sun.management.jmxremote.authenticate=false

关于management.propertie的详细配置,可以在$JRE/lib/management/目录下找到。其实,当我们在启动参数中存在以下参数时,默认会去读取$JRE/lib/management/management.properties的配置文件。

#    -Dcom.sun.management.jmxremote.port=<port-number>
# or -Dcom.sun.management.snmp.port=<port-number>

设置账户密码

实际使用中,我们更希望采用安全加密的方式来监控程序,这个时候我们可以设置ssl加密或账号密码认证。ssl加密的本文暂时不扩展,这里只介绍如何设置账号密码认证。

启动参数

和上个例子一样,需要设置如下启动参数:

-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties
-Djava.rmi.server.hostname=<your-ip>

配置文件

配置文件中加入以下内容:

# 开放端口号
com.sun.management.jmxremote.port=9999
# 是否只能本地连接
com.sun.management.jmxremote.local.only=false
# 是否使用ssl加密
com.sun.management.jmxremote.ssl=false
# 是否需要账号密码认证
com.sun.management.jmxremote.authenticate=true
# 密码文件路径
com.sun.management.jmxremote.password.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.password
# 权限文件路径
com.sun.management.jmxremote.access.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.access

在此之前,我们需要配置好密码文件和权限文件:

密码文件

ZhangZiSheng001 root

权限文件

ZhangZiSheng001 readwrite

测试

打开jconsole,选择远程连接,并输入账号密码,点击连接即可:

参考资料

相关源码请移步:https://github.com/ZhangZiSheng001/02-jmx-demo

本文为原创文章,转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/12128915.html

如何使用JMX来管理程序?的更多相关文章

  1. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

  2. 源码详解系列(七) ------ 全面讲解logback的使用和源码

    什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...

  3. 源码详解系列(八) ------ 全面讲解HikariCP的使用和源码

    简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...

  4. JMX整理

    阅读目录 Standard MBean与MXBean的区别 实现 Notification 认证与授权 JConsole Custom Client What and Why JMX JMX的全称为J ...

  5. Java之JMX 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt194 一.JMX简介 JMX是一种JAVA的正式规范,它主要目的是让程序有被 ...

  6. [转]Java之JMX 详解

    一.JMX简介 JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不间断运行的,那么你可能会想要“监 ...

  7. Java管理扩展指南之JMX技术总览

    JMX(Java管理扩展)系列 JMX(Java管理扩展)系列旨在介绍包含于Java基础版本(Java SE)中的JMX技术.本系列提供了如何使用JMX重要技术特性的诸多示例. 一.JMX技术总览简要 ...

  8. JMX jconsole 的使用

    JMX 1. JMX简单介绍 JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理正在运行中的Java程序.常用于管理线程, ...

  9. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

随机推荐

  1. C++2:函数与传递

    C++2:函数与传递 赵强 201831061427 目录   一.函数   二.函数重载   三.值传递   四.地址传递   五.递归函数 一.函数   我们在代码编译中常常会用到函数,函数是模块 ...

  2. 12 将类处理为excel,再将excel处理为类(界限计划3)

    中间使用map作为中间处理 将类处理为excel: 1.读取类转为map //读取btl,转为map public static Map getBtlMap(String rule, BTLDAO b ...

  3. SDUT-3334_数据结构实验之栈与队列七:出栈序列判定

    数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...

  4. es6 promise简析

    1.Promise的含义 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点: 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...

  5. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

  6. Freeware Tools For Linux, http://www.debianhelp.co.uk/tools.htm

    Freeware Tools For Linux, http://www.debianhelp.co.uk/tools.htm Freeware Tools For Linux DNS related ...

  7. day5_python之hashlib模块

    用来校验文本内容hash:一种算法 ,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法三个特点:1.内容相同则h ...

  8. jq实现简单手风琴效果

    文章地址:https://www.cnblogs.com/sandraryan/ 利用slideUp slideDown动画 <!DOCTYPE html> <html lang=& ...

  9. nginx 301 将不带www域名,重定向到www域名

    // nginx 官方推荐 server { listen 80; server_name example.org; return 301 http://www.example.org$request ...

  10. poj1573

    题意:给出一个矩形,N,E,S,W分别代表进行移动的方向,如果走出矩形网格则输出经过的网格数,如果在矩形网格内循环,则输出没进入循环之前所走过的网格数和循环所经过的网格数: 思路:创建两个数组,一个字 ...