package ddth.dasp.hetty.qnt.redis;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import ddth.dasp.common.redis.IRedisClient;
import ddth.dasp.common.redis.IRedisClientFactory;
import ddth.dasp.common.redis.PoolConfig;
import ddth.dasp.hetty.message.IResponse;
import ddth.dasp.hetty.qnt.ITopicPublisher;
public class RedisTopicPublisher implements ITopicPublisher {
private IRedisClientFactory redisClientFactory;
private String redisHost = "localhost";
private int redisPort = IRedisClient.DEFAULT_REDIS_PORT;
private String redisUsername, redisPassword;
private PoolConfig poolConfig;
private Set<IRedisClient> allocatedRedisClients = new HashSet<IRedisClient>();
protected IRedisClientFactory getRedisClientFactory() {
return redisClientFactory;
}
public RedisTopicPublisher setRedisClientFactory(IRedisClientFactory redisClientFactory) {
this.redisClientFactory = redisClientFactory;
return this;
}
protected String getRedisHost() {
return redisHost;
}
public RedisTopicPublisher setRedisHost(String redisHost) {
this.redisHost = redisHost;
return this;
}
protected int getRedisPort() {
return redisPort;
}
public RedisTopicPublisher setRedisPort(int redisPort) {
this.redisPort = redisPort;
return this;
}
protected String getRedisUsername() {
return redisUsername;
}
public RedisTopicPublisher setRedisUsername(String redisUsername) {
this.redisUsername = redisUsername;
return this;
}
protected String getRedisPassword() {
return redisPassword;
}
public RedisTopicPublisher setRedisPassword(String redisPassword) {
this.redisPassword = redisPassword;
return this;
}
protected PoolConfig getPoolConfig() {
return poolConfig;
}
public RedisTopicPublisher setPoolConfig(PoolConfig poolConfig) {
this.poolConfig = poolConfig;
return this;
}
private IRedisClient getRedisClient() {
IRedisClient redisClient = redisClientFactory.getRedisClient(redisHost, redisPort,
redisUsername, redisPassword, poolConfig);
if (redisClient != null) {
allocatedRedisClients.add(redisClient);
}
return redisClient;
}
private void returnRedisClient(IRedisClient redisClient) {
if (redisClient != null) {
try {
allocatedRedisClients.remove(redisClient);
} finally {
redisClientFactory.returnRedisClient(redisClient);
}
}
}
public void init() {
}
public void destroy() {
for (IRedisClient redisClient : allocatedRedisClients) {
try {
redisClientFactory.returnRedisClient(redisClient);
} catch (Exception e) {
}
}
allocatedRedisClients.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) {
IRedisClient redisClient = getRedisClient();
if (redisClient != null) {
try {
if (obj instanceof IResponse) {
IResponse response = (IResponse) obj;
redisClient.publish(topicName, response.serialize());
} else if (obj instanceof byte[]) {
redisClient.publish(topicName, (byte[]) obj);
} else {
redisClient.publish(topicName, obj != null ? obj.toString() : null);
}
return true;
} finally {
returnRedisClient(redisClient);
}
}
return false;
}
}