package er.caching; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.log4j.Logger; import com.meetup.memcached.SockIOPool; import com.meetup.memcached.test.UnitTests; import com.thimbleware.jmemcached.Cache; import com.thimbleware.jmemcached.LRUCacheStorageDelegate; import com.thimbleware.jmemcached.MemCacheDaemon; import com.webobjects.appserver.WOApplication; import com.webobjects.foundation.NSForwardException; import er.extensions.ERXFrameworkPrincipal; import er.extensions.foundation.ERXProperties; /** * * @property er.caching.servers * @property er.caching.server.host * @property er.caching.server.port * @property er.caching.server.maxItems * @property er.caching.server.maxMemory * @property er.caching.initialConnections * @property er.caching.sleepTime * @property er.caching.maxConnections * @property er.caching.minConnections * @property er.caching.useNagle */ public class ERCaching extends ERXFrameworkPrincipal { private static Logger log = Logger.getLogger(ERCaching.class); static { setUpFrameworkPrincipalClass(ERCaching.class); } public void finishInitialization() { startServer(); startClient(); } public static void startClient() { String servers = ERXProperties.stringForKey("er.caching.servers"); if (servers == null || servers.length() == 0) { log.error("No Servers found, set er.caching.servers=server1:port1,server2:port2..."); return; } String[] serverlist = servers.split(",\\s*"); // initialize the pool for memcache servers SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.setInitConn(ERXProperties.intForKeyWithDefault("er.caching.initialConnections", 5)); pool.setMinConn(ERXProperties.intForKeyWithDefault("er.caching.minConnections", 5)); pool.setMaxConn(ERXProperties.intForKeyWithDefault("er.caching.maxConnections", 50)); pool.setMaintSleep(ERXProperties.intForKeyWithDefault("er.caching.sleepTime", 30)); pool.setNagle(ERXProperties.booleanForKeyWithDefault("er.caching.useNagle", false)); pool.initialize(); } public static void startServer() { try { int port = ERXProperties.intForKeyWithDefault("er.caching.server.port", 0); if(port > 0) { int maxItems = ERXProperties.intForKeyWithDefault("er.caching.server.maxItems", 0); int maxMemory = ERXProperties.intForKeyWithDefault("er.caching.server.maxMemory", 128); MemCacheDaemon daemon = new MemCacheDaemon(); LRUCacheStorageDelegate cacheStorage = new LRUCacheStorageDelegate(maxItems, maxMemory * 1024*1024, 0); daemon.setCache(new Cache(cacheStorage)); String host = ERXProperties.stringForKeyWithDefault("er.caching.server.host", WOApplication.application().host()); daemon.setAddr(new InetSocketAddress(host, port)); daemon.setIdleTime(50); daemon.setVerbose(true); daemon.start(); log.info("Server started: " + host + ":" + port + " maxItems=" + maxItems + " maxMemory=" + maxMemory); } } catch (IOException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } } public static void runTests() { //MemcachedBench.main(new String[]{"1000", "0"}); /*MemcachedTest.main(new String[]{"4", "5", "5"}); TestMemcached.main(new String[]{"4", "5", "5"});*/ UnitTests.main(new String[]{}); } }