我有一个XML服务,它接受带有XML的POST方法。它工作得很好,然后在一些随机的场合,它无法与抛出消息The target server failed to respond
的IOException服务器通信。随后的调用可以正常工作。
最常见的情况是,当我发出一些调用,然后让我的应用程序空闲10-15分钟。之后我进行的第一个调用返回了这个错误。
我试过几件事...
我将重试处理程序设置为
HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
public boolean retryRequest(IOException e, int retryCount, HttpContext httpCtx) {
if (retryCount >= 3){
Logger.warn(CALLER, "Maximum tries reached, exception would be thrown to outer block");
return false;
}
if (e instanceof org.apache.http.NoHttpResponseException){
Logger.warn(CALLER, "No response from server on "+retryCount+" call");
return true;
}
return false;
}
};
httpPost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryHandler);
但是这个重试从未被调用过。(是的,我使用的是right instanceof子句)。在调试这个类时,从未被调用过。
我甚至尝试过设置HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
,但都没有用。有人能建议我现在能做些什么吗?
重要除了弄清楚我为什么会得到异常之外,我最关心的一个重要问题是为什么重试处理程序不能在这里工作?
发布于 2012-05-15 20:34:36
连接管理器保持活动状态的持久连接很可能会变得陈旧。也就是说,当连接空闲时,目标服务器关闭其一端的连接,而HttpClient无法对该事件做出反应,从而使连接处于半关闭状态或“陈旧”状态。通常这不是问题。在从池租用连接时,HttpClient使用多种技术来验证连接的有效性。即使禁用了过时的连接检查,并且使用过时的连接来传输请求消息,请求的执行通常也会在使用SocketException的写操作中失败,并且会自动重试。但是,在某些情况下,写操作可以无异常地终止,随后的读操作返回-1 (流结束)。在这种情况下,HttpClient别无选择,只能假设请求成功,但服务器无法响应,这很可能是由于服务器端发生了意外错误。
纠正这种情况的最简单方法是从池中清除过期的连接和空闲时间超过1分钟的连接。详情请参见this section of the HttpClient tutorial。
发布于 2016-06-07 20:55:31
公认的答案是正确的,但缺乏解决方案。为了避免这个错误,你可以为你的超文本传输协议客户端添加setHttpRequestRetryHandler (或者apache组件4.4的setRetryHandler ),就像在this answer中一样。
发布于 2017-12-12 17:48:18
在返回给请求者之前,HttpClient 4.4遇到了一个与验证可能过时的连接相关的错误。它不会验证连接是否陈旧,这会导致立即产生NoHttpResponseException
。
此问题已在HttpClient 4.4.1中得到解决。请参阅this JIRA和release notes
https://stackoverflow.com/questions/10558791
复制相似问题