haidaoxianzi 2010-12-03
本文采用Spring JMX 和MX4J开发的JMX,
备注必须的类库为:ms4j-tools-3.0.1.jar,mx4j-3.0.2.jar
具体要实现JMX MBean的 注解类:
package com.easyway.jboss.jmx.spring.service; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedOperationParameter; import org.springframework.jmx.export.annotation.ManagedOperationParameters; import org.springframework.jmx.export.annotation.ManagedResource; /** * 采用Spring的注解方式实现JMX的开发 * @author longgangbai *正如你所见,除了元数据定义的语法外只有很少的变动。这个方法在后台启动时会有一点缓慢, *因为要在类中使用Commons Attributes转换JDK5.0的注解。不过,这仅仅是一次性的开销并 *且JDK5.0的注解为你带来编译时检查的好处。 * */ @ManagedResource public class JMXAnonationMBeanManager { private int clientStatus; @ManagedOperation(description = "pause a single proccess") @ManagedOperationParameters( { @ManagedOperationParameter(name = "Name of proccess instance", description = "Mandatory") }) public void pause(String n) { System.out.println("pause"); } @ManagedOperation(description = "shut down the proccess") public void monitor() { System.out.println("shutting down…"); } public void publicMessage() { System.out.println("public Message to monitor server"); } @ManagedAttribute(description = "client status") public int getClientStatus() { return clientStatus; } @ManagedAttribute(description = "client status") public void setClientStatus(int clientStatus) { this.clientStatus = clientStatus; } }
配置信息如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 要在管理接口定义中使用JDK5.0的注解,Spring提供了一个注解集镜像到Commons Attribute参数类和一个JMX的实现来支持JmxAttributeSource, AnnotationsJmxAttributeSource并允许MbeanInfoAssembler读取它们。 --> <!-- 创建相关的Bean对象并设置参数 --> <bean id="monitorMBeanManager" class="com.easyway.jboss.jmx.spring.service.JMXAnonationMBeanManager"/> <!-- 创建一个MBeanServer对象, --> <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> </bean> <bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/> <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> <property name="attributeSource"> <ref local="jmxAttributeSource"/> </property> </bean> <bean id="httpAdaptor" class="mx4j.tools.adaptor.http.HttpAdaptor"> <property name="processor"> <bean id="xsltProcessor" class="mx4j.tools.adaptor.http.XSLTProcessor"/> </property> <property name="port"> <value>8000</value> </property> </bean> <!--一个由 MBeanServerFactoryBean 创建的 MBeanServer 实例,它通过属性server提供给了 MBeanExporter。 当你提供了你自己的 MBeanServer 实例后,MBeanExporter 将使用该实例,且不再查找一个运行中的 MBeanServer。 设置相关的Bean的暴露为JMX 关系最大的是 exporter Bean。beans 属性使得 MBeanExporter 知道要将哪个Bean输出到JMX的 MBeanServer 上去。 缺省配置中,beans 里的 Map 中的条目的key被用作相应条目值所引用的Bean的 ObjectName。 --> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="assembler"> <ref local="assembler"/> </property> <property name="beans"> <map> <entry key="bean:name=monitorMBeanManager" value-ref="monitorMBeanManager"> </entry> <entry key="mx4j:name=HttpAdaptor" value-ref="httpAdaptor"> </entry> </map> </property> <property name="server" ref="mbeanServer"/> </bean> </beans>
测试代码如下:
package com.easyway.jboss.jmx.spring.service; import java.io.IOException; import mx4j.tools.adaptor.http.HttpAdaptor; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 采用Mx4j测试JMX * @author longgangbai * */ public class JBossJMXServiceClient { public static void main(String[] args) throws IOException { ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext-jmx-annotation.xml"); HttpAdaptor httpAdaptor=(HttpAdaptor)ctx.getBean("httpAdaptor"); httpAdaptor.start(); } }
在浏览器中输入:
说明:applicationContext.xml配置文件中已经设置httpAdaptor端口号为8000,运行JBossJMXServiceClient 后,通过web浏览器登录http://localhost:8000 ,点击bean:name=monitorMBeanManager进入页面,就可以访问或者通过暴露的接口操作JMXAnonationMBeanManager 了。