JMX详解详细介绍及使用

JMX

1. JMX简单介绍

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,
实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。主要用于对JAVA应用程序和JVM进行监控和管理。

JConsole和JVisualVM中能够监控到JAVA应用程序和JVM的相关信息都是通过JMX实现的。

JMX架构介绍

JMX架构图

基础监测层

监控层的作用就是使用MBean来监控我们关心的性能指标。因为我们通常关注的性能指标比较多,通常情况下,在监控层我们会有多个MBean,每个MBean监控一类信息。

JMX代理

JMX代理是内嵌在Java应用程序中的,JMX代理相当于一个容器,所有的MBean都注册到这个容器中,这个容器可以接受外部的请求,返回MBean的监控信息。JMX Agent的核心组件是MBean server,它是一个管理对象的服务器,MBeans在其中注册。一个JMX代理还包括一组用于管理MBeans的服务和至少一个通信适配器(adaptor)或连接器(connector) 以供管理程序访问

远程管理层

JMX 可以以多重方式来访问JMX技术监测信息,既可以通过现有的管理协议,比如简单网络管理协议(SNMP),也可以通过专利性的协议。MBean server依赖协议适配器(adaptors)和连接器(connectors)来让JMX代理供管理程序(位于JMX代理所在的JVM之外)访问。
每个适配器都通过一个特定的协议提供一个包含了所有注册在MBean Server中的MBeans的视图。比如,一个HTML适配器可以在一个浏览器中显示一个MBean。

2. MBean与MXBean的介绍
MBean介绍

MBean也是JavaBean的一种,在JMX中代表一种可以被管理的资源。一个MBean接口由属性(可读的,可能也是可写的)和操作(可以由应用程序调用)组成。MBean可分为如下四种:

类型                  描述
standard MBean   这种类型的MBean最简单,一个标准的MBean由一个MBean接口(该MBean接口列出了所有被暴露的属性和操作对应的方法)
                 和一个class(这 个class实现了这个MBean接口并提供被监测资源的功能)组成(接口和class必须放在同一个包下,不然会出错)。
                 它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。标准MBean只能操作基本数据类型,
                 如 int、dubbo、lang等

dynamic MBean   必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义

open MBean      此MBean的规范还不完善,正在改进中

model MBean     与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。
                RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,
                Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义
                在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),
                只有在运行时,才通过set方法将其加入到model MBean中。后面的例子会有详细介绍
MXBean

MXBean是MBean的一种,MXBean与MBean一样都需要定义一个接口和class类,但是MXBean并不要求Java类的名称必须与接口名称前部分相同。另外MXBean中还可以正常使用自定义数据类型;
如果在MBean中使用自定义数据类型的话,通过JConsole查看时会显示不可用。 当MXBean中使用被转换成CompositeDataSupport类

标准MBean与MXBean的区别
  1. 在标准MBean中使用自定义数据类型时,JConsole中会显示不可用;而在MXBean中可以正常所使用。
  2. 标准的MBean接口与Class的命名必须遵守是一定规范,而MXBean的接口与Class的命名没有约束条件。
4. JMX的使用
标准MBean 使用规范

标准的MBean由一个MBean接口和一个Class类组成,并且接口必须命名为 xxxMBean 而 Class类名必须为 xxx 放与同一个包下,若不在同一包下运行时将出异常。

JMX的使用步骤
    1. 定义接口与资源实体类,接口中定义属性与操作;get表示可读,set表示可写。
    2. 创建Agent类。
        a. 创建MBeanServer,相当于管理MBean的容器,创建方式有两种一获取JVM中默认启动的Mbean server 或者 自己创建。
        b. 创建ObjectName,用于标识唯一的资源MBean,格式为:"域名:name=MBean名称"。
        c. 绑定MBean与对应的ObjectName并注册到MBeanServer。
    至此即可通过JConsole管理本地的MBean的先关信息了,同事也可以提供其他的连接方式,如:
    3. rmi连接方式。
        a. 注册监听端口号。
        b. 创建JMXServiceURL,格式为:service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi(完整版)  JMXServiceURL格式说明 。
        c. 创建jmxConnectorServer,绑定MBserver与Url。
    4. HtmlAdaptor连接管理方式(需要引入jmxtools.jar)。
        a. 创建Html适配器,并设置监听端口。
        b. 创建适配器ObjectName,绑定Html适配器并注册到MBeanServer。
        c. 开启适配器。

具体使用详情,参考如下代码

    public static void init(LoggerContext loggerContext) throws Exception {
        mBeanServer = MBeanServerFactory.createMBeanServer(DOMAIN_NAME);
        // 注册服务
        ObjectName objectName = new ObjectName(DOMAIN_NAME + ":name=" + RELOAD_CONFIG_NAME);
        jmxConfigurator = new JMXConfigurator(loggerContext, mBeanServer, objectName);
        mBeanServer.registerMBean(jmxConfigurator, objectName);

        // htmlAdaptor 注册连接
        htmlAdaptorServer = new HtmlAdaptorServer();
        htmlAdaptorServer.setPort(HTML_PORT);
        objectName = new ObjectName(DOMAIN_NAME + ":name=" + CONNECTOR_NAME);
        mBeanServer.registerMBean(htmlAdaptorServer, objectName);
        htmlAdaptorServer.start();

        // rmi方式
        //这句话非常重要,不能缺少!注册一个端口,绑定url后,客户端就可以使用rmi通过url方式来连接JMXConnectorServer
        LocateRegistry.createRegistry(RMI_PORT);
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + RMI_PORT + "/logback_config");
        jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);
        jmxConnectorServer.start();
    }
JMXServiceURL格式说明
  • service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi
    蓝色部分可以省略掉
  • service:jmx: 这个是JMX URL的标准前缀,所有的JMX URL都必须以该字符串开头,否则会抛MalformedURLException
  • rmi: 这个是jmx connector server的传输协议,在这个url中是使用rmi来进行传输的
  • localhost:0 这个是jmx connector server的IP和端口,也就是真正提供服务的host和端口,可以忽略,那么会在运行期间随意绑定一个端口提供服务
  • jndi/rmi://localhost:1099/jmxrmi 这个是jmx connector server的路径,具体含义取决于前面的传输协议。比如该URL中这串字符串就代表着该jmx connector server的stub是使用 jndi api 绑定在 rmi://localhost:1099/jmxrmi 这个地址
JMX通知

Notification通知的使用

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值