【问题标题】:Exposing Collection<Something> from ManagedResource bean?从 ManagedResource bean 中暴露 Collection<Something>?
【发布时间】:2012-12-13 08:41:06
【问题描述】:
@ManagedResource
@Component
public class MyBean {
   Map<String, Something> map = new HashMap<String, Something>();

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

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

【问题讨论】:

    标签: java spring jmx mbeans spring-jmx


    【解决方案1】:

    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 替换为一个封装的,该封装的可以暴露 ThreadInfos。 (示例见ExtendedThreadManager)在JConsole 中是这样的:

    【讨论】:

    • 接口名是否必须以MBean结尾?
    【解决方案2】:

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

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

    您可以转到operations 标签并单击getFoo() 来查看更多信息。

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

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

    (或罐子)。

    然后,它可能会起作用;尽管如此,Something(及其字段)仍需要为Serializable

    【讨论】:

    • 那么如何显示不属于 JDK 的内容?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多