我以这种方式注册我的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来在我的应用程序之间进行某种通信,并且可能在将来拥有自己的管理控制台。
答案 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来专门识别它们。