Spring 2.x jmx 及应用(2)mbean注册方式
spring提供了灵活的MBean方式
除了之前介绍过的Annotation
还有Metadata方式,类似于Annotation
这种方式在创建javadoc时候会给予警告但不会影响doc的创建
package com.xmlasia.spring.test.jmx;/** * @@org.springframework.jmx.export.metadata.ManagedResource * (description="My Managed Bean",objectName="spring:bean=test") * */public class CommentMBeanManager {private int clientStatus;/** * @@org.springframework.jmx.export.metadata.ManagedOperation * (description="pause a single proccess") * */public void pause(String n) {System.out.println("pause");}/** * @@org.springframework.jmx.export.metadata.ManagedOperation * (description="shut down the proccess") */public void monitor() {System.out.println("shutting down...");}public void publicMessage() {System.out.println("publicMessage");}/** * @@org.springframework.jmx.export.metadata.ManagedAttribute * (description="client status") */public int getClientStatus() {return clientStatus;}public void setClientStatus(int clientStatus) {this.clientStatus = clientStatus;}}使用这种方式需要改变attributeSource的实现类
<?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"/><!-- JMX configuration --><bean id="mbeanServer"/></property></bean><bean id="assembler"ref="attributeSource" /></bean><bean id="mBeanExporter"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>
其他照旧不需修改
如果你有很多mbean spring也提供了很好的解决方法
你只需在修改mBeanExporter的属性autodetect=true
<bean id="mBeanExporter"ref="mbeanServer" /><property name="assembler" ref="assembler" /><property name="autodetect" value="true" /></bean>
spring会搜索context中所有被ManagedResource标记的mbean自动进行注册
另一种方式类似于标准的jmx mbean实现,用interface来定义将要暴露的Attribute和Operation
<?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"/><!-- JMX configuration --><bean id="mbeanServer"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>
我们可以通过refactor快速的将CommentMBeanManager的方法和属性抽取到ICommentMBeanManager中。
注意managedInterfaces是一个Class[]的类型不用担心很多接口的问题。
最后注册mbean是有3种行为的分别是
REGISTRATION_FAIL_ON_EXISTING mbean已经存在将会抛出InstanceAlreadyExistsException异常
REGISTRATION_IGNORE_EXISTING 忽视后来注册的mbean
REGISTRATION_REPLACE_EXISTING 覆盖掉之前注册的mbean
通过MBeanExporter的registrationBehaviorName属性进行设定
<bean id="mBeanExporter" ref="mbeanServer"/> <property name="assembler" ref="assembler"/> <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/> </bean>
同样用jconsole进行测试
要了解springjmx前还是要需要掌握jdk对jmx定义,jmx在维护application方法是有很好的应用的。
继续挖掘中
1 楼 SINCE1978 2011-11-22 为何我的spring-context-3.0.3.RELEASE.jar包相应目录下没有AttributesJmxAttributeSource类?
但是2.5.6版本的spring则有。难道spring在2版本和3版本之间变了吗?