Spring JMX

David Winterfeldt

2009


JMX is good way to expose parts of your application for monitoring and management. Spring also provides support for exposing JMX for remote management (JSR-160) and creating a client to manage it. This example registers a Spring bean as a JMX MBean, exposes the JMX server over JMX Messaging Protocol (JMXMP), and creates a client to access it.

To connect to the example using a JMX Management tool, JConsole can be used and comes with the JDK installation. In the IDE a break point could be set in the unit test or Thread.sleep could be added to pause the application from shutting down. To activate local JMX access, the Java argument -Dcom.sun.management.jmxremote must be used when starting the test.

$ jconsole

1. Spring Configuration

The context:component-scan creates a Spring bean from the ServerManagerImpl. The context:mbean-export element will register any annotation beans as JMX MBeans.

The serverConnector bean will expose JMX for remote management over JMXMP.

The clientConnector creates a remote reference as an MBeanServerConnection. From this MBeanInfo can be retrieved for different JMX MBeans. But even more convenient is to create a proxy of the MBean using the MBeanProxyFactoryBean. This creates a remote proxy to the MBean specified by the p:objectName attribute, and uses the p:proxyInterface attribute to set what interface should be used for the proxy.

JmxTest-context.xml
                
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
 
    <context:component-scan base-package="org.springbyexample.jmx" />
    
    <context:mbean-export/>

    <!-- Expose JMX over JMXMP -->
    <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" />

    <!-- Client connector to JMX over JMXMP -->
    <bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean"
          p:serviceUrl="service:jmx:jmxmp://localhost:9875" />

    <!-- Client ServerManager proxy to JMX over JMXMP -->
    <bean id="serverManagerProxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean"
          p:objectName="org.springbyexample.jmx:name=ServerManager"
          p:proxyInterface="org.springbyexample.jmx.ServerManager"
          p:server-ref="clientConnector" />

</beans>