JMX介绍 之二 MXBeans
之前讲了在使用标准的MBean时,客户端代码中需要包含接口,通过JMX生成这个接口的proxy实例,来调用。
?
但是,对于MXBeans我们不需要知道被调用的类型。还是直接通过例子来看。
?
首先还是要定义一个接口,接口的名字要以MXbean结尾。
?
?
我们可以看到Sample的值是CompositeDataSupport,而不是我们定义的Sample类的类名。这是因为,在MXbean里,MBean里面使用的数据类型,都会被转换成CompositeData类型,他是一个接口,CompositeDataSupport是他的实现,对于大多数普通对象,都可以被直接转换成CompositeDataSupport类型。就好像一个Map类型,只要里面的数据都是String,int这样的类型,就能转换成一个字符串,同样的道理,在MXBean里,所有的对象,都是被转换成CompositeDataSupport,来发送到客户端的。
?
我们在Sample类的构造函数里面,使用了@ConstructorProperties({"date", "size", "head"}),其实就是告诉JMX在创建Sample对象的时候,需要几个参数,分别叫什么。
?
然后在JConsole中,我们双击CompositeDataSupport,就可以看到Sample对象里面的3个成员。
?
因为在QueueSamplerMXBean里面,只定义了getSample方法,所以只能看,你们可以试着加一个add方法,在调用 的时候,就能看到JMX会为我们提供创建Sample对象时需要的3个成员的输入框。
?
如果是标准MBean,在Sample的值那一列,就无法显示正确的类型,更无法查看对象,,因为jconsole根本找不到sample类。除非你在启动JConsole的时候,把Sample类所在的目录作为classpath。
?
通过使用JConsole,我们就能看出MXBean和普通bean的区别。
?
最后,再看看在客户端使用时的区别:
?
?
?在这个代码里,我们没有使用QueueSampler来得到MBean对象的引用,而且,对这个对象里面Sample属性,也是使用CompositeData来获得,然后,再得到里面的date属性。
?
从这个代码就可以看出来,对于MXBean类型的MBean使用,我们完全不需要知道对方的类,参数类型,就可以通过CompositeData来得到其数据。
?
但是,对于稍微复杂的数据,如果都要这样去取,那是一件很麻烦的事情,所以,我们还是可以用类似标准MBean的方式,来得到:
?
?这跟标准MBean的区别就是JMX.newMXBeanProxy()。
?
那这样的话,标准MBean和MXBean不就没有区别了吗?都是要在客户端使用对象接口来获得proxy对象,调用的时候需要的类也需要,这些都要加到客户端的类路径里面。如果这样使用,确实在使用上,两种类型感觉没什么区别。只是在JMX内部,对于MXBean类型,对象是先转换成CompositeData,然后通过网络传输到客户端,客户端再把它转换成自己的bean类型。这些转换都是自动的,根据bean里面的@ConstructorProperties({"date", "size", "head"})转换。
?
所以说,MXbeans为用户提供了在无法得到被调用的接口类型和对象类时,只要我们知道它提供的属性数据的结构,也可以得到里面的数据的功能。而且,MXbean提供了非常多的MXBean,例如用于JVM监控的。在做系统监程序的时候,非常有用。?
