【Java】JMX入门

一、JMX介绍

  JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

1、简介

  JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

  优点是可以非常容易的使应用程序被管理

  伸缩性的架构使每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。

  主要作用是提供接口,允许有不同的实现

2、分层

  JMX体系结构分为以下四个层次:

  【Java】JMX入门

  

设备层

  设备层(Instrumentation Level):主要定义了信息模型。在JMX中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。该层还定义了通知机制以及一些辅助元数据类。

代理层

  代理层(Agent Level):主要定义了各种服务以及通信模型。该层的核心是一个MBean服务器,所有的管理构件都需要向它注册,才能被管理。注册在MBean服务器上管理构件并不直接和远程应用程序进行通信,它们通过协议适配器和连接器进行通信。而协议适配器和连接器也以管理构件的形式向MBean服务器注册才能提供相应的服务。

  包含JMX Agent以及它们包含的MBean Servers。Agent layer的主要组件是MBean server,作为JMX Agents的核心,它充当MBeans的注册中心。该层提供了4个Agent 服务来使对MBean的管理更容易:计时器(Timer)、监控(monitoring)、动态加载MBean(dynamic MBean loading )、关系服务(relationship services )

分布服务层

  分布服务层(Distributed Service Level):主要定义了能对代理层进行操作的管理接口和构件,这样管理者就可以操作代理。然而,当前的JMX规范并没有给出这一层的具体规范。

附加管理协议API

  定义的API主要用来支持当前已经存在的网络管理协议,如SNMP、TMN、CIM/WBEM等。

3、其他概念

MBean:是Managed Bean的简称。在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。事实上,MBean就是一个Java Object,同JavaBean模型一样,外界使用自醒和反射来获取Object的值和调用Object的方法,只是MBean更为复杂和高级一些。 

MBeanServer:MBean生存在一个MBeanServer中。MBeanServer管理这些MBean,并且代理外界对它们的访问。并且MBeanServer提供了一种注册机制,是的外界可以通过名字来得到相应的MBean实例。 

JMX Agent:Agent只是一个Java进程,它包括这个MBeanServer和一系列附加的MbeanService。当然这些Service也是通过MBean的形式来发布。 

Protocol Adapters and Connectors 
  JMX Agent通过各种各样的Adapter和Connector来与外界(JVM之外)进行通信。同样外界(JVM之外)也必须通过某个Adapter和Connector来向JMX Agent发送管理或控制请求。 
Adapter和Connector的区别在于:Adapter是使用某种Internet协议来与JMX Agent获得联系,Agent端会有一个对象(Adapter)来处理有关协议的细节。比如SNMP Adapter和HTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector。 
JMX Agent可以带有任意多个Adapter,因此可以使用多种不同的方式访问Agent。 

二、JMX使用

1、建立一个MBean接口和实现类

  HelloMBean.java:

1 public interface HelloMBean {
2     // management attributes
3     public String getName();
4 
5     public void setName(String name);
6 
7     // management operations
8     public void print();
9 }

 

  实现类Hello.java:

 1 public class Hello implements HelloMBean {
 2     private String name = "";
 3 
 4     public String getName() {
 5         return name;
 6     }
 7 
 8     public void setName(String name) {
 9         this.name = name;
10     }
11 
12     public void print() {
13         System.out.println("Hello, " + name + "!!");
14     }
15 }

2、创建MBeanServer

 1 public class HelloAgent  {
 2     private MBeanServer server;
 3 
 4     public HelloAgent() {
 5 
 6         // CREATE the MBeanServer
 7         System.out.println("\n\tCREATE the MBeanServer.");
 8         this.server = ManagementFactory.getPlatformMBeanServer();
 9 
10         // CREATE Registe HelloMBean
11         System.out.println("\n\tCREATE, REGISTER a new Hello Standard_MBean:");
12         Hello hello = new Hello();
13         hello.setName("xxx");
14         ObjectName hello_name = null;
15         try{
16             hello_name = new ObjectName("jmxBean:name=Hello ");
17             System.out.println("\tOBJECT NAME = " + hello_name);
18             //将HelloMBean注册到MBeanServer中去
19             server.registerMBean(hello, hello_name);
20 
21             Thread.sleep(60*60*1000);
22         } catch (Exception e) {
23             e.printStackTrace();
24         }
25     }
26 
27 
28     public static void main(String args[]) {
29         HelloAgent agent = new HelloAgent();
30     }
31 
32 }

3、运行代码

  运行HelloAgent的main方法

4、使用Jconsole访问jmx

  1、打开jconsole,连接

  【Java】JMX入门

  2、查看属性

  【Java】JMX入门

  3、调用方法

  【Java】JMX入门

  

参考:

  https://baike.baidu.com/item/JMX/2829357?fr=aladdin

  https://www.cnblogs.com/duanxz/category/689081.html

  https://www.cnblogs.com/dongguacai/p/5900507.html

上一篇:zabbix监控tomcat,jmx JavaGateway not host


下一篇:性能工具之JMeter两个Java API Demo