【问题标题】: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 中是这样的:
【解决方案2】:
如果Something 是 JDK 的一部分(例如 String),它将起作用。
如果Something 是自定义类,VisualVM 不会知道;因此“不可用”。
您可以转到operations 标签并单击getFoo() 来查看更多信息。
我没试过,但我相信你可以用
向VisualVM的类路径添加东西
jvisualvm -cp:a /path/to/Something/top/level/package
(或罐子)。
然后,它可能会起作用;尽管如此,Something(及其字段)仍需要为Serializable。
【解决方案3】:
我用 @MXBean 注释了 bean,然后返回 CompositeData[] 创建 CompositeDataSupport 的实例。