簡體   English   中英

JMX MXBean將所有屬性均未定義-Spring 3.0.x / Tomcat 6.0

[英]JMX MXBean Attributes all UNDEFINED - Spring 3.0.x/Tomcat 6.0

我一直在嘗試讓示例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服務器上注冊或Attribute值為UNDEFINED。

由於各種原因,我不希望不必使用Spring的@ ManagedResource / @ ManagedAttribute批注。

Spring文檔或MBean / MXBean規范中是否缺少某些內容?

已解決的問題:感謝喬恩·史蒂文斯(Jon Stevens)的提示(以上),我回過頭來重新檢查了我的代碼和Spring配置文件:

getAttribute()方法中引發異常是確保“不可用”顯示為JConsole中的屬性值的肯定方法。 就我而言:

  • 我使用的Spring JMX配置文件在根<beans>元素上缺少default-autowire=""屬性;
  • 上面提供的代碼檢查是否有serviceBean != null 顯然,我在stackoverflow.com上編寫的代碼比在我的測試代碼中寫的更好,因為我的測試代碼並未對此進行檢查。 我也沒有implements InitializingBean@PostConstruct來檢查serviceBean != null就像我通常在使用的幾乎所有其他bean上一樣。
  • 調用服務Bean的代碼在記錄之前,因此我從未看到有關輸入getter方法的任何日志消息。
  • 當屬性方法拋出異常時,JConsole不會報告。
  • NPE沒有顯示在Tomcat日志中。

一旦解決了serviceBean == null的問題,一切就可以正常工作。 無論如何,請Jon +1以提供有效的演示,因為實際上有50種不同的方法可以在Spring中配置MBean / MXBean。

我最近構建了一個基於Spring的示例Web應用程序,該應用程序非常干凈地為JMX啟用了Spring,Hibernate和Ehcache的最新版本。

它具有基於EntityManager和DAO訪問(包括事務!)的示例。 它還顯示了如何進行基於注解的注入,以便不必為豆使用Spring的xml配置。 甚至還有一個使用注釋的基於SpringMVC的示例servlet。 基本上,這是運行在任何servlet引擎之上的功能強大的應用程序服務器的基於Spring的版本。

它尚未記錄,但我會盡快解決。 看一下配置文件和源代碼,它應該很清楚。

其背后的動機是,我厭倦了用50種不同方式進行設置的所有瘋狂博客文章,並最終使人們可以使用一個簡單的來源。 它位於github上,因此可以隨意分叉該項目並對其進行任何操作。

https://github.com/lookfirst/fallback

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM