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
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.
<?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>