Apache HttpClient 临时错误:NoHttpResponseException

新手上路,请多包涵

我有一个 web 服务,它接受 XML 的 POST 方法。它工作正常,然后在某个随机场合,它无法与服务器通信并抛出 IOException 消息 The target server failed to respond 。随后的调用工作正常。

它主要发生在我拨打一些电话然后让我的应用程序闲置 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);

但是这次重试从未被调用过。 (是的,我使用的是正确的 instanceof 子句)。在调试此类时从未调用过。

我什至尝试设置 HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); 但没有用。有人可以建议我现在可以做什么吗?

重要 除了弄清楚为什么我会得到异常,我的一个重要问题是为什么重试处理程序不在这里工作?

原文由 Em Ae 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

连接管理器保持活动状态的持久连接很可能变得陈旧。也就是说,目标服务器在其端关闭连接而 HttpClient 无法对该事件做出反应,而连接处于空闲状态,从而使连接处于半关闭状态或“失效”状态。通常这不是问题。 HttpClient 使用多种技术在从池租用时验证连接的有效性。即使失效连接检查被禁用并且失效连接用于传输请求消息,请求执行通常在写入操作中失败并出现 SocketException 并自动重试。然而,在某些情况下,写操作可以无异常终止,随后的读操作返回 -1(流结束)。在这种情况下,HttpClient 别无选择,只能假设请求成功但服务器未能响应,这很可能是由于服务器端出现意外错误。

补救这种情况的最简单方法是在一段时间不活动后从池中逐出过期连接和空闲时间超过 1 分钟的连接。详情请看HttpClient 4.5教程的 2.5. Connection eviction policy

原文由 ok2c 发布,翻译遵循 CC BY-SA 4.0 许可协议

接受的答案是正确的,但缺乏解决方案。为避免此错误,您可以像 此答案 中那样为您的 HTTP 客户端添加 setHttpRequestRetryHandler(或 setRetryHandler for apache components 4.4)。

原文由 Jehy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题