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

标签 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,有些方面已经很清楚了。

最佳答案

编辑:

所以现在看来​​您正在谈论在一个机器上运行的多个 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/

相关文章:

Java 字符串变量在运行时损坏

java - 是否可以通过编程方式启用远程 jmx 监控?

java - 附加到远程(非本地)VM

java - 如何使用注释 @MBean 指定 mbean 的名称

java - JProgressBar 不更新

java - 将 Eclipse Kepler SR1 升级到 SR2 时出错?

java - 在 Java 中创建 MBean

java - Spring JMX - 将包中的类注册为 MBean

java - 使用已经唯一的整数生成哈希码

java - 使用 Java Mission Profiler 监控远程 JVM