我在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。所以尝试调用该方法重新连接。绝地武士在订阅的频道上没有状态,所以你必须重新订阅所有频道。
其他客户机能够透明地重新连接和恢复连接状态,因此在应用程序代码中不会出现任何异常。

09-29 19:32