By extension of the ClientNotificationHandler interface, the RemoteMBeanServer interface exposes methods for adding and removing listeners. The signatures of these methods are identical to those of the agent-side MBeanServer interface. The only difference is that they are implemented in the connector client classes that make the communication protocol transparent.
Our manager application uses the RMI protocol connector. After creating the connector client object, we use the methods of its RemoteMBeanServer interface to create our broadcaster MBean and then register as a listener to this MBean's notifications.
// Use RMI connector on port 8086 to communicate with the agent System.out.println(">>> Create an RMI connector client"); RmiConnectorClient connectorClient = new RmiConnectorClient(); // agentHost was read from the command line or defaulted to localhost RmiConnectorAddress rmiAddress = new RmiConnectorAddress( agentHost, 8086, com.sun.jdmk.ServiceName.RMI_CONNECTOR_SERVER); connectorClient.connect(rmiAddress); // Wait 1 second for connecting Thread.sleep(1000); // Create the MBean in the agent ObjectName mbean = new ObjectName ("Default:name=NotificationEmitter"); connectorClient.createMBean("NotificationEmitter", mbean); // Now add ourselves as the listener (no filter, no handback) connectorClient.addNotificationListener(mbean, this, null, null);
You can see how similar this code is to the agent application by comparing it with the code example for 8.2.3 Adding a Listener Through the MBean Server.
If you have generated and instantiated proxy MBeans for your broadcaster MBeans, you can also register through the addNotificationListener method that they expose.
Again, the method signatures defined in a proxy MBean are identical to those of the MBeanServer or NotificationBroadcasterClient interfaces for adding or removing listeners. See the code example for 8.3.3 Adding a Listener Directly to an MBean. Listeners added through a proxy MBean receives the same notifications as listeners added to the same MBean through the interface of the connector client.
Following the Java programming model, the connector client limits its resource usage by only running one thread to notify all of its listeners. This thread calls all of the handler callback methods that have been added through this connector. Therefore, the callbacks should return quickly and use safe programming to avoid crashing the connector client.