我在Redis上写了以下订阅者,它在内部实例化了监听器:
public class RedisSubscriber extends Thread{
String REDISHOST = "localhost";
int REDISPORT = 6379;
private static RedisSubscriber singleton = null;
private Jedis sub;
private KeyExpiredListener expireListener;
public static synchronized RedisSubscriber getSingleton(){
if(singleton==null){
singleton = new RedisSubscriber();
}
return singleton;
}
private RedisSubscriber(){
sub = new Jedis(REDISHOST, REDISPORT,0);
expireListener = new KeyExpiredListener();
}
public void run() {
//blocking call
LOGGER.info("Inside Run - subscribing");
try{
sub.psubscribe(expireListener, "__key*__:*");
}
catch(JedisConnectionException ex){
ex.printStackTrace();
}
}
}
public class KeyExpiredListener extends JedisPubSub {
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
System.out.println("onPSubscribe " + pattern + " " +
subscribedChannels);
}
@Override
public void onPMessage(String pattern, String channel, String
message)
{
System.out.println("onPMessage pattern " + pattern + " " + channel
+ " " + message);
}
}
}
在服务器启动时使用以下命令启动RedisSubscriber- new Thread(RedisSubscriber.getSingleton())。start();
现在如果Redis发生故障,这个线程将会被杀死。当Redis启动时,如何确保我的用户再次连接。
谢谢, Arpit。
答案 0 :(得分:0)
Connection
API提供了connect()
方法。您需要Client
才能对JedisPubSub
进行操作。所以尝试调用该方法重新连接。 Jedis在订阅频道AFAIK上没有任何州,因此您必须重新订阅所有频道。
其他客户端能够透明地重新连接和恢复连接状态,因此您不会在应用程序代码中获得任何异常。