redis 好像服务器已经关闭了连接 [英] redis It seems like server has closed the connection

查看:104
本文介绍了redis 好像服务器已经关闭了连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 redis sub/pub,但是当我订阅一个频道时,2 分钟后,控制台输出异常:服务器好像已经关闭了连接.

i want to use redis sub/pub, but when i subscribe one channel, 2 minutes after,console output Exception: It seems like server has closed the connection.

redis 版本:redis-3.0.3

redis version:redis-3.0.3

绝地武士版本:2.3.0

jedis version:2.3.0

os:OS X Yosemite 10.10.5

os:OS X Yosemite 10.10.5

订阅类

    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 分钟:

then 2 minutes after console output:

[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)

谁能帮帮我?非常感谢!

anyone can help me? very thanks!

推荐答案

我不是 OSX 用户,但可能是操作系统配置为终止超过 120 秒的 TCP 连接.您是否尝试将 tcp-keepalive 选项设置为某个值(例如 30 秒)以检查连接是否仍然中断?

I'm not an OSX user but it might be the OS that's configured to kill TCP connections that exceed the 120 seconds. Have you tried setting the tcp-keepalive option in some value (like 30 secs) to check if the connection still dies?.

这篇关于redis 好像服务器已经关闭了连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆