2011-04-22 22 views
1

我一直在試圖獲得一個示例JMX MXBean,它在Spring配置的webapp中工作,但MXBean上的任何基本屬性都會在我連接時出現UNDEFINED與jconsole。JMX MXBean屬性全部未定義 - Spring 3.0.x/Tomcat 6.0

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; 
    } 
} 

春JMX配置:

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

這是我目前所知:

  • 元素被正確實例化一個名爲豆「 MGMT」。我已經登錄了一個零參數的公共構造函數,它表示它正在構建。

  • 正確地自動檢測並註冊與我的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註解。

有沒有辦法,我錯過在春節文檔或MBean的/ MXBean的規格的東西嗎?

+0

如果你已經有了一個解決方案,那麼你應該張貼它作爲一個答案,標記爲接受,而不是將它添加到問題 – skaffman 2011-05-24 16:38:59

+0

@skaffman:我不知道該做的,因爲我已經看到了它兩種方式在stackoverflow.com上。我已經編輯,重新發布,並將其標記爲答案。感謝您澄清對我來說! – BobG 2011-05-24 18:07:21

回答

2

解決的問題:由於由喬恩·史蒂文斯(上圖)提示,我回去,並重新檢查了我的代碼和Spring配置文件:

getAttribute()方法拋出一個例外是一個確定的方法是讓「不可用」顯示爲JConsole中的屬性值。在我的情況:

    我用的是少了點根 <beans>元素的 default-autowire=""屬性
  • Spring的JMX配置文件;
  • 上述檢查給出的代碼,以查看是否serviceBean != null。顯然我在我的測試代碼上寫了比stackoverflow.com更好的代碼,因爲我的測試代碼沒有檢查。我也沒有有implements InitializingBean@PostConstruct檢查serviceBean != null像我一般上幾乎所有的豆類我使用;
  • 調用服務bean中的代碼是記錄之前,所以我從來沒有看到正在進入有關getter方法的任何日誌消息;
  • 當屬性方法拋出異常時,JConsole不會報告;
  • NPE沒有出現在Tomcat日誌中。

一旦我用serviceBean == null解決了問題,一切正常。無論如何,Jon爲了提供工作演示而+1,因爲在Spring中實際上有50種不同的方式來配置MBeans/MXBeans。

+0

感謝BobG。很高興我能幫上忙。 – 2011-05-28 15:45:48

1

我最近構建了一個基於Spring的示例web應用程序,該應用程序非常乾淨地爲最新版本的Spring,Hibernate和Ehcache啓用JMX。

它有兩個EntityManager的基於角色的訪問和DAO訪問的例子(包括交易!)。它還顯示瞭如何執行基於註釋的注入,以否定必須使用Spring的xml config for beans。甚至有一個基於SpringMVC的示例servlet使用註釋。基本上,這是一個在任何servlet引擎上運行的基於Spring的相當強大的應用服務器版本。

它沒有記載,但我很快就會到。看看配置文件和源代碼,它應該很清楚。

這背後的動機是我厭倦了所有瘋狂的博客文章,有50種不同的方式來設置,最後做出了一個簡單的來源,人們可以從中工作。它已經在github上了,所以你可以自由地分發項目,並隨你做任何你想做的事情。

https://github.com/lookfirst/fallback