我在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-
新线程(redisSubscriber.getSingleton()).start();
现在如果redis崩溃了,这个线程就会被终止。如何在redis启动时确保订阅服务器再次连接。
谢谢,
Arpit。
最佳答案
api提供了一个Connection
方法。您需要connect()
才能操作Client
。所以尝试调用该方法重新连接。绝地武士在订阅的频道上没有状态,所以你必须重新订阅所有频道。
其他客户机能够透明地重新连接和恢复连接状态,因此在应用程序代码中不会出现任何异常。