我正在尝试动态创建mbeans,它代表由我的应用程序中使用的框架创建的现有对象。这些对象存在于概念层次结构中,如文件夹层次结构。如果我只使用相关的文件夹路径创建mbeans,我最终会得到一个包含大量对象的大域。
如果我的JMX查看器(目前是VisualVM)可以看到与这些对象的文件夹层次结构相关联的域的“子文件夹”,那将是非常好的。
是否有某种方法可以指定mbean的domain或name属性,以便JMX查看器可以看到这些对象的层次结构,而不仅仅是一个大的平面列表?
答案 0 :(得分:12)
是否有某种方法可以指定mbean的domain或name属性,以便JMX查看器可以看到这些对象的层次结构,而不仅仅是一个大的平面列表?
是的。您可以在ObjectName
中指定其他域,也可以在名称的X=Y
部分之前将文件夹指定为name=...
。例如:
... = new ObjectName("foo.com:00=folder,01=subFolder,name=SomeBean");
这将创建SomeBean
托管的JMX bean。它将显示在foo.com
顶级域文件夹下。 foo.com
内部将是一个名为folder
的文件夹,其中包含一个名为subFolder
的子文件夹。请参阅jconsole中的以下图片:
右边可以看到bean的完整ObjectName
。我使用00=folder,01=subfolder
文件夹名称约定。我不确定数字是否完全可见,但订单是关键的。 00
名称(在此示例中为folder
)是域下的文件夹。 01
名称是00文件夹内的文件夹(在此示例中为subfolder
)。子文件夹的数量没有限制。
如果您想要与folder
处于同一级别的其他文件夹,那么您只需使用其他00
名称:
... = new ObjectName("foo.com:00=folder2,name=AnotherBean");
顺便说一句,你可能想看看我的SimpleJMX
package,它会为你完成所有JMX繁重的工作。这是example program for your enjoyment。使用SimpleJMX,您可以使用folderNames
注释字段指定文件夹:
@JmxResource(domainName = "j256.com", folderNames = { "counters" },
beanName = "RuntimeCounter")
这会生成ObjectName
的{{1}}。