我认为Spymemcached在此连接丢失时会尝试重新建立与服务器的连接。
但我看到了不同的东西;想知道我误解了什么或者我做错了什么。以下是一些示例代码:
MemcachedClient c=new MemcachedClient(AddrUtil.getAddresses("server:11211"));
while(true)
try {
System.out.println(c.get("hatsts"));
Thread.sleep(10000);
} catch(Exception e) {
e.printStackTrace();
}
它最初运行没有问题。然后我拉网络插头。随后,客户端检测到网络故障并抛出异常:
net.spy.memcached.OperationTimeoutException: Timeout waiting for value
但是,当我重新建立网络时,客户端无法恢复并继续抛出异常;甚至在5分钟后。我试过SpyMemcached 2.10.6和2.9.0。
我错过了什么?
答案 0 :(得分:8)
这里的问题是,因为您拉动了网络电缆,客户端上的tcp套接字仍认为连接有效。 tcp keepalive因操作系统而异,可能高达30分钟。因此,应用程序(在本例中为Spymemcached)不会通知tcp层连接不再有效,因此Spymemcached不会尝试重新连接。
Spymemcached检测到这种情况的方法是计算连续操作超时的数量。我最后一次检查默认值是99.一旦这多个操作超时,Spymemcached将重新连接。如果要将其设置为其他值,可以在ConnectionFactory中更改此值。有一个名为getContinuousTimeout()的函数,默认情况下,Spymemcached从中获取99。您可以使用ConnectionFactoryBuilder构建自己的ConnectionFactory。
希望这足以回答您的问题,让您朝着正确的方向前进。如果没有让我知道,我可以添加更多细节。