【问题标题】:socketException broken pipe upon upgrading httpclient jar version to 4.5.3将 httpclient jar 版本升级到 4.5.3 时,socketException 损坏了管道
【发布时间】:2018-08-17 13:26:36
【问题描述】:

我的客户端出现管道损坏的套接字异常。

[write] I/O 错误:连接已关闭:javax.net.ssl.SSLException: java.net.SocketException: Broken pipe (Write failed) [LoggingManagedHttpClientConnection::shutdown] http-outgoing-278: 关闭连接 1520546494584[20180308 23:01:34] [ConnectionHolder::abortConnection] 连接被丢弃 1520546494584[20180308 23:01:34] [BasicHttpClientConnectionManager::releaseConnection] 释放连接[未绑定]

似乎是httpclient jar的升级引起了问题。

httpclient-4.3.2 没有问题

每 2 分钟出现一次异常。问题有时是间歇性的。

之后,发送 expect:100-continue ,conn.flush 抛出异常

客户端和服务器都是Linux机器

客户端使用 http jar 向服务器 REST 发出请求。

请帮助我调试问题

httpjar 会导致这样的问题吗?

【问题讨论】:

  • 有人可以回答这个问题吗?

标签: client-server httpclient socketexception


【解决方案1】:

连接管理器保持活动的持久连接变得陈旧。也就是说,目标服务器在连接处于空闲状态时关闭其端的连接,而 HttpClient 无法对该事件做出反应,从而使连接半关闭或“陈旧” 这是 Java 中阻塞 I/O 的一般限制。除了尝试从套接字读取之外,根本没有办法找出对端端点是否已关闭连接。

如果使用过时的连接来传输请求消息,则请求执行通常会在写入操作中失败并出现 SocketException 并自动重试。 Apache HttpClient 通过使用过时的连接检查来解决这个问题,这本质上是一个非常简短的读取操作。但是,检查可以并且经常被禁用。事实上,由于检查引入的额外延迟,通常建议禁用它。 在 4.4 版中更改了旧连接的处理。以前,代码会在重新使用之前默认检查每个连接。该代码现在仅在自上次使用连接后经过的时间超过已设置的超时时才检查连接。默认超时设置为 2000 毫秒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多