package ddth.dasp.framework.cache.redis; import org.osgi.framework.BundleContext; import ddth.dasp.common.redis.IRedisClient; import ddth.dasp.common.redis.IRedisClientFactory; import ddth.dasp.common.redis.PoolConfig; import ddth.dasp.common.redis.impl.jedis.RedisClientFactory; import ddth.dasp.common.utils.OsgiUtils; import ddth.dasp.framework.cache.AbstractCacheManager; import ddth.dasp.framework.cache.ICacheManager; /** * <a href="http://www.hazelcast.com/">Hazelcast</a> implementation of * {@link ICacheManager}. * * @author NBThanh <btnguyen2k@gmail.com> * @version 0.1.0 */ public class RedisCacheManager extends AbstractCacheManager { private boolean myOwnRedisClientFactory = false; private IRedisClientFactory redisClientFactory; private String redisHost = "localhost", redisUsername, redisPassword; private int redisPort = IRedisClient.DEFAULT_REDIS_PORT; private PoolConfig poolConfig; public IRedisClientFactory getRedisClientFactory() { if (redisClientFactory != null) { return redisClientFactory; } /* * If the Redis client factory has not been set, try to get it from OSGi * container. */ BundleContext bundleContext = getBundleContext(); if (bundleContext != null) { IRedisClientFactory _redisClientFactory = OsgiUtils.getService(bundleContext, IRedisClientFactory.class); if (_redisClientFactory != null) { return _redisClientFactory; } } /* * Build an instance of Redis client factory for my own. */ synchronized (this) { // safeguard check if (redisClientFactory == null) { RedisClientFactory hzcf = new RedisClientFactory(); hzcf.init(); redisClientFactory = hzcf; myOwnRedisClientFactory = true; } } return redisClientFactory; } public RedisCacheManager setRedisClientFactory(IRedisClientFactory redisClientFactory) { this.redisClientFactory = redisClientFactory; return this; } public String getRedisHost() { return redisHost; } public RedisCacheManager setRedisHost(String redisHost) { this.redisHost = redisHost; return this; } protected String getRedisUsername() { return redisUsername; } public RedisCacheManager setRedisUsername(String redisUsername) { this.redisUsername = redisUsername; return this; } protected String getRedisPassword() { return redisPassword; } public RedisCacheManager setRedisPassword(String redisPassword) { this.redisPassword = redisPassword; return this; } public int getRedisPort() { return redisPort; } public RedisCacheManager setRedisPort(int redisPort) { this.redisPort = redisPort; return this; } protected PoolConfig getPoolConfig() { return poolConfig; } public void setPoolConfig(PoolConfig poolConfig) { this.poolConfig = poolConfig; } /** * {@inheritDoc} */ @Override public void init() { super.init(); if (redisClientFactory == null) { RedisClientFactory rcf = new RedisClientFactory(); rcf.init(); redisClientFactory = rcf; myOwnRedisClientFactory = true; } } /** * {@inheritDoc} */ @Override public void destroy() { try { if (myOwnRedisClientFactory) { ((RedisClientFactory) redisClientFactory).destroy(); } } finally { super.destroy(); } } /** * {@inheritDoc} */ @Override protected RedisCache createCacheInternal(String name, long capacity, long expireAfterWrite, long expireAfterAccess) { RedisCache cache = new RedisCache(this, name); cache.setCapacity(capacity > 0 ? capacity : getDefaultCacheCapacity()); cache.setExpireAfterAccess(expireAfterAccess); cache.setExpireAfterWrite(expireAfterWrite); cache.setRedisHost(redisHost).setRedisPort(redisPort).setRedisUsername(redisUsername) .setRedisPassword(redisPassword).setPoolConfig(poolConfig); cache.init(); return cache; } }