解决JedisClient出现“Unexpect end of

2017-03-27  本文已影响239人  dayspring

问题介绍

最近查看生产日志,在日志中发现一些“Unexpect end of stream”的报错,这个异常之前也出现过,但之前出现的次数都比较少,没太引起注意,最近出现的此类错误的次数越来越多,于是引起了重视。

环境介绍

Jedis的版本是:2.7.3
redis的版本是:2.6.0
jedis的配置如下:

<bean id="jedisConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
  <property name="maxToal" value="100" />
  <property name="maxIdle" value="100" />
  <property name="minIdle" value="10" />
  <property name="testWhileIdle" value="true" />
  <property name="minEvictableIdleTimeMillis" value="160000" />
</bean>

解决过程

后记

为啥Jedis在抛出该错误的时机是读取redis返回结果的时候抛出异常呢?而不是在写redis命令到redis的时候报异常呢?具体参考RedisInputStream类。一开始我也不解,为了重现此类场景我模拟了客户端与服务端的通信,并让服务端主动关闭连接,结果与此现象一致。
原因是tcp的四次挥手机制,服务端关闭连接后,客户端会马上返回一个ack,使服务端从fin-wait-1 -> fin-wait-2状态,客户端处于close-wait状态,我们知道处于close-wait状态的一端可以继续往另一端发送数据而不能读取数据。

上一篇 下一篇

猜你喜欢

热点阅读