Spring-JMX
Spring与JMX集成实例
JMX与Spring集成
Spring与JMX集成,实现方式灵活而且简单,主要体现在:
- 可以自动探测实现MBean接口的MBean对象,而且可以将一个普通的Spring Bean注册为MBean;
- 定制管理MBean的接口,根据需要暴露特定管理MBean的操作;
- 使用注解定义MBean管理接口;
- 可以实现对本地和远程MBean的代理。
利用Spring注册标准MBean
Spring提供的类org.springframework.jmx.export.MBeanExporter可自动探测实现MBean接口的MBean对象
标准MBean接口及实现类
HelloMBean接口:
package com.masi.jmx.spring;
//接口名必须以MBean结尾
public interface HelloMBean {
public String getName();
public void setName(String name);
public void printHello();
}
对应的MBean接口实现类Hello:
package com.masi.jmx.spring;
//类名必须和接口MBean前的内容相同,即类名+MBean必须等于接口名
public class Hello implements HelloMBean {
String name;
@Override
public void printHello() {
System.out.println("你好,"+name);
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
通过MBeanExporter自动扫描MBean
Spring上下文配置applicationContext-hello.xml如下所示:
<?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.xsd">
<bean id="MBeanTestDomain:myobj=helloStandardMBean" class="com.masi.jmx.spring.Hello">
<property name="name" value="Matt达蒙" />
</bean>
<bean id="mbServer_autodetect" class="org.springframework.jmx.export.MBeanExporter">
<property name="autodetectModeName">
<value>AUTODETECT_ALL</value>
</property>
</bean>
</beans>
注意:配置bean时,id必须是可创建ObjectName的domain: key1=value1, key2=value2[,...]
格式,否则创建MBeanExporter bean时报错”Unable to register MBean…Key properties cannot be empty”
上面配置中,MBeanExporter会查找本地MBean Server,指定的探测模式autodetectModeName为AUTODETECT_ALL,这也是MBeanExporter的默认值(这个属性完全可以省略,不用配置),无需手动向MBean Server进行注册,便能管理配置的MBean对象“MBeanTestDomain:myobj=helloStandardMBean”。
对于探测模式autodetectModeName属性,Spring提供了4个取值:
- AUTODETECT_NONE:不启用自动探测,需要手动向MBean Server进行注册,即通过MBeanExporter的beans属性进入注册;
- AUTODETECT_MBEAN:在当前IOC容器中进行查找MBean组件;
- AUTODETECT_ASSEMBLER:设置根据MBeanInfoAssembler的策略进行探测;
- AUTODETECT_ALL:自动探测,是AUTODETECT_MBEAN和AUTODETECT_ASSEMBLER的并集。
另外,Spring的MBeanExporter也提供了autodetect属性,取值为true和false,指定对MBean组件的探测行为。
利用Spring将普通Bean注册为MBean
对于一个普通的Spring Bean,也可以作为MBean来进行管理,Spring可以很好地支持。
创建普通Java类
package com.masi.jmx.spring;
public class HelloNoMBean
{
String name;
public void printHello() {
System.out.println("你好,"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
虽然HelloNoMBean类没有实现MBean管理接口,但可以通过spring提供的MBeanExporter类的beans属性直接注册为MBean。
通过MBeanExporter注册为MBean
Spring上下文配置applicationContext-hello.xml如下所示,MBeanExporter类的beans属性是个Map,key是MBean对象名称(即ObjectName)。
<?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.xsd">
<bean id="helloNoMBean" class="com.masi.jmx.spring.HelloNoMBean">
<property name="name" value="Matt马特" />
</bean>
<bean id="mbServer_beans" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="MBeanTest:name=helloNoMBean" value-ref="helloNoMBean" />
</map>
</property>
</bean>
</beans>
因为com.masi.jmx.spring.HelloNoMBean没有对应的MBean接口,所以默认情况下,该类中public的成员都会暴露出来,通过MBean Server可以管理。实际上,系统中MBean的某些属性或方法可能不需要暴露给外部进行管理,为了克服这种缺点,Spring提供了基于方法列表和接口定制的功能,可以将你所感兴趣的属性或方法暴露给外部管理。
加载Spring上下文测试
package com.masi.jmx.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-*.xml");
System.out.println("Spring context loaded!");
}
}
Run As->Java Application 运行,通过JConsole或Java VisualVM连接本地JVM进行MBean操作。
参考
上一篇 Hexo博客(20)更换域名
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: