【发布时间】:2011-08-11 05:24:25
【问题描述】:
我一直在尝试让一个示例 JMX MXBean 在 Spring 配置的 web 应用程序中工作,但是当我连接 jconsole 时,MXBean 上的任何基本属性都显示为 UNDEFINED。
Java 接口/类:
public interface IJmxBean { // marker interface for spring config, see below
}
public interface MgmtMXBean { // lexical convention for MXBeans - mgmt interface
public int getAttribute();
}
public class Mgmt implements IJmxBean, MgmtMXBean { // actual JMX bean
private IServiceBean serviceBean; // service bean injected by Spring
private int attribute = 0;
@Override
public int getAttribute() {
if(serviceBean != null) {
attribute = serviceBean.getRequestedAttribute();
}
return attribute;
}
public void setServiceBean(IServiceBean serviceBean) {
this.serviceBean = serviceBean;
}
}
Spring JMX 配置:
<beans>
<context:component-scan base-package="...">
<context:include-filter type="assignable" expression="...IJmxBean" />
</context:component-scan>
<context:mbean-export />
</beans>
这是我目前所知道的:
元素正在正确地实例化名为“mgmt”的 bean。我已经登录了一个零参数的公共构造函数,表明它已被构造。
正在正确地自动检测并使用我的 Tomcat 6.0 容器注册 MgmtMXBean 接口。我可以使用 jconsole 连接到 Tomcat 中的 MBeanServer 并深入了解 Mgmt MXBean。
检查 MXBean 时,“属性”始终列为 UNDEFINED,但 jconsole 可以判断属性的正确类型。此外,在 jconsole 中点击“刷新”实际上并没有调用“属性”的 getter 方法——我已经登录了 getter 方法以指示它是否被调用(类似于有效的构造函数日志记录)并且我在日志中什么也看不到.
在这一点上,我不确定自己做错了什么。我尝试了很多方法,包括构建显式 Spring MBeanExporter 实例和手动注册 MXBean,但它要么导致 MBean/MXBean 未注册到 Tomcat 的 MBean 服务器,要么导致属性值为 UNDEFINED。
出于各种原因,我宁愿不必使用 Spring 的 @ManagedResource/@ManagedAttribute 注释。
我在 Spring 文档或 MBean/MXBean 规范中遗漏了什么?
【问题讨论】:
-
如果您有解决方案,那么您应该将其发布为答案并将其标记为已接受,而不是将其添加到问题中
-
@skaffman:我不知道该做什么,因为我在 stackoverflow.com 上看到了这两种方式。我已编辑、转发并将其标记为答案。感谢您为我澄清这一点!