【发布时间】:2010-11-12 17:12:14
【问题描述】:
我们最近看到了这个错误。服务器向其中一个客户端发送了响应消息 (MSG1)(消息大小 > 64KB)。客户端读取时发生了一些事情,根本没有收到此消息。 SocketTimeOutException 和 IOException 都没有被抛出。服务器尝试发送另一条消息 (MSG2),但在写入时被阻止(TCP/IP 级别的缓冲区可能已被 MSG1 填满)。在我们意识到这一点并不得不重新启动一切之前已经过去了 2 个小时。我们设法通过让客户端读取速度变慢(暂停 2 秒)并使服务器像往常一样发送类似的消息(大小 >64KB)来模拟相同的事情。
首先,我们看不出客户端阅读速度慢的原因,几个月来它一直能够毫无问题地处理此类消息。我想知道(a)如果客户端读取了导致这种死锁的原因
getInputStream().read(byBuf)
比服务器写入慢getOutputStream().write(MSG1)
(byBuf 是一个大小为 512Bytes 的字节缓冲区)
(b) 套接字错误或 n/w 错误是否会导致这种阻塞?
我们使用的是 jdk 1.6.0。
非常感谢!
【问题讨论】:
-
如果您可以通过测试重现这一点,您应该启动 Wireshark 并查看网络跟踪以了解发生了什么。