所以,我有两个使用jedis的应用程序。它们都连接到同一个服务器,并且一个侦听发布以检查是否写入了某些内容。好吧,经过大约10个小时的连续使用和加载,设置/获取/发布/发布后,jedis返回Broken Pipe。我不知道为什么,因为我在jedis中超时为0。有什么想法吗?
答案 0 :(得分:0)
根据我的发现,Jedis保持与Redis的开放连接,并且不检查这些连接的状态。如果连接在空闲时间中断(网络重置或暂时断开连接或连接超时),Jedis连接池将基本无效,但Jedis客户端将不会报告,直到您尝试向管道发送命令。 以下是关于github的讨论:https://github.com/xetorthio/jedis/issues/185
我解决这个问题的方法是在发送任何数据之前发送“ping”:
private Jedis getResource() {
Jedis jedis;
try{
jedis = pool.getResource();
jedis.ping();
} catch (JedisException e) {
pool.destroy();
pool = getPool(this.url);
jedis = pool.getResource();
}
return jedis;
}
public String get(EphemeralKey key, EphemeralLocation location) throws Exception {
String encodedKey = encodeKey(key, location);
try (Jedis jedis = getResource()) {
return jedis.get(encodedKey);
} catch (JedisException e) {
throw wrapJedisException(e);
}
return null;
}