将Spring MBean导出到Tomcat的MBeanServer实例

时间:2013-02-28 21:09:42

标签: spring tomcat spring-mvc jmx

我正在使用我在tomcat服务器上部署的WAR文件(我在本地运行)中使用spring的JMX支持。但是,尽管遵循发布的指南,我无法将我的MBean专门部署到tomcat的MBeanServer实例。

我已经尝试了MBeanExporter和MBeanServerFactoryBean配置的一些变体,似乎没有任何工作。这是我目前的配置:

<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
    <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://localhost:6969/jmxrmi"/>
</bean> 

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
    <property name="server" ref="mbeanServer"/>
    <property name="beans">
        <map>
            <entry key="domain:name=notifier" value-ref="mBeanNotifier"/>
        </map>
    </property>
</bean>

<bean id="mBeanNotifier" class="com.sei.poc.jmx.mbeans.SimpleMBeanNotifier"/>

我在tomcat的配置中也包含了以下参数:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6969
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

我可以通过将localhost:6969输入JConsole手动连接到mbeanServer,但我只找到本地catalina MBean。当我深入研究这些MBean时,我甚至会找到对我的项目的引用,但不幸的是,我宣布的MBean无处可寻。

我已经尝试删除MBeanServerFactoryBean声明,希望导出器能够自己拿起tomcat的MBeanServer(没有运气)。我也尝试了不同的服务网址变体,但没有成功。

我应该注意到我能够将MBeans部署到我的本地MBeanServer并使用JConsole查看它们。

非常感谢任何有关问题的建议。

谢谢!

2 个答案:

答案 0 :(得分:2)

使用ServiceURL获取MBeanServerConnection时,返回的对象不是MBeanServer(即它不支持registerObject)。

尝试用:

替换你的mbeanServer bean
<bean id="mbeanServer" class="java.lang.management.ManagementFactory"
    lazy-init="false" factory-method="getPlatformMBeanServer">
</bean>

这将为您提供对平台MBeanServer的直接引用,这是您的JConsole连接到的平台。

答案 1 :(得分:0)

我能够解决我的问题。我将此测试编写为Spring MVC应用程序,因此具有几个级别的上下文,分解为不同的上下文文件。

问题很简单,持有MBeanExporter和MBean声明的上下文文件在我实际转到localhost:/之前没有被初始化,这促使servlet开始加载它的上下文文件。

连接浏览器后,MBean出现在JConsole中。