Mon*_*bal 8 java spring jvm jmx
遵循Spring文档以及Internet上的一些论坛的各种示例配置,我的应用程序上下文文件如下所示:
<beans>
<bean id="dH" class="abc.def.ghi.DH">
<constructor-arg>
<value>0</value>
</constructor-arg>
<property name="num" value="100"/>
</bean>
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="beans">
<map>
<entry key="bean:name=dH1" value-ref="dH"/>
</map>
</property>
</bean>
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
我在没有任何容器和普通JVM的情况下运行它.我可以通过JConsole连接到我的进程,但MBean没有出现.但是,以编程方式注册bean会成功公开它.
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
DH dh = new DH(0);
mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"));
Run Code Online (Sandbox Code Playgroud)
我尝试过使用Spring配置但没有成功.我认为bean没有注册到可以从ManagementFactory.getPlatformMBeanServer()访问的已经运行的MBean服务器.关于这个问题的任何想法?
Dan*_*ruz 12
除了使用... 定义MBeanServerFactory bean(正如Nicholas在他们的回答中所述)
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
...你需要告诉MBeanExporter管理什么:
如果bean实现了一个JMX管理接口,MBeanExporter可以通过其自动检测过程简单地向服务器注册MBean.
如果bean未实现其中一个JMX管理接口,则MBeanExporter将使用提供的MBeanInfoAssembler创建管理信息.
假设您的abc.def.ghi.DH类没有实现任何JMX接口,请尝试将您的MBeanExporteras 定义为:
<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>
Run Code Online (Sandbox Code Playgroud)
查看OpenJDK 7,更新2,构建21 DefaultMBeanServerInterceptor.java源,第898行创建一个DynamicMBean常规对象:
DynamicMBean mbean = Introspector.makeDynamicMBean(object);
Run Code Online (Sandbox Code Playgroud)
我没有调试它,但我打赌mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"))最终调用DefaultMBeanServerInterceptor.registerObject(),这会DynamicMBean为你创建一个并正确注册你的标准JavaBean属性的setter和getter.
以下是一些使用Spring Framework 3.0.5和Oracle HotSpot Java 1.6.0_24的测试文件.设置CLASSPATH环境变量后,只需运行javac *.java并java Main使用VisualVM(或类似应用程序)连接到正在运行的java应用程序即可查看已注册的MBean.
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>
Run Code Online (Sandbox Code Playgroud)
Test.java:
public class Test {
private String val = "";
public String getVal() {
return val;
}
public void setVal(String v) {
val = v;
}
}
Run Code Online (Sandbox Code Playgroud)
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) {}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12025 次 |
| 最近记录: |