0

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

4

1 回答 1

2

编辑:

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

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

这是我的 JmxClient 的 javadocs。当然还有其他客户这样做。Java 6+ 甚至可能内置了它们。我知道有一些方法可以在 Java 6+ 中以编程方式列出当前计算机上的 JVM 实例。我的 SimpleJMX 包不这样做。


我不确定我是否理解这个问题,但我认为您是在说您的myApp课程有多个实例,但您在 JMX 中只看到其中一个。

ObjectName如果您想通过 JMX 分别查看它们,您将不得不为每个类创建唯一的。通常,我们使用文件夹和 bean 名称(有时甚至是System.identityHashCode(obj))来为对象的每个实例获取唯一的名称。

例如,我们有大量的计时器工厂 bean。它们的对象名称如下:

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

它们都是同一个类,我们使用 spring bean 来专门识别它们。

于 2012-06-15T13:30:21.820 回答