I am also seeing issues accessing composite properties of MemoryMXBean via Spring's JMX proxy.
From the injected proxy MemoryMXBean memBean, I can successfully access memBean.getObjectPendingFinalizationCount(), but if I try to access memBean.getHeapMemoryUsage().getCommitted() I get the stacktrace seen below.
I can verify the MBean exists by using JConsole and if I use memBean=ManagementFactory.getMemoryMXBean() everything works fine.
Are there limitations around using Spring to create a proxy and accessing Composite data, or is there something else I am missing or doing incorrectly?
Stacktrace
Code:
java.lang.ClassCastException: javax.management.openmbean.CompositeDataSupport
at $Proxy1.getHeapMemoryUsage(Unknown Source)
at com.foo.web.controller.JmxController.handleRequestInternal(JmxController.java:21)
...
Beans
PHP Code:
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true"></property>
</bean>
<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
<property name="objectName" value="java.lang:type=Memory"/>
<property name="proxyInterface" value="java.lang.management.MemoryMXBean"/>
</bean>
<bean name="jmx" class="com.foo.web.controller.JmxController" >
<property name="memBean" ref="proxy"></property>
</bean>
Controller
Code:
public class JmxController extends ParameterizableViewController{
private java.lang.management.MemoryMXBean memBean;
public void setMemBean(java.lang.management.MemoryMXBean memBean) {
this.memBean = memBean;
}
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
MemoryUsage memUsage = memBean.getNonHeapMemoryUsage();
return new ModelAndView(getViewName(),"test",Long.toString(memUsage.getCommitted()));
}
}
Additional Info:
Tomcat version: 5.5.23
Java version: 1.5.0_06-112
Spring version: 2.0.5