JMX MXBean属性全部为UNDEFINED - Spring 3.0.x / Tomcat 6.0

时间:2011-04-22 20:57:53

标签: java spring tomcat jmx

我一直在尝试在Spring配置的webapp中使用示例JMX MXBean,但是当我连接jconsole时,MXBean上的任何基本属性都会显示为UNDEFINED。

Java接口/类:

public interface IJmxBean { // marker interface for spring config, see below
}

public interface MgmtMXBean { // lexical convention for MXBeans - mgmt interface
    public int getAttribute();
}

public class Mgmt implements IJmxBean, MgmtMXBean { // actual JMX bean
    private IServiceBean serviceBean;    // service bean injected by Spring
    private int attribute = 0;

    @Override
    public int getAttribute() {
        if(serviceBean != null) {
            attribute = serviceBean.getRequestedAttribute();
        }
        return attribute;
    }

    public void setServiceBean(IServiceBean serviceBean) { 
        this.serviceBean = serviceBean;
    }
}

Spring JMX config:

<beans>
    <context:component-scan base-package="...">
        <context:include-filter type="assignable" expression="...IJmxBean" />
    </context:component-scan>
    <context:mbean-export />
</beans>

这是我目前所知道的:

  • 该元素正确实例化名为“mgmt”的bean。我已经登录了一个零参数的公共构造函数,表明它已经被构造。

  • 正确地自动检测并注册了我的Tomcat 6.0容器的MgmtMXBean接口。我可以使用jconsole连接到Tomcat中的MBeanServer,并深入到Mgmt MXBean。

  • 检查MXBean时,“属性”始终列为UNDEFINED,但jconsole可以告诉属性的正确类型。此外,在jconsole中点击“刷新”实际上并没有调用“属性”的getter方法 - 我已经登录getter方法来指示它是否被调用(类似于有效的构造函数日志),我在日志中看不到任何内容

此时我不确定我做错了什么。我已经尝试了很多东西,包括构建一个显式的Spring MBeanExporter实例并手动注册MXBean,但它导致MBean / MXBean没有注册到Tomcat的MBean服务器或者属性值为UNDEFINED。

由于各种原因,我不想使用Spring的@ManagedResource / @ ManagedAttribute注释。

Spring文档或MBean / MXBean规范中是否存在某些内容?

2 个答案:

答案 0 :(得分:2)

解决问题:感谢Jon Stevens的提示(上图),我回过头来重新检查了我的代码和Spring配置文件:

getAttribute()方法中抛出异常是获得“不可用”以在JConsole中显示为属性值的可靠方法。就我而言:

  • 我使用的Spring JMX配置文件缺少根default-autowire=""元素的<beans>属性;
  • 上面的代码会检查是否serviceBean != null。显然我在stackoverflow.com上编写的代码比我的测试代码更好,因为我的测试代码没有检查。我也没有implements InitializingBean@PostConstruct检查serviceBean != null,就像我通常对我使用的几乎所有其他豆子一样;
  • 调用服务bean的代码在记录之前,所以我从未看到任何关于getter方法的日志消息;
  • JConsole不报告属性方法何时抛出异常;
  • NPE没有出现在Tomcat日志中。

一旦我用serviceBean == null解决了这个问题,一切都运转良好。无论如何,为了提供一个工作演示,还有+1给Jon,因为在Spring中有50种不同的方法来配置MBeans / MXBeans。

答案 1 :(得分:1)

我最近构建了一个基于Spring的webapp示例,它非常干净地为JMX提供了最新版本的Spring,Hibernate和Ehcache。

它包含基于EntityManager的访问和DAO访问(包括事务!)的示例。它还展示了如何进行基于注释的注入,以便否定必须使用Spring的bean的xml配置。甚至还有一个基于SpringMVC的示例servlet使用注释。基本上,这是一个基于Spring的版本,它运行在任何servlet引擎之上。

尚未记录,但我很快就会谈到这一点。看看配置文件和源代码,它应该非常清楚。

这背后的动机是我厌倦了所有疯狂的博客文章,用50种不同的方式进行设置,最后制作了一个人们可以使用的简单来源。它是在github上,所以随意分叉项目并随心所欲地做任何事情。

https://github.com/lookfirst/fallback