package ddth.dasp.common.hazelcastex.impl;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.StringUtils;
import com.hazelcast.client.ClientConfig;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.core.AtomicNumber;
import com.hazelcast.core.IMap;
import com.hazelcast.core.IQueue;
import com.hazelcast.core.ITopic;
import com.hazelcast.core.MessageListener;
import com.hazelcast.security.UsernamePasswordCredentials;
import ddth.dasp.common.hazelcastex.IHazelcastClientPool;
import ddth.dasp.common.hazelcastex.IMessageListener;
public class PoolableHazelcastClient extends AbstractHazelcastClient {
private HazelcastClient hazelcastClient;
private final Map<String, Set<IMessageListener<?>>> topicSubscriptions = new ConcurrentHashMap<String, Set<IMessageListener<?>>>();
private final Map<IMessageListener<?>, WrappedMessageListener<?>> topicSubscriptionMappings = new ConcurrentHashMap<IMessageListener<?>, WrappedMessageListener<?>>();
/**
* {@inheritDoc}
*/
@Override
public void init() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.setConnectionTimeout(2000);
clientConfig.setInitialConnectionAttemptLimit(2);
clientConfig.setReconnectionAttemptLimit(2);
clientConfig.setReConnectionTimeOut(2000);
if (!StringUtils.isBlank(getHazelcastUsername())) {
clientConfig.setCredentials(new UsernamePasswordCredentials(getHazelcastUsername(),
getHazelcastPassword()));
}
for (String hazelcastServer : getHazelcastServers()) {
clientConfig.addAddress(hazelcastServer);
}
hazelcastClient = HazelcastClient.newHazelcastClient(clientConfig);
}
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public void destroy() {
for (Entry<IMessageListener<?>, WrappedMessageListener<?>> entry : topicSubscriptionMappings
.entrySet()) {
try {
WrappedMessageListener msgListener = entry.getValue();
ITopic<?> topic = hazelcastClient.getTopic(msgListener.getTopicName());
if (topic != null) {
topic.removeMessageListener(msgListener);
}
} catch (Exception e) {
// EMPTY
}
}
try {
topicSubscriptionMappings.clear();
} catch (Exception e) {
// EMPTY
}
try {
topicSubscriptions.clear();
} catch (Exception e) {
// EMPTY
}
hazelcastClient.shutdown();
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
IHazelcastClientPool hazelcastClientPool;
if ((hazelcastClientPool = getHazelcastClientPool()) != null) {
hazelcastClientPool.returnHazelcastClient(this);
}
}
/* Hazelcast API */
/**
* {@inheritDoc}
*/
@Override
public boolean ping() {
if (hazelcastClient.isActive()) {
AtomicNumber ping = hazelcastClient.getAtomicNumber("_PING_");
if (ping != null) {
ping.incrementAndGet();
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean mapDeleteAll(String mapName) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
if (map != null) {
map.clear();
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean mapDelete(String mapName, String key) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
if (map != null) {
map.remove(key);
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean mapSetExpiry(String mapName, String key, int ttlSeconds) {
if (ttlSeconds > 0) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
Object value = map != null ? map.get(key) : null;
if (value != null && map != null) {
map.put(key, value, ttlSeconds, TimeUnit.SECONDS);
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public Object mapGet(String mapName, String key) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
return map != null ? map.get(key) : null;
}
/**
* {@inheritDoc}
*/
@Override
public boolean mapSet(String mapName, String key, Object value, int ttlSeconds) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
if (map != null) {
if (ttlSeconds > 0) {
map.put(key, value, ttlSeconds, TimeUnit.SECONDS);
} else {
map.put(key, value);
}
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public int mapSize(String mapName) {
IMap<String, Object> map = hazelcastClient.getMap(mapName);
return map != null ? map.size() : -1;
}
/**
* {@inheritDoc}
*/
@Override
public Object queuePoll(String queueName) {
return queuePoll(queueName, DEFAULT_TIMEOUT, DEFAULT_TIMEUNIT);
}
/**
* {@inheritDoc}
*/
@Override
public Object queuePoll(String queueName, long timeout, TimeUnit timeoutTimeUnit) {
IQueue<Object> queue = hazelcastClient.getQueue(queueName);
try {
return queue != null ? ((timeout <= 0 || timeoutTimeUnit == null) ? queue.poll()
: queue.poll(timeout, timeoutTimeUnit)) : null;
} catch (Exception e) {
return null;
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean queuePush(String queueName, Object value) {
return queuePush(queueName, value, DEFAULT_TIMEOUT, DEFAULT_TIMEUNIT);
}
/**
* {@inheritDoc}
*/
@Override
public boolean queuePush(String queueName, Object value, long timeout, TimeUnit timeoutTimeUnit) {
IQueue<Object> queue = hazelcastClient.getQueue(queueName);
if (queue != null) {
try {
return (timeout <= 0 || timeoutTimeUnit == null) ? queue.offer(value) : queue
.offer(value, timeout, timeoutTimeUnit);
} catch (Exception e) {
return false;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public int queueSize(String queueName) {
IQueue<Object> queue = hazelcastClient.getQueue(queueName);
return queue != null ? queue.size() : -1;
}
/**
* {@inheritDoc}
*/
@Override
public boolean publish(String topicName, Object value) {
ITopic<Object> topic = hazelcastClient.getTopic(topicName);
if (topic != null) {
topic.publish(value);
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public <T> boolean subscribe(String topicName, IMessageListener<T> messageListener) {
Set<IMessageListener<?>> subcription = topicSubscriptions.get(topicName);
if (subcription == null) {
subcription = new HashSet<IMessageListener<?>>();
topicSubscriptions.put(topicName, subcription);
}
synchronized (subcription) {
ITopic<T> topic = hazelcastClient.getTopic(topicName);
if (topic != null && subcription.add(messageListener)) {
WrappedMessageListener<T> wrappedMessageListener = new WrappedMessageListener<T>(
topicName, messageListener);
topicSubscriptionMappings.put(messageListener, wrappedMessageListener);
topic.addMessageListener(wrappedMessageListener);
return true;
}
return false;
}
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
@Override
public <T> boolean unsubscribe(String topicName, IMessageListener<T> messageListener) {
Set<IMessageListener<?>> subcription = topicSubscriptions.get(topicName);
if (subcription != null) {
synchronized (subcription) {
if (subcription.remove(messageListener)) {
WrappedMessageListener<?> wrappedMessageListener = topicSubscriptionMappings
.remove(messageListener);
if (wrappedMessageListener != null) {
ITopic<T> topic = hazelcastClient.getTopic(topicName);
if (topic != null) {
topic.removeMessageListener((MessageListener<T>) wrappedMessageListener);
return true;
}
}
}
}
}
return false;
}
/* Hazelcast API */
}