将httpclient jar版本升级到4.5.3时,socketException断开管道

时间:2018-03-09 02:53:36

标签: client-server httpclient socketexception

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

  

[write] I / O错误:连接已关闭:javax.net.ssl.SSLException:java.net.SocketException:管道损坏(写入失败)    [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分钟就会发生异常。问题有时是间歇性的。

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

客户端和服务器是Linux机器

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

请帮我调试问题

httpjar会导致这样的问题吗?

1 个答案:

答案 0 :(得分:1)

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

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