Java SpymeCached和连接故障

Java SpymeCached和连接故障,java,memcached,spymemcached,Java,Memcached,Spymemcached,我认为SpymeCached会在该连接丢失时尝试重新建立与服务器的连接 但我看到了一些不同的东西;想知道我误解了什么或者我做错了什么。以下是一些示例代码: MemcachedClient c=new MemcachedClient(AddrUtil.getAddresses("server:11211")); while(true) try { System.out.println(c.get("hatsts")); Thread.sleep(10000); } catch(E

我认为SpymeCached会在该连接丢失时尝试重新建立与服务器的连接

但我看到了一些不同的东西;想知道我误解了什么或者我做错了什么。以下是一些示例代码:

 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分钟后,我也尝试了SpymeCached 2.10.6和2.9.0


我遗漏了什么?

这里的问题是,由于您拔出了网络电缆,客户端上的tcp套接字仍然认为连接有效。tcp keepalive因操作系统而异,最高可达30分钟。因此,tcp层不会通知应用程序(在本例中为SpymeMached)连接不再有效,因此SpymeMached不会尝试重新连接

SpymeMached检测这种情况的方法是通过计算连续操作超时的数量。上次我检查默认值是99。一旦此多次操作超时,SpymeMAcached将重新连接。如果要将此值设置为其他值,可以在ConnectionFactory中更改此值。有一个名为getContinuousTimeout()的函数,默认情况下,SpymeCached从中获取99。您可以使用ConnectionFactoryBuilder构建自己的ConnectionFactory


希望这是足够的信息来回答你的问题,让你朝着正确的方向前进。如果您不告诉我,我可以添加更多细节。

确实如此。使用net.spy.memcached.spring.MemcachedClientFactoryBean,必须调整的属性称为timeoutExceptionThreshold。我将其设置为10,然后我看到与Memcached的重新连接正在顺利进行。