2012-05-18 88 views
1

我在過去的幾年中瞭解了很多關於JMX的知識,併爲我的Web應用程序構建了一些相當漂亮的MBean。然而,我不確定我對一個非常基本的問題有一個很好的答案:Java監控:JMX與Servlets

爲什麼使用JMX而不是簡單的HTTP servlet?

我目前的Web應用程序提供了冗餘監視選項:我可以通過JMX與像JConsole這樣的客戶端訪問需要監視的數據,或者我可以通過servlet訪問XML格式的相同數據。我沒有看到使用一種方法而不是另一種方法的強有力的理由,但是servlet方法具有被簡單的http客戶機/ web瀏覽器讀取的主要優點。

我可以看到JMX對於非Web應用程序的Java應用程序如何非常有用,但是我看不出使用JMX作爲Web應用程序的任何優勢。

回答

7

爲什麼在簡單的HTTP servlet上使用JMX?

從我的角度來看,JMX是3個原因,更好:

  1. 它需要更少的代碼,使監測點。
  2. 它處理Java序列化的對象端到端,因此有更好的數據一致性。
  3. 它適用於不是基於servlet的程序(如您所述)。

JMX爲特定數據項提供了更簡單的接口。您當然可以在許多servlet中編寫相同的功能,但使用JMX更容易公開這些功能。

例如,如果您使用的是Spring,那麼您可以使用org.springframework.jmx.export註釋(@ManagedResource@ManagedAttribute等)來標記您的類。我還發布了我的SimpleJmx framework,因此只需使用獨立於Spring的幾個註釋便可輕鬆公開屬性和操作。例如:

@JmxResource(domainName = "j256", objectName = "lookupCache") 
public class LookupCache { 

    // this can also be done as @JmxAttributeMethod on the getter/setters 
    @JmxAttributeField(description = "Number of hits in the cache") 
    private int hitCount; 
    ... 

    @JmxOperation(description = "Flush the cache") 
    public void flushCache() { 
     ... 
    } 
} 

我有一個fully working example program看它是如何工作的。因此,您只需公開一個值或操作即可爲該類和每個屬性和/或方法添加註釋。使用SimpleJmx發佈它的代碼如下所示。 Spring與豆類相似:

// create a new server listening on port 8000 
JmxServer jmxServer = new JmxServer(8000); 
jmxServer.start(); 
// register our lookupCache object defined above 
jmxServer.register(lookupCache); 

要在servlet中獲得類似的功能將需要比註釋更多的代碼。也就是說,可能存在框架,它提供了我不知道的servlet域中類似的功能。

一些更多的注意事項:

  • 可能有更好的監測工具,神交HTTP/HTML,但也有一噸的分佈式JMX監控應用。可能是一個折騰。
  • 能夠以編程方式從JMX服務器獲得對象是一個優點,而不僅僅是來自servlet頁面的字符串。 SimpleJmx也支持簡單的JMX客戶端,儘管存在更好的客戶端。
  • 顯然,其他很多有價值的數據已經公佈由JVM默認:VM設置,線的詳細信息,內存信息,等等。
0

除了讀取值之外,JMX還可用於調用Management Beans上的方法。

例如,我們經常使用它來遠程強制Tomcat實例的JVM垃圾回收。

也因爲JMX是一個不同的端口,http/https可以限制通過防火牆在網絡層的訪問。 JMX也有內置的用戶名/密碼認證。

Web servlet必須實現它自己的訪問控制。

1

在我看來JMX是高估了,它可能會非常棘手配置。 如果你的應用程序已經是一個webcontainer我認爲你應該去一個簡單的servlet。

https://github.com/lorenzoongithub/nudge4j 這樣一個小小的servlet方法會給你所有的東西和更多。