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

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

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

4

3 回答 3

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 )在 JConsole 中如下所示:

JConsole 中公开的 ThreadInfos

于 2012-12-13T14:24:02.313 回答
1

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

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

如果您转到operations选项卡并单击,您可以查看更多信息getFoo()

我没有尝试过,但我相信你可以添加东西到 VisualVM 的类路径

jvisualvm -cp:a /path/to/Something/top/level/package

(或罐子)。

然后,它可能会起作用;即便如此,Something(及其领域)也需要是Serializable.

于 2012-12-13T09:29:50.393 回答
0

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

于 2012-12-13T14:07:21.133 回答