java - 多个完整的 HTTP 请求卡在 TCP CLOSE_WAIT 状态

标签 java http tcp sockets

我有一个基于 Java 和 Tomcat 的服务器应用程序,它向其他网站发起许多出站 HTTP 请求。我们使用 Jakarta 的 HTTP 核心/客户端库,最新版本。

服务器在某个时候锁定,因为它的所有工作线程都在尝试关闭已完成的 HTTP 连接。使用“lsof”会发现一堆卡在 TCP CLOSE_WAIT 状态的套接字。

这不会发生在所有连接上,甚至不会发生在大多数连接上。事实上,我之前看到它并通过确保设置 Connection: Close 响应 header 来解决它。所以这让我认为这可能是远程服务器的不良行为。

自从我将应用程序移动到一个全新的服务提供商后,它可能又出现了——不同的操作系统、网络情况。

但是,我仍然不知道我能做些什么来解决这个问题。一些在互联网上四处闲逛并没有发现我还没有做的任何事情。只是想问问是否有人看到并解决了这个问题?

最佳答案

我不确定您对 TCP 了解多少。当 TCP 客户端处于 ESTABLISHED 状态并接收到 FIN 数据包时,它会进入 CLOSE_WAIT 状态。 CLOSE_WAIT 状态意味着它正在等待接收来自应用层的 close 命令 - 在这种情况下,这意味着它正在等待 close() 在套接字上调用。

因此,我的猜测是在工作线程中调用 close() 可以解决问题。或者您已经在这样做了?

关于java - 多个完整的 HTTP 请求卡在 TCP CLOSE_WAIT 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394281/

相关文章:

java - 我们可以使用反射获取本地类吗?

Java 弹跳球游戏 - 滚球场景

java - 使用 OWL API 检索 OWL 类限制

作为 Windows 服务的 Python XML-RPC 服务器

c# - WCF 服务无法捕获客户端的崩溃

java - 异常 :java. text.ParseException:无法解析的日期: "02/15/2012"

python - 输入 url mysite.com 在生产环境中得到 `HTTP/1.1"500 5837` - i18n

c# - HttpWebRequest 是否自动发送 200 OK?

sockets - erlang 发送套接字西里尔字符数据

sockets - 通过闭合连接确定主体长度如何可靠(RFC 2616 4.4.5)