我已经通过这种方式注册了我的 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 中的 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 来专门识别它们。
关于java - 获取自己的 MBean 的所有已注册实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051057/