簡體   English   中英

獲取自己MBean的所有已注冊實例

[英]Getting all registered instances of own MBean

我以這種方式注冊我的MBean應用程序:

ObjectName appName = new ObjectName("testpack.Application:name=myApp");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
mbs.registerMBean(this, appName);

接下來我試圖通過以下方式獲取所有注冊的實例:

for (ObjectInstance instance : mbs.queryMBeans(appName, null)) {
    System.out.println(instance.toString());
}

但即使我在同一個JVM上運行同一個應用程序的許多實例,這也只會打印一個實例。 我誤解了什么? 怎么做得好?


編輯

對不起,我誤解了MBean,JMX代理,服務器和客戶端等一些基本術語。 現在我現在我的應用程序必須是一個JMX客戶端並公開常見的MBean,以便在我的應用程序之間進行某種通信,並且可能在將來擁有自己的管理控制台。

@Gray指出我,我在問我想要的一些不同。 現在我從基礎知識學習JMX,而且有些方面很清楚。

編輯:

所以現在看來​​你正在談論在盒子上運行的多個JVM。 通過使用ManagementFactory.getPlatformMBeanServer()代碼,您正在訪問的豆在當前JVM。 如果您嘗試查看另一個JVM實例上的bean,那么您將不得不使用JMX客戶端連接到該遠程進程。 使用我的SimpleJMX包你可以做類似的事情:

JmxClient client = new JmxClient("localhost", somePortNumber);
Set<ObjectName> objectNameSet = client.getBeanNames();
...

這是我的JmxClientjavadoc 肯定有其他客戶這樣做。 Java 6+甚至可能內置它們。我知道有一些方法可以在Java 6+中以編程方式列出當前計算機上的JVM實例。 我的SimpleJMX包沒有那樣做。


我不確定我是否理解這個問題,但我認為你說你有myApp類的多個實例,但你只是在JMX中看到其中一個。

如果要通過JMX單獨查看它們,則必須為每個類創建唯一的ObjectName 通常,我們使用文件夾和bean名稱(有時甚至是System.identityHashCode(obj) )來獲取對象的每個實例的唯一名稱。

例如,我們有大量的計時器工廠bean。 它們的對象名稱如下:

mprew:00=timers,name=MailServerTimerFactory
mprew:00=timers,name=MysqlManagerTimerFactory
mprew:00=timers,name=PointsTimerFactory

它們都是同一個類,我們使用spring bean來專門識別它們。

暫無
暫無

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

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