package ddth.dasp.hetty.qnt.hazelcast;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import ddth.dasp.common.hazelcastex.IHazelcastClient;
import ddth.dasp.common.hazelcastex.IHazelcastClientFactory;
import ddth.dasp.common.hazelcastex.PoolConfig;
import ddth.dasp.hetty.message.IResponse;
import ddth.dasp.hetty.qnt.ITopicPublisher;
public class HazelcastTopicPublisher implements ITopicPublisher {
private IHazelcastClientFactory hazelcastClientFactory;
private List<String> hazelcastServers;
private String hazelcastUsername, hazelcastPassword;
private PoolConfig poolConfig;
private Set<IHazelcastClient> allocatedHazelcastClients = new HashSet<IHazelcastClient>();
protected IHazelcastClientFactory getHazelcastClientFactory() {
return hazelcastClientFactory;
}
public void setHazelcastClientFactory(IHazelcastClientFactory hazelcastClientFactory) {
this.hazelcastClientFactory = hazelcastClientFactory;
}
protected List<String> getHazelcastServers() {
return hazelcastServers;
}
public HazelcastTopicPublisher setHazelcastServers(List<String> hazelcastServers) {
this.hazelcastServers = hazelcastServers;
return this;
}
protected String getHazelcastUsername() {
return hazelcastUsername;
}
public HazelcastTopicPublisher setHazelcastUsername(String hazelcastUsername) {
this.hazelcastUsername = hazelcastUsername;
return this;
}
protected String getHazelcastPassword() {
return hazelcastPassword;
}
public HazelcastTopicPublisher setHazelcastPassword(String hazelcastPassword) {
this.hazelcastPassword = hazelcastPassword;
return this;
}
protected PoolConfig getPoolConfig() {
return poolConfig;
}
public HazelcastTopicPublisher setPoolConfig(PoolConfig poolConfig) {
this.poolConfig = poolConfig;
return this;
}
private IHazelcastClient getHazelcastClient() {
IHazelcastClient hazelcastClient = hazelcastClientFactory.getHazelcastClient(
hazelcastServers, hazelcastUsername, hazelcastPassword, poolConfig);
if (hazelcastClient != null) {
allocatedHazelcastClients.add(hazelcastClient);
}
return hazelcastClient;
}
private void returnHazelcastClient(IHazelcastClient hazelcastClient) {
if (hazelcastClient != null) {
try {
allocatedHazelcastClients.remove(hazelcastClient);
} finally {
hazelcastClientFactory.returnHazelcastClient(hazelcastClient);
}
}
}
public void init() {
}
public void destroy() {
for (IHazelcastClient hazelcastClient : allocatedHazelcastClients) {
try {
hazelcastClientFactory.returnHazelcastClient(hazelcastClient);
} catch (Exception e) {
}
}
allocatedHazelcastClients.clear();
}
/**
* {@inheritDoc}
*/
@Override
public boolean publish(String topicName, Object obj) {
return publish(topicName, obj, 5000, TimeUnit.MILLISECONDS);
}
/**
* {@inheritDoc}
*/
@Override
public boolean publish(String topicName, Object obj, long timeout, TimeUnit timeUnit) {
IHazelcastClient hazelcastClient = getHazelcastClient();
if (hazelcastClient != null) {
try {
if (obj instanceof IResponse) {
IResponse response = (IResponse) obj;
hazelcastClient.publish(topicName, response.serialize());
} else {
hazelcastClient.publish(topicName, obj);
}
return true;
} finally {
returnHazelcastClient(hazelcastClient);
}
}
return false;
}
}