一、JMX介绍
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
1、简介
JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等
优点是可以非常容易的使应用程序被管理
伸缩性的架构使每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。
主要作用是提供接口,允许有不同的实现
2、分层
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,连接
2、查看属性
3、调用方法
参考:
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