java - JMX MXBean 属性全部未定义 - Spring 3.0.x/Tomcat 6.0

标签 java spring tomcat jmx

我一直在尝试让示例 JMX MXBean 在 Spring 配置的 Web 应用程序中工作,但是当我连接到 jconsole 时,MXBean 上的任何基本属性都显示为未定义。

Java 接口(interface)/类:

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。我已经登录了一个零参数公共(public)构造函数,表明它已构建。

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

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

此时我不确定自己做错了什么。我已经尝试了很多方法,包括构造一个显式的 Spring MBeanExporter 实例并手动注册 MXBean,但它要么导致 MBean/MXBean 未注册到 Tomcat 的 MBean 服务器,要么导致属性值为 UNDEFINED。

出于各种原因,我宁愿不必使用 Spring 的 @ManagedResource/@ManagedAttribute 注释。

我在 Spring 文档或 MBean/MXBean 规范中遗漏了什么吗?

最佳答案

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

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

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

一旦我用 serviceBean == null 解决了问题,一切都很完美。无论如何,为 Jon 提供工作演示 +1,因为实际上有 50 种不同的方法可以在 Spring 中配置 MBean/MXBeans。

关于java - JMX MXBean 属性全部未定义 - Spring 3.0.x/Tomcat 6.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759972/

相关文章:

spring - Spring Boot应用中如何定义拦截器的执行顺序?

java - Spring不同包下的两个同名 Controller

tomcat - 资源路径 [cxf-ehcache.xml] 无效

java - Apache httpd 日志中的大量 404 错误用于路径错误的静态文件

java - 打印多个 Vaadin 图表

java - 作为 Windows 服务运行时,如何增加 Tomcat 7 的内存?

java - 为字典构建数据结构

java - 类实例化没有发生

java - 共享数据和 session 的两个网络应用程序

java - Tomcat结合Intellij IDEA : no compiler available