2015-12-07 5 views
3

Я хочу использовать redis sub/pub, но когда я подписываюсь на один канал, через 2 минуты после выхода консоли Исключение: Кажется, сервер закрыл соединение.redis Кажется, сервер закрыл соединение

Redis версия: Redis-3.0.3

Jedis версия: 2.3.0

ОС: OS X Yosemite 10.10.5

Subscribe.class

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
    jedisPoolConfig.setMaxIdle(10); 
    jedisPoolConfig.setMaxWait(4000); 
    jedisPoolConfig.setTestOnBorrow(true); 
    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379); 

    final Jedis jedis = jedisPool.getResource(); 
    System.out.println(jedis.configGet("timeout")); 
    System.out.println(jedis.configGet("tcp-keepalive")); 
    final JedisPubSub jedisPubSub = new JedisPubSub() { 
     @Override 
     public void onMessage(String channel, String message) { 
      System.out.println("onMessage"); 
     } 

     @Override 
     public void onPMessage(String pattern, String channel, String message) { 
      System.out.println("onPMessage"); 
     } 

     @Override 
     public void onSubscribe(String channel, int subscribedChannels) { 
      System.out.println("onSubscribe"); 
     } 

     @Override 
     public void onUnsubscribe(String channel, int subscribedChannels) { 
      System.out.println("onUnsubscribe"); 
     } 

     @Override 
     public void onPUnsubscribe(String pattern, int subscribedChannels) { 
      System.out.println("onPUnsubscribe"); 
     } 

     @Override 
     public void onPSubscribe(String pattern, int subscribedChannels) { 
      System.out.println("onPSubscribe"); 
     } 
    }; 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    System.out.println(dateFormat.format(new Date())); 
    jedis.subscribe(jedisPubSub, "/atm/test"); 

Опубликовать. класс

Jedis jedis = new Jedis("127.0.0.1", 6379); 
jedis.publish("/atm/test", "lqiaing---hello"); 

затем 2 минуты после выхода консоли:

[timeout, 0] 
[tcp-keepalive, 0] 
2015-12-03 19:01:55 
onSubscribe 
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: 
It seems like server has closed the connection. 
at redis.clients.util.RedisInputStream.readLine(RedisInputStream.java:91) 
at redis.clients.jedis.Protocol.processMultiBulkReply(Protocol.java:110) 
at redis.clients.jedis.Protocol.process(Protocol.java:63) 
at redis.clients.jedis.Protocol.read(Protocol.java:122) 
at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:196) 
at redis.clients.jedis.JedisPubSub.process(JedisPubSub.java:88) 
at redis.clients.jedis.JedisPubSub.proceed(JedisPubSub.java:83) 
at redis.clients.jedis.Jedis.subscribe(Jedis.java:1974) 
at Subscribe.main(Subscribe.java:63) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

кто может мне помочь? очень спасибо

ответ

0

Я не пользователь OSX, но это может быть ОС, которая настроена на то, чтобы убивать TCP-соединения, которые превышают 120 секунд. Пробовали ли вы установить параметр tcp-keepalive в некотором значении (например, 30 секунд), чтобы проверить, все ли соединение еще умирает ?.

+0

Благодарим вас за ответ. Я устанавливаю tcp-keepalive = 10 и timeout = 10, а также тестирую на windows и систему ubuntu. но все же выводят это исключение. – jonnyLee