package org.gridkit.jvmtool.gcmon; import java.io.IOException; import javax.management.JMException; import javax.management.MBeanServerConnection; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.openmbean.CompositeData; public class GcEventSubscriber extends GcEventPoller { private static Listener LISTENER = new Listener(); public GcEventSubscriber(MBeanServerConnection mserver, GarbageCollectionEventConsumer eventSink) { super(mserver, eventSink); } public boolean subscribe() { boolean ok = true; for(GcTracker tracker: trackers) { try { subscribeTracker(tracker); } catch(Exception e) { ok = false; unsubscribe(); break; } } return ok; } public void unsubscribe() { for(GcTracker tracker: trackers) { try { mserver.removeNotificationListener(tracker.name, LISTENER, null, tracker); } catch(Exception e) { } } } protected void subscribeTracker(GcTracker tracker) throws IOException, JMException { mserver.addNotificationListener(tracker.name, LISTENER, null, tracker); tracker.capture(); // resync poll/push } private static class Listener implements NotificationListener { @Override public void handleNotification(Notification notification, Object handback) { try { GcTracker tracker = (GcTracker) handback; CompositeData cdata = (CompositeData) notification.getUserData(); CompositeData gcInfo = (CompositeData) cdata.get("gcInfo"); tracker.processGcEvent(gcInfo); } catch (JMException e) { // ignore } catch (IOException e) { // ignore } } } }