在Redis上处理KeyEventListener关闭

时间:2015-06-26 14:25:35

标签: java redis

我在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。

1 个答案:

答案 0 :(得分:0)

Connection API提供了connect()方法。您需要Client才能对JedisPubSub进行操作。所以尝试调用该方法重新连接。 Jedis在订阅频道AFAIK上没有任何州,因此您必须重新订阅所有频道。

其他客户端能够透明地重新连接和恢复连接状态,因此您不会在应用程序代码中获得任何异常。