package ddth.dasp.common.hazelcastex.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.hazelcastex.IHazelcastClient; import ddth.dasp.common.hazelcastex.IHazelcastClientPool; import ddth.dasp.common.hazelcastex.PoolConfig; public class HazelcastClientPool extends GenericObjectPool<AbstractHazelcastClient> implements IHazelcastClientPool { private Logger LOGGER = LoggerFactory.getLogger(HazelcastClientPool.class); private PoolConfig poolConfig; private Set<AbstractHazelcastClient> activeClients = new ConcurrentHashSet<AbstractHazelcastClient>(); public HazelcastClientPool(PoolableObjectFactory<AbstractHazelcastClient> 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 (AbstractHazelcastClient client : activeClients) { invalidateObject(client); } } finally { super.close(); } } public HazelcastClientPool 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 Hazelcast 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 AbstractHazelcastClient borrowObject() throws Exception { AbstractHazelcastClient hazelcastClient = super.borrowObject(); if (hazelcastClient != null) { hazelcastClient.setHazelcastClientPool(this); activeClients.add(hazelcastClient); } return hazelcastClient; } /** * {@inheritDoc} * * @throws Exception */ @Override public void returnObject(AbstractHazelcastClient hazelcastClient) throws Exception { try { super.returnObject(hazelcastClient); // super.invalidateObject(hazelcastClient); } finally { activeClients.remove(hazelcastClient); } } /** * {@inheritDoc} */ @Override public IHazelcastClient borrowHazelcastClient() { try { return borrowObject(); } catch (Exception e) { LOGGER.error(e.getMessage(), e); return null; } } @Override public void returnHazelcastClient(IHazelcastClient hazelcastClient) { if (hazelcastClient instanceof AbstractHazelcastClient) try { returnObject((AbstractHazelcastClient) hazelcastClient); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } } }