Complex systems based on JMX are also, most of the times, distributed systems.
Such systems are often made of
nodes, and each node is made of
components.
When the underlying architecture is JMX, in each node there is one (possibly more) MBeanServer that manages
the components, and each component is an MBean.
Sometimes there is the need to have one MBeanServer gathering information from many remote
MBeanServers. However, the information needed is only part of the information exposed by each remote
MBeanServer: you may want to collect only some information from each remote MBeanServer.
For this purpose, it is useful to write an MBean that exposes this information, and register one instance
of this MBean per each remote MBeanServer.
A client application may want to connect to the gathering MBeanServer to see the gathered information, without having the hassle to connect to each individual remote MBeanServer and choose the information MBean among the others.
In short, the gathering MBeanServer acts as a proxy for certain MBeans hosted elsewhere: client applications only need to contact the gathering MBeanServer to get the information they need.
For this purpose MX4J provides a remote MBean proxy: an MBean you can register in the
gathering MBeanServer that acts as a proxy for a remote MBean hosted in a remote MBeanServer.
Refer anyway to the javadocs of the
RemoteMBeanProxy class for further
information.
Below there is an example where remote MBeanServers publish information about the downloads of
products, and a gathering MBeanServer proxies these information for easier access via the HTTPAdaptor.
Example 3.27. Remote MBean proxying
// A remote MBeanServer // It exposes also a JMXConnectorServer at the address 'service:jmx:rmi://localhost/jndi/jmx1' MBeanServer remoteMBeanServer1 = ...; // A remote MBean Object remoteMBean1 = ...; ObjectName remoteMBeanName1 = ObjectName.getInstance("sytem.information:type=downloads,product=mx4j"); remoteMBeanServer1.registerMBean(remoteMBean1, remoteMBeanName1); // Another remote MBeanServer // It exposes also a JMXConnectorServer at the address 'service:jmx:rmi://localhost/jndi/jmx2' MBeanServer remoteMBeanServer2 = ...; // A remote MBean Object remoteMBean2 = ...; ObjectName remoteMBeanName2 = ObjectName.getInstance("information.data:type=downloads,product=tomcat"); remoteMBeanServer2.registerMBean(remoteMBean2, remoteMBeanName2); // The proxy for the MBean in the first MBeanServer JMXServiceURL url1 = new JMXServiceURL("rmi", "localhost", 0, "/jndi/jmx1"); RemoteMBeanProxy proxy1 = new RemoteMBeanProxy(remoteMBeanName1, url1); ObjectName proxyName1 = ObjectName.getInstance("system.download:product=mx4j"); // The proxy for the MBean in the second MBeanServer JMXServiceURL url2 = new JMXServiceURL("rmi", "localhost", 0, "/jndi/jmx2"); RemoteMBeanProxy proxy2 = new RemoteMBeanProxy(remoteMBeanName2, url2); ObjectName proxyName2 = ObjectName.getInstance("system.download:product=tomcat"); // The gathering MBeanServer // It exposes also a HTTPAdaptor on port 8082 MBeanServer gatheringMBeanServer = ...; gatheringMBeanServer.registerMBean(proxy1, proxyName1); gatheringMBeanServer.registerMBean(proxy2, proxyName2); // Browsing on port 8082 you can see, on the gathering MBeanServer, the proxied MBeans.
The
mx4j.remote.RemoteMBeanProxy MBean is a transparent proxy for the remote MBean:
invoking a method on the proxy results in the method being invoked on the remote MBean; registering a local
NotificationListener on the proxy results in registration on the remote MBean, and thus
the local listener will receive notifications emitted by the remote MBean.
For example, by proxying the remote MBeanServerDelegate MBean, you can receive locally notifications of
MBean registrations/unregistrations that happens in the remote MBeanServer.