浏览 2063 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-27
举个例子,前段时间做的一个项目,需要在一台机器上监视几十台client的操作,CPU使用率,内存,硬盘等信息,当CPU,内存使用率过高时,发出通知到该client.甚至操作client的执行动作,都可用jmx做到。 今天将从简单入手结合jdk的Annotation来实践Spring对jmx的支持 代码: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- mbean --> <bean id="mbeanManager" class="com.xmlasia.spring.test.jmx.MBeanManager"/> <!-- JMX configuration --> <!-- 创建一个mbeanServer --> <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> </bean> <!-- MetadataMBeanInfoAssembler是AutodetectCapableMBeanInfoAssembler 唯一实现 spring文档中有专门介绍AutodetectCapableMBeanInfoAssembler的章节 --> <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> <property name="attributeSource" ref="jmxAttributeSource"/> </bean> <!-- 解释mbean中Annotation的类,我们可以看到他给注入到assembler,被org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler包装--> <bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/> <!-- spring jmx最核心的类 --> <bean id="mBeanExporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="server" ref="mbeanServer"/> <property name="assembler" ref="assembler"/> <property name="beans"> <!-- 将mbean注册到mBeanExporter --> <map> <entry key="mbean:name=testBean" value-ref="mbeanManager"/> </map> </property> </bean> </beans> 以前jmx的应用需要编写很长的代码来实现,现在你只需完成以上配置就可以实现一个简单的jmx server的程序,jmx server的实现有很多,通常情况下,jmx会需要一个容器例如jboss,现在的方法是将程序本身作为server,这个方式最经典的例子就是个大apserver,我的第一次jmx体验就是在看jboss源码时发起的。实现方式不同会用到不同的协议,这里我们需要jmxremote.jar,你可在spring的lib中找到。 现在来看下我们的mbean 代码: package com.xmlasia.spring.test.jmx; 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 public class MBeanManager { 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; } } 我们可以到类中定义了几个方法,monitor server可以通过clientStatus了解到client的状态,publicMessage是用来主动的发送消息到monitor server,所有不需要想外界暴露。monitor server可以通过 获得信息中的ObjectName和Ip来连接到client操作mbean. mbean在jdk的标准实现是需要实现一个以MBean结尾的interface的,其中定义向外界暴露的方法和属性 现在之需要在类前定义@ManagedResource,在属性方法前分别用@ManagedOperation或者@ManagedAttribute修饰就可以了,Annotation实在是太方便了。未来将会有更多的应用。 该测试了 代码: public static void main(String[] args){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/jmxContext.xml"); while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 现在我们只需要让Spring加载上面那段bean的定义就好了。jmx mbean server的启动是不会阻塞主线程的,所以需要保持主线程活着,不然加载完main方法就结束了,mbean server也挂了。 jdk里有个强大的monitor server那就是jconsole,不过一次只有一个连接 大家可以用jconsole来连接到mbean,调用方法或属性察看结果。 spring jmx很有多有用的功能本人正在挖掘,过段时间再放出一些心得,欢迎有兴趣的一起讨论。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |