package ddth.dasp.common.redis.impl; import java.util.Set; import org.apache.commons.pool.PoolableObjectFactory; import org.apache.commons.pool.impl.GenericObjectPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hazelcast.util.ConcurrentHashSet; import ddth.dasp.common.redis.IRedisClient; import ddth.dasp.common.redis.IRedisClientPool; import ddth.dasp.common.redis.PoolConfig; public class RedisClientPool extends GenericObjectPool<AbstractRedisClient> implements IRedisClientPool { private Logger LOGGER = LoggerFactory.getLogger(RedisClientPool.class); private PoolConfig poolConfig; private Set<AbstractRedisClient> activeClients = new ConcurrentHashSet<AbstractRedisClient>(); public RedisClientPool(PoolableObjectFactory<AbstractRedisClient> factory, PoolConfig poolConfig) { super(factory); setPoolConfig(poolConfig); setTestOnBorrow(true); setTestWhileIdle(true); setWhenExhaustedAction(WHEN_EXHAUSTED_FAIL); } /** * {@inheritDoc} */ public void init() { // EMPTY } /** * {@inheritDoc} */ @Override public void close() throws Exception { try { for (AbstractRedisClient client : activeClients) { invalidateObject(client); } } finally { super.close(); } } public RedisClientPool setPoolConfig(PoolConfig poolConfig) { this.poolConfig = poolConfig; if (poolConfig != null) { int maxActive = poolConfig != null ? poolConfig.getMaxActive() : PoolConfig.DEFAULT_MAX_ACTIVE; long maxWaitTime = poolConfig != null ? poolConfig.getMaxWaitTime() : PoolConfig.DEFAULT_MAX_WAIT_TIME; int maxIdle = poolConfig != null ? poolConfig.getMaxIdle() : PoolConfig.DEFAULT_MAX_IDLE; int minIdle = poolConfig != null ? poolConfig.getMinIdle() : PoolConfig.DEFAULT_MIN_IDLE; LOGGER.debug("Updating Redis client pool {maxActive:" + maxActive + ";maxWait:" + maxWaitTime + ";minIdle:" + minIdle + ";maxIdle:" + maxIdle + "}..."); this.setMaxActive(maxActive); this.setMaxIdle(maxIdle); this.setMaxWait(maxWaitTime); this.setMinIdle(minIdle); } return this; } public PoolConfig getPoolConfig() { return poolConfig; } /** * {@inheritDoc} */ @Override public AbstractRedisClient borrowObject() throws Exception { AbstractRedisClient redisClient = super.borrowObject(); // System.out.println("Borrow: " + getNumActive() + "+" + getNumIdle() + // "/" + getMaxActive()); if (redisClient != null) { redisClient.setRedisClientPool(this); activeClients.add(redisClient); } return redisClient; } /** * {@inheritDoc} * * @throws Exception */ @Override public void returnObject(AbstractRedisClient redisClient) throws Exception { try { super.returnObject(redisClient); // super.invalidateObject(redisClient); // System.out.println("Return: " + getNumActive() + "+" + // getNumIdle() + "/" // + getMaxActive()); } finally { activeClients.remove(redisClient); } } /** * {@inheritDoc} */ @Override public IRedisClient borrowRedisClient() { try { return borrowObject(); } catch (Exception e) { LOGGER.error(e.getMessage(), e); return null; } } @Override public void returnRedisClient(IRedisClient redisClient) { if (redisClient instanceof AbstractRedisClient) try { returnObject((AbstractRedisClient) redisClient); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } } }