获取自己MBean的所有已注册实例

时间:2012-06-15 12:55:10

标签: java jmx mbeans

我以这种方式注册我的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,而且有些方面很清楚。

1 个答案:

答案 0 :(得分:2)

修改

所以现在看来​​你在谈论在一个盒子上运行的多个JVM。通过使用ManagementFactory.getPlatformMBeanServer()代码,您只能访问当前JVM 中的bean 。如果您尝试查看另一个JVM实例上的bean,那么您将不得不使用JMX客户端连接到该远程进程。使用我的SimpleJMX包,您可以执行以下操作:

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

以下是javadocs for my JmxClient。肯定有其他客户这样做。 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来专门识别它们。