浏览 6827 次
锁定老帖子 主题:Spring + JMX 入门
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-14
1.连接器 参考手册中介绍了无数连接器,包括rmi/iiop/Burlap/Hessian/SOAP等等,非常的多。但实际上,我们用得上的并不多。最容易配的是rmi,转帖参考手册中的例子: <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean"> <property name="objectName" value="connector:name=rmi"/> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:1099/myconnector"/> </bean> 这种方式配起来最简单,不需要任何附加的库。用起来也不麻烦,在命令行运行jconsole,然后输入上面的serviceUrl就可以了。 这是最容易配的,但不是最好用的。因为程序开发出来后,程序的监控/管理界面一般是由业务人员或者客户来使用,并不是程序员在使用,他们的机器上很少装有jdk,没jconsole可用;还有一个缺点就是serviceUrl未免太长了,非常不容易记。很多时候程序员自己都不记得,就更别说其他人了。 最简单的最好用的还是通过IE就可以查看和管理了,这里我推荐mx4j,这个工具包提供了一个http的管理界面,非常好用。下载:http://jaist.dl.sourceforge.net/sourceforge/mx4j/mx4j-3.0.2.zip。以下是最简版的使用mx4j的配置: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- MBeanExporter --> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" depends-on="mbeanServer"> <property name="beans"> <map> <entry key="JmxTest:name=RuntimeInfo" value-ref="managerRuntime" /> <entry key="MX4J:name=HttpAdaptor" value-ref="httpAdaptor" /> </map> </property> <property name="server" ref="mbeanServer" /> <property name="assembler"> <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> <property name="attributeSource"> <bean id="attributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" /> </property> </bean> </property> </bean> <!-- MBeanServerFactoryBean --> <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> </bean> <!-- HttpAdaptor & XSLTProcessor --> <bean id="httpAdaptor" class="mx4j.tools.adaptor.http.HttpAdaptor"> <property name="processor"> <!-- XSLTProcessor --> <bean id="xsltProcessor" class="mx4j.tools.adaptor.http.XSLTProcessor" /> </property> <property name="port" value="7788" /> </bean> <bean id="managerRuntime" class="jmxTest.mbean.ManagerRuntimeMBean"> </bean> </beans> 这几乎是无法在精简的配置了。里面的managerRuntime是样例的mbean。 2.MBeanInfoAssembler 这个接口的用途是将你所需要变成MBean类的信息提取出来,并生成MBean。Spring大大简化了MBean的实现方式,我们现在已经不需要自己实现MBean接口定义的方法了。在参考手册中介绍了好几种MBeanInfoAssembler接口,我们在网上常见的例子就是SimpleReflectiveMBeanInfoAssembler,这个接口通过反射的方法提取出我们要管理的类的信息,包括里面有什么方法啊,各个方法有什么参数啊,等等。 这个接口真简单,我们什么都不用管了,但实际使用的时候,我们发现一些问题: a. 我们无法为每个方法加注释,以及帮这个MBean加注释,管理界面都是一堆方法名,业务人员经常过来东问西问,真麻烦。 b. 反射时把类的所有方法都找了出来,甚至连用于spring 注入的setter,getter等完全不搭边界的东西也暴露出来,以至于管理界面上有N多的方法,眼都花。 本人强烈推荐用AnnotationJmxAttributeSource,看到Annotation字样,大家也就知道是用jdk1.5的Annotation了。确实如此,我们可以非常方便的用Annotation加注释,并限制某些方法不要暴露出去。参考手册上有详细的例子,我下面给的例子则是简化版: jmxTest/mbean/ManagerRuntimeMBean.java package jmxTest.mbean; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; @ManagedResource(description = "VM运行状态") public class ManagerRuntimeMBean { private long getMax() { return Runtime.getRuntime().maxMemory() >> 20; } private long getTotal() { return Runtime.getRuntime().totalMemory() >> 20; } private long getFree() { return Runtime.getRuntime().freeMemory() >> 20; } private long getUsed() { return getTotal() - getFree(); } @ManagedAttribute(description = "可分配的最大内存") public String getMaxMemory() { return getMax() + " M"; } @ManagedAttribute(description = "已分配内存") public String getTotalMemory() { return getTotal() + " M"; } @ManagedAttribute(description = "已使用内存") public String getUsedMemory() { return getUsed() + " M"; } @ManagedOperation(description = "Shutdown VM") public void shutdown() { Runtime.getRuntime().exit(0); } } 和参考手册上例子不同地方在于,我们只使用@ManagedResource这些注释中最简单的功能,而不是参考手册上非常长的一大段。 上面例子中没有加@ManagedAttribute的那几个方法不会被暴露出去。下面的例子则是对方法参数加说明的例子 jmxText/mbean/Mbean1.java package jmxTest.mbean; 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; @ManagedResource(description = "mbean1") public class Mbean1 { private String p1; @ManagedAttribute public String getP1() { return p1; } @ManagedOperation(description="方法P1 的说明") @ManagedOperationParameters({ @ManagedOperationParameter(name = "p1", description = "参数 p1 的说明")}) public void addP1(String p1) { this.p1 = p1; } } 3.启动 最后一个程序则是启动程序,我们让系统跑起来 JmxTestStart.java package jmxTest; import java.io.IOException; import javax.management.MalformedObjectNameException; import jmxTest.mbean.Mbean1; import mx4j.tools.adaptor.http.HttpAdaptor; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jmx.export.MBeanExporter; import org.springframework.jmx.support.ObjectNameManager; public class JmxTestStart { public static void main(String[] args) throws IOException, MalformedObjectNameException, Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] { "beanRefJMXServer.xml", }); //启动 HttpAdaptor,mx4j的HttpAdaptor真讨厌,要手工启动 HttpAdaptor httpAdaptor = (HttpAdaptor)ctx.getBean("httpAdaptor"); httpAdaptor.start(); //动态注册一个MBean的例子 MBeanExporter exporter = (MBeanExporter) ctx.getBean("exporter"); exporter.registerManagedResource(new Mbean1(), ObjectNameManager.getInstance("ZtManager:name=mbean")); } } 注意,这个启动程序还有一个特别之处,第一个例子ManagerRuntimeMBean是在配置文件中说明要变成MBean的,第二个例子Mbean1则是在系统运行时动态注册的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-07
好!ding.还不能只说一个“好”,晕。
|
|
返回顶楼 | |