1、Spring与JMX集成Spring与JMX集成 Spring与JMX集成,实现方式灵活而且简单,主要体现在:1、可以自动探测实现MBean接口的MBean对象,而且可以将一个普通的Spring Bean注册为MBean;2、定制管理MBean的接口,根据需要暴露特定管理MBean的操作;3、使用注解定义MBean管理接口;4、可以实现对本地和远程MBean的代理。 标准MBean管理对于实现标准MBean接口MBean资源,在Spring中可以设置不同的探测模式,主要是通过MBeanExporter来实现。例如,定义MBean管理接口:java view plain copy package
2、 org.shirdrn.spring.jmx.autodetect; public interface MyObjectMBean public long getId(); public void setId(long id); public String getName(); public void setName(String name); public String show(); 对应的MBean实现,如下所示:java view plain copy package org.shirdrn.spring.jmx.autodetect; import org.apache.log4j
3、.Logger; public class MyObject implements MyObjectMBean private static final Logger LOG = Logger.getLogger(MyObject.class); private long id; private String name; public MyObject() super(); public MyObject(long id, String name) super(); this.id = id; this.name = name; public long getId() return id; p
4、ublic void setId(long id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public String show() StringBuffer sb = new StringBuffer().append(id=).append(id).append( , name=).append(name); LOG.info(show()= + sb.toString(); return sb.toString(); 上面是一
5、个标准MBean的实现,可以使用JavaSE 6平台的JMX服务来管理,但是在Spring集成的环境下,也可以重用这些MBean实现,例如下面是一个典型的配置:xhtml view plain copy <?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.or
6、g/schema/beans http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd> <bean id=mbServer class=org.springframework.jmx.export.MBeanExporter> <property name=autodetectModeName> <value>AUTODETECT_ALL</value> </property> </bean> <bean name=mydomain:myo
7、bj=MyObjectMBean class=org.shirdrn.spring.jmx.autodetect.MyObject> <property name=id> <value>90000000001</value> </property> <property name=name> <value>shirdrn</value> </property> </bean> </beans> 上面配置中,MBeanExporter会查找本地MBean Server,指定
8、的探测模式autodetectModeName为AUTODETECT_ALL,这也是MBeanExporter的默认值(这个属性完全可以省略,不用配置),无需手动向MBean Server进行注册,便能管理配置的MBean对象“mydomain:myobj=MyObjectMBean”。对于探测模式autodetectModeName属性,Spring提供了4个取值:AUTODETECT_NONE 不启用自动探测,需要手动向MBean Server进行注册,即通过MBeanExporter的beans属性进入注册;AUTODETECT_MBEAN 在当前IOC容器中进行查找MBean组件;AU
9、TODETECT_ASSEMBLER 设置根据MBeanInfoAssembler的策略进行探测;AUTODETECT_ALL 自动探测,是AUTODETECT_MBEAN和AUTODETECT_ASSEMBLER的并集。另外,Spring的MBeanExporter也提供了autodetect属性,取值为true和false,指定对MBean组件的探测行为。 普通Spring Bean管理对于一个普通的Spring Bean,也可以作为MBean来进行管理,Spring可以很好地支持。如下面一个普通的Java类:java view plain copy package org.shirdrn
10、.spring.jmx; import org.apache.log4j.Logger; public class MyJavaObject private static final Logger LOG = Logger.getLogger(MyJavaObject.class); private long id; private String name; public MyJavaObject() super(); public MyJavaObject(long id, String name) super(); this.id = id; this.name = name; publi
11、c long getId() return id; public void setId(long id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public String show() StringBuffer sb = new StringBuffer().append(id=).append(id).append( , name=).append(name); LOG.info(show()= + sb.toString();
12、 return sb.toString(); 它并没有实现MBean管理接口,可以通过MBeanExporter的beans属性进行注册,配置如下所示:java view plain copy <?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/sch
13、ema/beans http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd> <bean id=mbServer class=org.springframework.jmx.export.MBeanExporter> <property name=beans> <map> <entry key=mydomain:myjavaobj=MyJavaObject value-ref=myobj/> </map> </property> </bea
14、n> <bean name=myobj class=org.shirdrn.spring.jmx.MyJavaObject> <property name=id> <value>90000000001</value> </property> <property name=name> <value>shirdrn</value> </property> </bean> </beans> 因为org.shirdrn.spring.jmx.MyJavaObject
15、没有对应的MBean接口,所以默认情况下,该类中public的成员都会暴露出来,通过MBean Server可以管理。实际上,系统中MBean的某些属性或方法可能不需要暴露给外部进行管理,为了克服这种缺点,Spring提供了基于方法列表和接口定制的功能,可以将你所感兴趣的属性或方法暴露给外部管理。 基于方法列表和接口定制的MBean管理对于上述普通的Java类MyJavaObject,可以通过定制接口和方法列表,来暴露MBean属性或方法。例如,一个方法列表,可以在进行配置的时候指定,如下所示:xhtml view plain copy <bean id=assembler class=
16、org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler> <property name=managedMethods value=setId,setName,show /> </bean> 上面通过org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler来进行方法列表的设置。而对于接口,可以定义一个接口,如下所示:java view plain copy package org.s
17、hirdrn.spring.jmx.selected.interfaces; public interface SelectedMethodsInterface public long setId(long id); public void setName(String name); public void show(); Spring配置,如下所示:xhtml view plain copy <bean id=assembler class=org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler
18、> <property name=managedInterfaces> <list> <value>org.shirdrn.spring.jmx.selected.interfaces.SelectedMethodsInterface</value> </list> </property> </bean> 上面通过org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler,可以设置一个接口列表,来管理MBean暴露的接
19、口。对于上面两种方式,都得到一个assembler实例,需要将其注入到org.springframework.jmx.export.MBeanExporter中,如下所示:xhtml view plain copy <bean id=exporter class=org.springframework.jmx.export.MBeanExporter> <property name=beans> <map> <entry key=mydomain:javaObj=MyJavaObject value-ref=javaObject /> </
20、map> </property> <property name=assembler ref=assembler /> </bean> 基于注解的MBean管理对于一个普通的Java类,作为MBean需要被管理,可以通过注解指定要暴露的属性和方法,示例如下:java view plain copy package org.shirdrn.spring.jmx.annotation; import org.apache.log4j.Logger; import org.springframework.jmx.export.annotation.Manage
21、dAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; ManagedResource(objectName = annojmx:myjao=AnnotationObject, description = MyJavaAnnotationObject) public class MyJavaAnnotationObject private static final
22、 Logger LOG = Logger.getLogger(MyJavaAnnotationObject.class); private long id; private String name; public MyJavaAnnotationObject() super(); public MyJavaAnnotationObject(long id, String name) super(); this.id = id; this.name = name; ManagedAttribute public long getId() return id; public void setId(
23、long id) this.id = id; public String getName() return name; ManagedAttribute public void setName(String name) this.name = name; ManagedOperation public String show() StringBuffer sb = new StringBuffer().append(id=).append(id).append( , name=).append(name); LOG.info(show()= + sb.toString(); return sb
24、.toString(); 上面ManagedResource表示指定该类的实例作为MBean注册到MBean Server中,然后可以通过对属性和方法分别使用ManagedAttribute和ManagedOperation来指定暴露的属性和方法。有关这些注解的详细内容,可以查阅相关文档。下面是一个基本的配置内容:xhtml view plain copy <?xml version=1.0 encoding=UTF-8?> <beans xmlns=http:/www.springframework.org/schema/beans xmlns:xsi=http:/www.
25、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> <bean id=exporter class=org.springframework.jmx.export.MBeanExporter> <property nam
26、e=assembler ref=assembler /> <property name=namingStrategy ref=namingStrategy /> </bean> <bean id=assembler class=org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler> <property name=attributeSource ref=jmxas /> </bean> <bean id=namingStrategy class
27、=org.springframework.jmx.export.naming.MetadataNamingStrategy> <property name=attributeSource ref=jmxas /> </bean> <bean id=jmxas class=org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource /> <bean id=javaObj class=org.shirdrn.spring.jmx.annotation.MyJavaAnn
28、otationObject> <property name=id value=201122121200 /> <property name=name value=shirdrn /> </bean> </beans> 上面使用了Spring的MBeanExporter,可以看到,Spring配置内容相对较多。Spring还提供两种简化配置的方式,一种是,提供了org.springframework.jmx.export.annotation.AnnotationMBeanExporter,可以将上述配置大大简化,等价的配置如下所示:xhtm
29、l view plain copy <?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.springframew
30、ork.org/schema/beans/spring-beans-2.5.xsd> <bean class=org.springframework.jmx.export.annotation.AnnotationMBeanExporter/> <bean name=myAnnoObject class=org.shirdrn.spring.jmx.annotation.MyJavaAnnotationObject> <property name=id value=201122121200 /> <property name=name value
31、=shirdrn /> </bean> </beans> 另一种是,提供了<context:mbean-export />标签,更加简洁,等价的配置如下所示:xhtml view plain copy <?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:context=http:/www.springframework.org/schema/context xsi:schemaLocation=http:/www.springframework.org/schema/beans http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd http:/www.springframework.org/schema/context http:/www.springframework.org/sc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1