spymemached和连接失败

neskvpey  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(267)

我认为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。
我错过了什么?

j2cgzkjk

j2cgzkjk1#

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

相关问题