5.4.4. Receiving JMX Notifications
JBoss Cache users can register a listener to receive cache events described earlier in the Section 2.7, “ Adding a Cache Listener - registering for cache events ” chapter. Users can alternatively utilize the cache's management information infrastructure to receive these events via JMX notifications. Cache events are accessible as notifications by registering a
NotificationListener
for the CacheJmxWrapper
.
See the section in the Section 13.2, “JMX MBean Notifications” pertaining to JMX notifications for a list of notifications that can be received through the
CacheJmxWrapper
.
The following is an example of how to programmatically receive cache notifications when running in a EAP environment. In this example, the client uses a filter to specify which events are of interest.
MyListener listener = new MyListener(); NotificationFilterSupport filter = null; // get reference to MBean server Context ic = new InitialContext(); MBeanServerConnection server = (MBeanServerConnection)ic.lookup("jmx/invoker/RMIAdaptor"); // get reference to CacheMgmtInterceptor MBean String cache_service = "jboss.cache:service=TomcatClusteringCache"; ObjectName mgmt_name = new ObjectName(cache_service); // configure a filter to only receive node created and removed events filter = new NotificationFilterSupport(); filter.disableAllTypes(); filter.enableType(CacheNotificationBroadcaster.NOTIF_NODE_CREATED); filter.enableType(CacheNotificationBroadcaster.NOTIF_NODE_REMOVED); // register the listener with a filter // leave the filter null to receive all cache events server.addNotificationListener(mgmt_name, listener, filter, null); // ... // on completion of processing, unregister the listener server.removeNotificationListener(mgmt_name, listener, filter, null);
The following is the simple notification listener implementation used in the previous example.
private class MyListener implements NotificationListener, Serializable { public void handleNotification(Notification notification, Object handback) { String message = notification.getMessage(); String type = notification.getType(); Object userData = notification.getUserData(); System.out.println(type + ": " + message); if (userData == null) { System.out.println("notification data is null"); } else if (userData instanceof String) { System.out.println("notification data: " + (String) userData); } else if (userData instanceof Object[]) { Object[] ud = (Object[]) userData; for (Object data : ud) { System.out.println("notification data: " + data.toString()); } } else { System.out.println("notification data class: " + userData.getClass().getName()); } } }
Note that the JBoss Cache management implementation only listens to cache events after a client registers to receive MBean notifications. As soon as no clients are registered for notifications, the MBean will remove itself as a cache listener.