package com.servershepherd.beume;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.constructs.blocking.CacheEntryFactory;
import net.sf.ehcache.constructs.blocking.SelfPopulatingCache;
import net.sf.ehcache.distribution.CacheManagerPeerProvider;
import net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatSender;
/**
*
* @author marc
*/
public class SPCacheFactory {
public static final CacheManager manager = new CacheManager(CommonResources.EHCACHE_CONF_FILE);
public static SelfPopulatingCache createCache(String ehcachename, CacheEntryFactory cu) {
Logger.getLogger(SPCacheFactory.class.getName()).log(Level.INFO, "Setting up cache... {0}", ehcachename);
MulticastKeepaliveHeartbeatSender.setHeartBeatInterval(1000);
Logger.getLogger(SPCacheFactory.class.getName()).log(Level.INFO, "Waiting cluster {0}", manager.getName());
SPCacheFactory.waitForClusterMembership(10, TimeUnit.SECONDS, Collections.singleton(ehcachename), manager);
Logger.getLogger(SPCacheFactory.class.getName()).log(Level.INFO, "Cluster connected.");
Cache orig_ehcache = manager.getCache(ehcachename);
if (orig_ehcache == null) {
return null;
}
orig_ehcache.bootstrap();
SelfPopulatingCache ehcache = new SelfPopulatingCache(orig_ehcache, cu);
ehcache.bootstrap();
return ehcache;
}
protected static int waitForClusterMembership(int time, TimeUnit unit, final Collection<String> cacheNames, final CacheManager... managers) {
Integer minimumPeers = null;
for (CacheManager cmanager : managers) {
CacheManagerPeerProvider peerProvider = cmanager.getCacheManagerPeerProvider("RMI");
if (peerProvider != null) {
for (String cacheName : cacheNames) {
int peers = peerProvider.listRemoteCachePeers(cmanager.getEhcache(cacheName)).size();
if (minimumPeers == null || peers < minimumPeers) {
minimumPeers = peers;
}
}
}
}
if (minimumPeers == null) {
return 0;
} else {
return minimumPeers + 1;
}
}
}