package ddth.dasp.common.hazelcastex.impl; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ddth.dasp.common.hazelcastex.IHazelcastClient; import ddth.dasp.common.hazelcastex.IHazelcastClientFactory; import ddth.dasp.common.hazelcastex.PoolConfig; public abstract class AbstractHazelcastClientFactory implements IHazelcastClientFactory { private final static Logger LOGGER = LoggerFactory .getLogger(AbstractHazelcastClientFactory.class); /** * Stores established Hazelcast client pools as a map of {key:pool}. */ private ConcurrentMap<String, HazelcastClientPool> hazelcastClientPools = new ConcurrentHashMap<String, HazelcastClientPool>(); /** * {@inheritDoc} */ @Override public void init() { // TODO Auto-generated method stub } /** * {@inheritDoc} */ @Override public void destroy() { for (Entry<String, HazelcastClientPool> entry : hazelcastClientPools.entrySet()) { HazelcastClientPool clientPool = entry.getValue(); try { clientPool.close(); } catch (Exception e) { LOGGER.warn(e.getMessage()); } } } protected static String calcHazelcastPoolName(List<String> servers, String username, String password, PoolConfig poolConfig) { StringBuilder sb = new StringBuilder(); sb.append(servers != null ? servers : "NULL"); sb.append("."); sb.append(username != null ? username : "NULL"); sb.append("."); int passwordHashcode = password != null ? password.hashCode() : "NULL".hashCode(); int poolHashcode = poolConfig != null ? poolConfig.hashCode() : "NULL".hashCode(); return sb.append(passwordHashcode).append(".").append(poolHashcode).toString(); } protected HazelcastClientPool getPool(String poolName) { return hazelcastClientPools.get(poolName); } protected HazelcastClientPool buildHazelcastClientPool(List<String> servers, String username, String password) { return buildHazelcastClientPool(servers, username, password, null); } protected abstract HazelcastClientPool buildHazelcastClientPool(List<String> servers, String username, String password, PoolConfig poolConfig); /** * {@inheritDoc} */ @Override public IHazelcastClient getHazelcastClient(List<String> servers) { return getHazelcastClient(servers, null, null); } /** * {@inheritDoc} */ @Override public IHazelcastClient getHazelcastClient(List<String> servers, String username, String password) { return getHazelcastClient(servers, username, password, null); } /** * {@inheritDoc} */ @Override public IHazelcastClient getHazelcastClient(List<String> servers, String username, String password, PoolConfig poolConfig) { String poolName = calcHazelcastPoolName(servers, username, password, poolConfig); HazelcastClientPool hazelcastClientPool = null; synchronized (hazelcastClientPools) { hazelcastClientPool = getPool(poolName); if (hazelcastClientPool == null) { try { hazelcastClientPool = buildHazelcastClientPool(servers, username, password, poolConfig); } catch (Exception e) { LOGGER.error(e.getMessage(), e); throw new RuntimeException(e); } hazelcastClientPools.put(poolName, hazelcastClientPool); } } try { return hazelcastClientPool != null ? hazelcastClientPool.borrowHazelcastClient() : null; } catch (Exception e) { LOGGER.error(e.getMessage(), e); return null; } } /** * {@inheritDoc} */ @Override public void returnHazelcastClient(IHazelcastClient hazelcastClient) { if (hazelcastClient != null) { hazelcastClient.close(); } } }