package org.genedb.crawl.hazelcast; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; import org.apache.log4j.Logger; import com.hazelcast.core.EntryEvent; import com.hazelcast.core.EntryListener; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.Instance; import com.hazelcast.core.InstanceEvent; import com.hazelcast.core.InstanceListener; public class HazelcastMonitor implements InstanceListener { public HazelcastMonitor() { logger.info("Monitor activated"); } private static Logger logger = Logger.getLogger(HazelcastMonitor.class); private EntryMonitor<Object,Object> entryMonitor = new EntryMonitor<Object,Object>(); private int time = 300000; private Map<String,Timer> timers = new HashMap<String,Timer>(); private void instanceEvent(InstanceEvent event) { logger.info(String.format("%s %s %s", event.getEventType(), event.getInstanceType(), event.getInstance())); } public static String getId(InstanceEvent event) { return getId(event.getInstance()); } public static String getId(Instance instance) { return instance.getId().toString().substring(2); } @Override public void instanceCreated(InstanceEvent event) { instanceEvent(event); final String id = getId(event); stats(id); Hazelcast.getMap(id).addEntryListener(entryMonitor, false); Timer timer=new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { stats(id); } }, time, time); timers.put(id, timer); } @Override public void instanceDestroyed(InstanceEvent event) { instanceEvent(event); clearTimer(getId(event)); } public void clear() { logger.warn("Clearing monitors"); for (Entry<String,Timer> entry : timers.entrySet()) { clearTimer(entry.getKey()); } timers = new HashMap<String,Timer>(); } private void clearTimer(String id) { logger.warn("Clearing monitors for " + id); Timer timer = timers.get(id); timer.cancel(); timer.purge(); logger.warn("timer purged"); // attempting to remove the listener in this way stalls tomcat shutdown. // Hazelcast.getMap(id).removeEntryListener(entryMonitor); // logger.warn("listener removed"); } public static String stats(String mapName) { String stats = String.format("%s (%s):\n%s\n%s\n%s", mapName, Hazelcast.getMap(mapName).size(), Hazelcast.getConfig().findMatchingMapConfig(mapName), Hazelcast.getMap(mapName), Hazelcast.getMap(mapName).getLocalMapStats()); logger.info(stats); return stats; } class EntryMonitor<K, V> implements EntryListener<K, V> { private void entryEvent(EntryEvent<K, V> event) { logger.info(String.format("%s %s : %s", event.getEventType(), event.getKey(), event.getName())); } @Override public void entryAdded(EntryEvent<K, V> event) { entryEvent(event); } @Override public void entryEvicted(EntryEvent<K, V> event) { entryEvent(event); } @Override public void entryRemoved(EntryEvent<K, V> event) { entryEvent(event); } @Override public void entryUpdated(EntryEvent<K, V> event) { entryEvent(event); } } }