当前位置 : 首页 » 文章分类 :  开发  »  Spring-JMX

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)更换域名

下一篇 Hexo博客(19)使用七牛云图床

阅读
973
阅读预计4分钟
创建日期 2017-12-19
修改日期 2018-06-11
类别
百度推荐