[英]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();
...
這是我的JmxClient的javadoc 。 肯定有其他客戶這樣做。 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.