2012-06-21 27 views
0

我必須通過mbean訪問某些應用程序,以便可以更改其應用程序屬性。現在,我認爲這可以通過兩種方式來完成:使用JMX註冊和更新應用程序屬性

  1. 首先,無論是我要求的應用程序的開發者註冊在我的MBean將訪問一個ArrayList中的所有應用程序的性能。其次,如果還有其他方式,開發人員只需要註冊可編輯的屬性,而我的mbean仍然可以訪問可讀/可編輯(r/w)應用程序屬性。

現在,因爲我不知道這些應用程序屬性存儲在JVM中,有沒有實現我的第二點,使得MBean將只需要訪問該對象的一種方法,它會得到所有的應用程序屬性?

+0

請儘量表達更好的問題。很難閱讀和理解大量未格式化的文字... – JuanZe

+0

「財產」是什麼意思?你說的系統屬性或對象字段或別的東西? – Gray

回答

0

我也覺得你應該更清楚地表達自己。
從我的理解 - 爲什麼不提供查詢遠程應用程序的方法,並獲取有關所有屬性的信息,以及它們是隻讀,只寫還是RW?
這樣,屬性列表將不會在客戶端應用程序的源代碼中提及 - 也許您應該讓客戶端應用程序的用戶看到屬性列表,並讓他編輯他可以編輯的屬性,並阻止他從編輯他不能的屬性。

+0

我爲我的問題的凌亂外觀表示歉意...我會逐句寫它.. – user1472629

+0

@zaske ...從哪裏可以獲取所有應用程序屬性? – user1472629

1

好像你在這裏有一些矛盾的要求。

  1. 您想更改應用程序中的最小代碼。
  2. 您希望成爲所有屬性讀取和/或寫入的原因。
  3. 你可能會也可能不會在談論System.getProperty(...)。如果沒有,那麼我想你只是在談論各種物體的領域。

有(至少)兩種方法來做到這一點。如果不知道現在如何從源代碼導出mbeans,我無法根據您的具體配置調整我的答案。我的回答將反而顯示你如何使用我的SimpleJMX package來揭露你的屬性。

如果你在談論System.getProperty(...)那麼你可以寫一個JMX MBean的,可以查詢任何財產和返回值:

@JmxOperation(description = "Query for property") 
public String queryForProperty(String name) { 
    return System.getProperty(name); 
} 

相反,如果你需要的字段從某些對象列表導出,然後您將不得不爲每個要導出的字段添加註釋,否則您將不得不編寫通過委派導出字段的bean。我看不到任何簡單的方法,並且我知道沒有任何軟件包可以輕鬆地爲您輸出一系列對象,而不需要關於要輸出什麼和如何輸出的信息。

使用SimpleJMX,您可以通過註釋無論是現場還是GET方法導出字段:

@JmxAttributeField(description = "Number of hits in the cache") 
private int hitCount; 
... 

// this can also be specified as @JmxAttributeMethod on the getter/setter methods 
@JmxAttributeMethod(description = "Number of misses in the cache") 
private int getMissCount() { 
    return missCount; 
} 

@JmxAttributeField支持isWritable = true允許值通過JMX進行設置。您也可以使用@JmxAttributeMethod註釋setter以使其可寫。

如果你不想註釋添加到每個類的,那麼你將不得不寫某種JMX容器類的,通過委託出口值:

public class JmxPublisher { 
    private Class1 object1; 
    private Class2 object2; 
    ... 
    public JmxPublisher(Class1 object1, Class2 object2) { 
     this.object1 = object1; 
     this.object2 = object2; 
     ... 
    } 

    @JmxAttributeMethod(description = "Number of hits in the cache") 
    public int getClass1HitCount() { 
     return object1.getHitCount(); 
    } 
    @JmxAttributeMethod(description = "Shutdown the background thread") 
    public void setClass2Shutdown(boolean shutdown) { 
     return object2.setShutdown(shutdown); 
    } 
    ... 
} 
+0

: - 謝謝grey..but正是我問的是什麼;你可以建議我任何其他方式訪問一個已有的Java應用程序的所有Java應用程序屬性與最小的源代碼更改。 – user1472629

+0

什麼是「java應用程序屬性」?我試圖用我的答案做到這一點。 – Gray

+0

@Gray喜歡簡單的JMX實現。 –

相關問題