package biz.paluch.redis.extensibility;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.lambdaworks.redis.RedisChannelWriter;
import com.lambdaworks.redis.codec.RedisCodec;
import com.lambdaworks.redis.protocol.CommandType;
import com.lambdaworks.redis.protocol.RedisCommand;
import com.lambdaworks.redis.pubsub.PubSubOutput;
import com.lambdaworks.redis.pubsub.StatefulRedisPubSubConnectionImpl;
/**
* Demo code for extending a RedisPubSubConnectionImpl.
*
* @author Mark Paluch
*/
@SuppressWarnings("unchecked")
public class MyPubSubConnection<K, V> extends StatefulRedisPubSubConnectionImpl<K, V> {
private AtomicInteger subscriptions = new AtomicInteger();
/**
* Initialize a new connection.
*
* @param writer
* @param codec Codec used to encode/decode keys and values.
* @param timeout Maximum time to wait for a responses.
* @param unit Unit of time for the timeout.
*/
public MyPubSubConnection(RedisChannelWriter<K, V> writer, RedisCodec<K, V> codec, long timeout, TimeUnit unit) {
super(writer, codec, timeout, unit);
}
@Override
public <T, C extends RedisCommand<K, V, T>> C dispatch(C cmd) {
if (cmd.getType() == CommandType.SUBSCRIBE) {
subscriptions.incrementAndGet();
}
return super.dispatch(cmd);
}
public void channelRead(Object msg) {
PubSubOutput<K, V, V> output = (PubSubOutput<K, V, V>) msg;
// update internal state
switch (output.type()) {
case psubscribe:
patterns.add(output.pattern());
break;
case punsubscribe:
patterns.remove(output.pattern());
break;
case subscribe:
channels.add(output.channel());
break;
case unsubscribe:
channels.remove(output.channel());
break;
default:
break;
}
super.channelRead(msg);
}
}