java - Apache HttpClient 临时错误 : NoHttpResponseExce

我有一个 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/

相关文章:

c# - 在 WPF 应用程序中单击按钮会重置文化

python - 无法使用 OS X El Capitan pip 安装任何东西

android - ViewPager setCurrentItem 不流畅

jakarta-ee - 缺少 [类(class)] 的类(class)详细信息。为 [class]

python - Pytest 在使用预定义参数 vai argparse 运行测试时抛出参数错误

c# - 将可为空的 int 映射到可为空的 int + automapper

python - 标准Django/python单位转换包

java - 带有 GIT 命令的 ProcessBuilder 没有给出结果

linux-kernel - Linux 内核模块在卸载期间挂起

django - 如何在 Django 1.8 中动态更改模板路径