从ManagedResource bean公开Collection <something>?</something>

时间:2012-12-13 08:41:07

标签: java spring jmx mbeans spring-jmx

@ManagedResource
@Component
public class MyBean {
   Map<String, Something> map = new HashMap<String, Something>();

   @ManagedAttribute
   public Collection<Something> getFoo() {
       return map.values();
   }
}

在visualvm mbeans选项卡中,foo属性显示为“不可用”。为什么?

3 个答案:

答案 0 :(得分:3)

MXBean解决方案是大部分时间都可以使用的方法,尽管比生成CompositeDataSupport实例更简单。假设你的课程是:

public class Something {
  private String foo;
  private Date date;
  <Insert Ctor here>
  public String getFoo() {
    return foo;
  }
  public Date getDate() {
    return date;
  }
}

您可以按如下方式创建MBean接口:

public interface SomethingMBean {  // same package please...
  public String getFoo();
  public Date getDate();
}

Make Something实现SomethingMBean:

public class Something implements SomethingMBean {
   .....
}

现在在你的实际MBean(带注释的@MXBean)中,你可以定义一个这样的方法:

   public List<SomethingMBean> getSomethings() {
      .....
   }

Java6 + MBeanServer将在运行时自动生成CompositeDataTypes和实例。作为一个简单的诊断工具,我经常将JVM的ThreadMXBean替换为使用此技术公开ThreadInfo的包装的ExtendedThreadManager。 (有关示例,请参阅{{3}})在JConsole中看起来像这样:

ThreadInfos exposed in JConsole

答案 1 :(得分:1)

如果Something是JDK的一部分(例如String),它将起作用。

如果Something是自定义类,VisualVM将不会知道它;因此'不可用'。

如果您转到operations标签并点击getFoo(),即可看到更多信息。

我还没试过,但我相信你可以用

添加东西到VisualVM的类路径
jvisualvm -cp:a /path/to/Something/top/level/package

(或jar)。

然后,它可能会起作用;尽管如此,Something(及其字段)必须是Serializable

答案 2 :(得分:0)

我用@MXBean注释bean然后返回CompositeData []创建CompositeDataSupport的实例。