【问题标题】:JMX MXBean Attributes all UNDEFINED - Spring 3.0.x/Tomcat 6.0JMX MXBean 属性全部未定义 - Spring 3.0.x/Tomcat 6.0
【发布时间】:2011-08-11 05:24:25
【问题描述】:

我一直在尝试让一个示例 JMX MXBean 在 Spring 配置的 web 应用程序中工作,但是当我连接 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 配置:

<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 规范中遗漏了什么?

【问题讨论】:

  • 如果您有解决方案,那么您应该将其发布为答案并将其标记为已接受,而不是将其添加到问题中
  • @skaffman:我不知道该做什么,因为我在 stackoverflow.com 上看到了这两种方式。我已编辑、转发并将其标记为答案。感谢您为我澄清这一点!

标签: java spring tomcat jmx


【解决方案1】:

我最近构建了一个基于 Spring 的示例 web 应用程序,它非常干净地为最新版本的 Spring、Hibernate 和 Ehcache 启用了 JMX。

它具有基于 EntityManager 的访问和 DAO 访问(包括事务!)的示例。它还展示了如何进行基于注解的注入,以避免必须为 bean 使用 Spring 的 xml 配置。甚至还有一个使用注释的基于 SpringMVC 的示例 servlet。基本上,这是在任何 servlet 引擎之上运行的相当强大的应用服务器的基于 Spring 的版本。

它还没有记录,但我会尽快解决。看一下配置文件和源码应该就很清楚了。

这背后的动机是,我厌倦了所有疯狂的博客帖子,这些帖子有 50 种不同的设置方式,最后制作了一个可供人们使用的简单来源。它在 github 上,所以请随时 fork 项目并用它做任何你想做的事情。

https://github.com/lookfirst/fallback

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢鲍勃。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多