You should create one CascadingAgent MBean for every subagent you want to manage through the master agent. Each connects to an agent and mirrors all of that agent's registered MBeans in the master agent's MBean server. No other classes are required or need to be generated in order to represent the MBeans.
The agent whose MBean server contains an active cascading service is called a master agent in relation to the other agent that is mirrored. The agent to which the cascading service is connected is called the subagent in relation to its master agent. We say that it creates mirror MBeans to represent the subagent's MBeans. See Mirror MBeans in the Master Agent for a description of these objects.
A master agent can have any number of subagents, each controlled individually by a different CascadingAgent MBean. A subagent can itself contain cascading agents and mirror MBeans, all of which are mirrored again in the master agent. This effectively enables cascading hierarchies of arbitrary depth and width.
Two master agents can also connect to the same subagent. This is similar to the situation where two managers connect to the same agent and can access the same MBean. If the implementation of a management solution permits such a condition, it is the designer's responsibility to handle any synchronization issues in the MBean.
The connection between two agents resembles the connection between a manager and an agent. The cascading service MBean relies on a connector client, and the subagent must have the corresponding connector server. The subagent's connector server must already be instantiated, registered with its MBean server, and ready to receive connections.
In our example application, we use the RMI connector client that we will connect to the RMI connector server of the subagent on port 1099 of the local host. In fact, this is the same as the default values when instantiating a cascading agent MBean, but we also want to specify a pattern for selecting the MBeans to mirror. By default, all MBeans of the subagent are mirrored in the master agent; we provide an object name pattern to only select those in the subagent's CascadedDomain.
ObjectName mbeanObjectName = null; String domain = server.getDefaultDomain(); mbeanObjectName = new ObjectName(domain + ":type=CascadingAgent"); [...] RmiConnectorAddress address = new RmiConnectorAddress( java.net.InetAddress.getLocalHost().getHostName(), 1099, "name=RmiConnectorServer"); CascadingAgent remAgent = new CascadingAgent( address, "com.sun.jdmk.comm.RmiConnectorClient", new ObjectName("CascadedDomain:*"), null); ObjectInstance remAgentInstance = server.registerMBean(remAgent, mbeanObjectName); [...] // Output omitted // Now we explicitly start the cascading agent // as it is not started automatically // echo("\nStarting the cascading agent..."); [...] server.invoke(mbeanObjectName, "start", null, null); sleep(1000); echo("\tIs ACTIVE = " + server.getAttribute(mbeanObjectName, "Active")); echo("done");
Before the subagent's MBeans are mirrored, the CascadingAgent MBean must be registered in the master agent's MBean server, and its mirroring must be started. When you invoke the start operation of the cascading service MBean, it will connect it to its designated subagent and create one mirror MBean to represent each MBean in the subagent. When its Active attribute becomes true, the cascading mechanism is ready to use.
The CascadingAgent MBean exposes two writable attributes:
Address is a ConnectorAddress object whose subclass defines the protocol used for the connection and whose content gives the address or host name of the subagent, along with a port number
ClientConnectorClassName is a string that gives the class name of the connector client to be used in the connection; it must be compatible with the protocol defined by the class of the Address attribute
Neither of these attributes can be modified when the cascading service is active. You must first call the MBean's stop operation: this will remove all of the mirror MBeans for the given subagent and disconnect from the subagent's connector server. You can then modify the address or the class of the connector client. The new values will be used when you start the mirroring again: this lets you change subagents or even change protocols.
When the cascading service is stopped or its MBean is removed from the master agent, all of its mirror MBeans are unregistered. The MBean server delegate in the master agent will send an unregistration notification for each mirror MBean as it is removed.