是否可以创建jmx子域?

时间:2013-12-18 22:38:59

标签: java jmx

我正在尝试动态创建mbeans,它代表由我的应用程序中使用的框架创建的现有对象。这些对象存在于概念层次结构中,如文件夹层次结构。如果我只使用相关的文件夹路径创建mbeans,我最终会得到一个包含大量对象的大域。

如果我的JMX查看器(目前是VisualVM)可以看到与这些对象的文件夹层次结构相关联的域的“子文件夹”,那将是非常好的。

是否有某种方法可以指定mbean的domain或name属性,以便JMX查看器可以看到这些对象的层次结构,而不仅仅是一个大的平面列表?

1 个答案:

答案 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中的以下图片:

enter image description here

右边可以看到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}}。