`
damies
  • 浏览: 238400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMX

阅读更多

一、前言
 
  每一个MBean都要有一个接口,比如前面的Hello要有一个HelloMBean接口。要多维护一个接口,的确是件麻烦的事。 Apache的commons-modeler利用JMX中的动态MBean原理很好的解决了这一问题,commons-modeler使用得我们可以只写Hello,而不用写HelloMBean这个接口。不过这是有代价的,它要求我们写一个mbean的xml描述文件(唉,少了一件事,却又多出另一件事来)。但commons-modeler还是有优点的,就是它让mbean的装配更加灵活,把多个mbean的装配都集中在一个XML文件里来了。
  开始实例之前,你需要先去apache网站下载commons-modeler,以及modeler的依赖项目commons-logging。下载网址为:http://jakarta.apache.org/site/downloads/downloads_commons.html,下载的文件是ZIP压缩包,解压后找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令行开发,则把这两个JAR包加入到classpath系统变量中。如果你用Eclipse开发,则把JAR包加入到项目属性的Libratries(库)引用中。
 
二、HelloWorld实例
 
  我们以本系统的第一篇“1、JMX的Hello World”为例,来重新实现一次。
 
1、Hello.java的代码不变(注:为了在Eclipse上和原来的Hello文件放在不同的地方,我把新Hello放到了mbean.modelbean包),如下:

java 代码
  1. package mbean.modelbean;   
  2.   
  3. import mbean.standard.HelloMBean;   
  4.   
  5. public class Hello implements HelloMBean {   
  6.     private String name;   
  7.     public String getName() {   
  8.         return name;   
  9.     }   
  10.     public void setName(String name) {   
  11.         this.name = name;   
  12.     }   
  13.     public void printHello() {   
  14.         System.out.println("Hello World, " + name);   
  15.     }   
  16.     public void printHello(String whoName) {   
  17.         System.out.println("Hello , " + whoName);   
  18.     }   
  19. }   

2、MBean不用写了,但需要写一个XML描述文件。文件名任取,这里取名为:mbeans-descriptors

xml 代码
  1. <?xml version="1.0"?>  
  2. <mbeans-descriptors>  
  3.  <mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">  
  4.   <attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>  
  5.   <operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>  
  6.  </mbean>  
  7. </mbeans-descriptors>   

这里只对<mbean>标签做一下说明:

    * name mbean在xml中的唯一标识,不一定要和类同名
    * description mbean的注释说明信息
    * domain mbean所属域
    * group mbean所属组
    * type mbean的类全名(包名+类名)
    * classname 指定实现代理功能的ModelMbean的全名,如果不指定则默认为BaseModelMBean

3、接下来改写HelloAgent

java 代码
  1. package mbean.modelbean;   
  2.   
  3. import java.io.InputStream;   
  4. import javax.management.MBeanServer;   
  5. import javax.management.ObjectName;   
  6. import javax.management.modelmbean.ModelMBean;   
  7. import org.apache.commons.modeler.ManagedBean;   
  8. import org.apache.commons.modeler.Registry;   
  9. import com.sun.jdmk.comm.HtmlAdaptorServer;   
  10.   
  11. public class HelloAgent {   
  12.     public static void main(String[] args) throws Exception {   
  13.         //基于xml中的信息构建一个Registry   
  14.         Registry registry = Registry.getRegistry(nullnull);   
  15.         InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");   
  16.         registry.loadMetadata(stream);   
  17.         stream.close();   
  18.         //由Registry得到一个MBeanServer   
  19.         MBeanServer server = registry.getMBeanServer();   
  20.   
  21.         //得到Hello在描述文件中的信息类,对应于xml文件<mbean>标签的name属性。   
  22.         ManagedBean managed = registry.findManagedBean("Hello");   
  23.         //创建ObjectName   
  24.         ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");   
  25.         //得到ModelMBean   
  26.         ModelMBean hello = managed.createMBean(new Hello());   
  27.         //注册MBean   
  28.         server.registerMBean(hello, helloName);   
  29.   
  30.         ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");   
  31.         HtmlAdaptorServer adapter = new HtmlAdaptorServer();   
  32.         server.registerMBean(adapter, adapterName);   
  33.         adapter.start();   
  34.         System.out.println("start.....");   
  35.     }   
  36. }  
HelloAgent是效复杂的地方,我们来和以前的HelloAgent逐步比较一下,前后有什么不同:
(1)首先,新的HelloAgent需要将xml信息读入到Registry对象中,这是旧HelloAgent所没有的。

Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();

 
(2)接着创建MBeanServer的方式也不同了
现在:MBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
 
(3)Hello相应的ObjectName创建也略不相同。主要是域名在XML描述文件里设置好了。
现在:ManagedBean managed = registry.findManagedBean("Hello");
     ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
 
(4)得到MBean的方式也不同,这里就是关键的不同点
现在:ModelMBean hello = managed.createMBean(new Hello());
以前:Hello hello = new Hello();
注意:为什么现在要比以前多一个createMbean步骤呢,就是因为现在的写法并没有写Mbean,所以需要动态才需要生成一个。而以前就直接把new Hello()注册到mbean server就可以了,server会自动找到它的HelloMBean接口文件。
 
 也就上面四点区别,其他代码完全一样。测试和查看效果的方法和以前一样,在此不累述了。

 
 commons Modeler为Hello动态生成了一个MBean接口:BaseModelBean
 
参考资料
  用Commons Modeler 开发JMX应用
分享到:
评论
1 楼 lurga 2008-04-03  
hello类不需要实现HelloMBean。mbeans-descriptors没有加上printHello带参数的函数:
<?xml version="1.0"?>  
<mbeans-descriptors>  
	<mbean name="Hello" description="the hello bean" domain="Study" group="helloGroup" type="mbean.modelbean.Hello">  
		<attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>  
		<operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
		<operation name="printHello" description="a operation to print hello" impact="ACTION" returnType="String">
			<parameter name="whoName" description="who's name." type="java.lang.String"/>
		</operation>   
	</mbean>  
</mbeans-descriptors>   

是好文,补充点东西作为读书笔记

相关推荐

    commons-modeler.jar

    commons-modeler.jar,构建JMX必备

    commons-modeler-2.0.1.jar + commons-logging-1.1.2-bin.zip

    Apache Commons Modeler是Apache软件基金会开发的一个开源项目,主要用于简化Java Management Extensions (JMX)的开发。JMX是一种Java平台上的标准,它提供了一种框架来管理并监控应用程序、服务和设备,允许开发者...

    apache-commons源码及jar文件

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题。(附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 ...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-modeler 创建符合 JMX 规范的 MBeans 机制 commons-net 网络和协议实现的集合 commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单...

    Jakarta commons docs API CHM 格式

    commons-modeler 创建符合 JMX 规范的 MBeans 机制 commons-net 网络和协议实现的集合 commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单...

    jmx资料

    - `commons-modeler-2.0.1.zip`:Apache Commons Modeler,用于动态建模和MBean创建,有助于实现JMX的MBean功能。 - `jmx-1_2_1-ri.zip`:早期版本的JMX实现,包含运行时接口(RI)和API。 - `jdmkrt.jar`:可能...

    JMX: Developer's Quick Start Guide

    - **Apache Commons Modeler**:这是一个用于构建MBeans的工具包,它提供了丰富的API来简化MBeans的创建过程。 - **XDoclet**:这是一个源代码元数据工具,它可以通过注释自动为Java类生成JMX相关的代码。 通过以上...

    commons包介绍1

    Apache Commons 是一系列小型实用工具库,它为Java开发者提供了丰富的组件和类库,极大地扩展了标准Java库的功能。这些组件涵盖了各种领域,如数据编码、集合操作、配置管理、网络通信、XML处理、脚本执行等。以下是...

    JAKARTA COMMONS

    Apache Jakarta Commons 是一组由 Apache 软件基金会提供的 Java 库,这些库旨在解决常见的编程问题,提供便捷的功能,减少开发人员重复编写基础代码的工作。Jakarta Commons 包含了许多子项目,每个子项目专注于...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    20.5 Commons Modeler 161 20.5.1 MBean描述符 162 20.5.1.1 mbean 162 20.5.1.2 attribute 163 20.5.1.3 operation 163 20.5.1.4 parameter 163 20.5.2 mbean标签实例 164 20.5.3 自己编写一个model MBean 164 20.5...

Global site tag (gtag.js) - Google Analytics