JMX最通熟易懂的介绍

宋鑫    2015-07-21

本文:JMX最通熟易懂的介绍,原创于:宋鑫的官方网站,转载请注明出处,谢谢。

首先总的介绍一下JMX这个概念,JMX是Java Management Extension的缩写,其实简单得说来就是用来监控Java Class运行时状态的技术。而且他提供了强大的API和很好的设计,非常易于扩展,JDK5.0提供了这个技术的实现。 下面简单的介绍一下JMX之中的基本概念:

  1. MBean是JMX需要监控的Java Class类,每一个MBean都要实现一个后缀为MBean的接口,这个接口也是用户定义的,这个接口是用来向JMX暴露可访问的方法,属性等

  2. MBeanServer是MBeans的管理者,MBeanServer提供一个MBean的容器,一旦MBean注册到这个MBeanServer,这个MBean就被放到这个容器中,可以通过MBeanServer来访问这个MBean的属性和方法,(我觉得这个思路和EJB非常的相似)。

  3. Connector是用于用户访问MBeanServer的,有多种实现方式,有通过Http的连接方式,通过RMI的连接方式等 其实这三个概念就是JMX的三个基本组成部分,

JMX的Architecture就是由这三层组成的:

  1. 基础部件(MBean)

  2. 代理层(MBeanServer)

  3. 发布层(Connector)

1. 基础构件(MBean)

每一个MBean有两个部分组成,其中一个是后缀名为MBean的interface,另外一个是实现了这个接口的类,这点和EJB2.0很相似。原因是他们都是可以远程调用的,所以客户端只需要拿到那个实现了interface的Object就好了,不需要知道这个Object里面究竟是如何实现的。一个MBean的interface是用来定义暴露给MBeanServer的方法和属性的,其中暴露的属性是通过setter和getter方法来实现的,这个是符合JavaBean的规范的。MBean的Class则是实现这个interface,向外界提供具体的服务,这个Class的名字必须是那个接口MBean后缀的前部分。 还有一中MBean是DynamicMBean,这种MBean不需要创建接口,只需要实现DynamicMBean这个接口就行了。这种MBean的作用就是可以通过反射的机制自定义暴露的方法,属性,通知,而不使用MBeanServer提供的默认的访问规则。 还有就是Notification,这个理解起来很简单就不讲了。

2.代理层(MBeanServer)

代理层其实是管理MBean的容器,容器里面的MBean通过MBeanServer向外界提供服务,所以这层叫做代理层。

2.1 一个MBeanServer通过如下的工厂方法创建:

	MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

2.2 MBean可以注册到这个MBeanServer:

	ObjectName name = new ObjectName("com.example.mbeans:type=Hello");
        Hello mbean = new Hello();

        mbs.registerMBean(mbean, name);
ObjectName是从容器中取出这个MBean的Key。一个MBeanServer中不能注册两个相同的ObjectName。 MBeanServer基本上是通过反射机制来访问容器中的MBean的,所以对外提供的访问方法和反射机制很相似,基本上就是多了一个ObjectName的参数而已,下面列几个例子:
	mbs.getAttribute(mbeanObjectName, "State");

	mbs.setAttribute(mbeanObjectName, stateAttribute);

	mbs.invoke(mbeanObjectName, "reset", null, null); //TODO 代理层先写到这里吧,如果以后有需要补充的再加。

3,发布层 所谓发布层就是外界访问代理层的方法。

3.1 可以通过如下的方法启动一个RMI服务器 :


JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);

3.2 Client可以连接到这个RMI服务器 :


JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");

JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

而MBeanServer就是继承自MBeanServerConntion的,所以他们的大部分方法都一样或者相似。 OK,JMX的基本概念就介绍到这里.


文章有用?分享给你的朋友们,让更多的人受益


更多精彩干货,尽请关注我的个人微信公众号
wechat