除了使用...,还可以定义一个MBeanServerFactory bean(如Nicholas在他们的答案中所指出的)...
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
...你需要告诉MBeanExporter要管理什么:
如果一个bean实现了JMX管理接口之一,MBeanExporter可以通过其自动检测过程将MBean注册到服务器上。
如果一个bean没有实现JMX管理接口之一,则MBeanExporter将使用提供的MBeanInfoAssembler创建管理信息。
假设你的abc.def.ghi.DH
类没有实现任何JMX接口,请尝试将MBeanExporter
定义为:
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getNum</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=dH1" value-ref="dH"/>
</map>
</property>
</bean>
观察OpenJDK 7,更新2,构建21的源代码
DefaultMBeanServerInterceptor.java
,第898行创建了一个常规对象的
DynamicMBean
。请注意保留HTML标记。
DynamicMBean mbean = Introspector.makeDynamicMBean(object)
我还没有调试过,但我敢打赌 mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"))
最终会调用 DefaultMBeanServerInterceptor.registerObject()
,它会为您创建一个 DynamicMBean
并正确注册您的标准 JavaBean
属性的设置器和获取器。
以下是一些使用 Spring Framework 3.0.5 和 Oracle HotSpot Java 1.6.0_24 工作的测试文件。在设置了您的 CLASSPATH
环境变量后,只需运行 javac *.java
和 java Main
,并使用 VisualVM(或类似应用程序)连接到正在运行的 Java 应用程序,以查看已注册的 MBeans。
ac.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"
default-lazy-init="true"
>
<bean id="test" class="Test" />
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getVal</value>
<value>setVal</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=Test" value-ref="test"/>
</map>
</property>
</bean>
</beans>
Test.java:
public class Test {
private String val = "";
public String getVal() {
return val;
}
public void setVal(String v) {
val = v;
}
}
Main.java:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(final String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("ac.xml");
try {
Thread.sleep(1000 * 60 * 5);
} catch (final Throwable t) {}
}
}