我认为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分钟后,我也尝试了SpyMemcached2.10.6和2.9.0。
我错过了什么?
1条答案
按热度按时间j2cgzkjk1#
这里的问题是,由于您拔出了网络电缆,客户端上的tcp套接字仍然认为连接有效。tcp keepalive因操作系统而异,最长可达30分钟。因此,应用程序(在本例中是spymemcached)不会被tcp层通知连接不再有效,因此spymemcached不会尝试重新连接。
spymemcached检测这种情况的方法是计算连续操作超时的数量。上次我检查默认值是99。一旦这么多操作超时,spymemcached将重新连接。如果要将此值设置为其他值,可以在connectionfactory中更改此值。有一个名为getcontinuoustimeout()的函数,默认情况下,spymemcached从中获取99。您可以使用connectionfactorybuilder构建自己的connectionfactory。
希望这是足够的信息来回答你的问题,让你朝着正确的方向前进。如果不让我知道,我可以补充一些细节。