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

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


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

最佳答案

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();
}


使Something实现SomethingMBean:

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


现在,在您的实际MBean(带有@MXBean注释的MBean)中,您可以定义如下方法:

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


Java6 + MBeanServer将在运行时自动生成CompositeDataTypes和实例。作为一种简单的诊断工具,我经常将JVM的ThreadMXBean换成一个包装好的JVM,以使用此技术公开ThreadInfo。 (有关示例,请参见ExtendedThreadManager)在JConsole中如下所示:

09-05 16:15