我的客户端损坏管道的套接字异常。
[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会导致这样的问题吗?
答案 0 :(得分:1)
连接管理器保持活动状态的持久连接变得陈旧。也就是说,目标服务器在其端部关闭连接,而HttpClient无法对该事件做出反应,同时连接处于空闲状态,从而使连接处于半封闭状态或“静止”状态。 这是Java中阻塞I / O的一般限制。除了尝试从套接字读取之外,根本无法找出对端是否有关闭连接。
如果使用陈旧连接来传输请求消息,则在使用SocketException的写操作中,请求执行通常会失败并自动重试。 Apache HttpClient通过采用如此陈旧的连接检查来解决这个问题,这种检查本质上是一个非常简短的读取操作。但是,检查可以并且经常被禁用。实际上,由于检查引入的额外延迟,通常建议将其禁用。 版本4.4中更改了过时连接的处理。以前,代码会在重新使用之前默认检查每个连接。现在,代码仅检查连接,如果自上次使用连接以来经过的时间超过已设置的超时。默认超时设置为2000ms