java - Apache HttpClient 临时错误 : NoHttpResponseException

标签 java httpclient

我有一个 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); 但没有用。有人可以建议我现在可以做什么吗?

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

最佳答案

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

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

关于java - Apache HttpClient 临时错误 : NoHttpResponseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33278760/

相关文章:

Java 性能历史

java - Gson在json中存储对象类型

java - 无法使用 hasNext 跳出循环

android - 访问 api.twitter.com 时出现 UnknownHostException

java - 完全难住了,HTTP 客户端 Android

java - 使用 Micrometer 指标运行 SpringBoot 2 应用程序时出错

java - 如何使用java从linux访问nsf文件并在window中使用数据库

java - 使用 HTTPClient 获取网页文本

java - 使用 HTTPClient 下载数据

iphone - (iPhone) AFNetworking 对不同的操作使用相同的共享客户端?