@ManagedResource
@Component
public class MyBean {
Map<String, Something> map = new HashMap<String, Something>();
@ManagedAttribute
public Collection<Something> getFoo() {
return map.values();
}
}
在visualvm mbeans选项卡中,foo属性显示为“不可用”。为什么?
答案 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中看起来像这样:
答案 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的实例。