当前位置: 首页 > 面试题库 >

Apache HttpClient临时错误:NoHttpResponseException

轩辕经赋
2023-03-14
问题内容

我有一个Web服务正在接受XML的POST方法。它工作正常,然后在某个随机的时刻,它无法与服务器通信,并抛出message,并抛出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);但没有用。有人可以建议我现在可以做什么吗?

重要事项 除了弄清楚为什么我会得到例外,我还有一个重要的担忧是为什么重试处理程序不在这里工作?


问题答案:

由连接管理器保持活动状态的最有可能的持久连接变得陈旧。也就是说,目标服务器会在其连接空闲时关闭其末端的连接,而HttpClient无法对该事件做出反应,从而使连接半关闭或“陈旧”。通常这不是问题。HttpClient使用多种技术来验证从池中租借时的连接有效性。即使禁用了过时的连接检查并且使用了过时的连接来传输请求消息,请求执行通常也会在具有SocketException的写操作中失败,并会自动重试。但是,在某些情况下,写操作可以毫无例外地终止,随后的读操作将返回-1(流的结尾)。

解决此问题的最简单方法是将过期的连接和闲置了超过一段时间(例如,在池中闲置一分钟之后)之后空闲的连接驱逐出去。有关详细信息,请参见HttpClient教程的本节。



 类似资料:
  • 错误:任务“app:transformClassesWithDexForDebug”的执行失败。

  • 我有下面的DB对象和Java程序,当我尝试从Java调用Oracle的存储过程时,我无法得到临时表count.Am缺少一些东西,但我不知道wrong.Please帮助我找到错误code.When我调用的过程使用oracle语句直接在oracleSQL开发人员能够得到临时table.After每次调用插入过程它插入计数,并正确地在Oracle语句调用和Java.But当我尝试使用JDBC时,只有插入

  • 我的Java代码使用共享的ApacheHttpClient 4.4。1.我将每个POST请求级别上的连接超时、套接字超时和连接请求超时设置为100毫秒。它大部分时间都很好用。然而,在大量请求(压力测试)时,HttpClient忽略这些超时;请求可能需要20秒或更长时间。这是我的密码: 在某些情况下,我会得到如下日志记录: 2018-10-26 14:18:45496[my-thread-1]调试c

  • 问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变

  • 服务器成功启动并接受数据,但当我检索数据时,却出现以下错误: O.a.c.c.[.[/].[dispatcherServlet]:路径为[]的上下文 中servlet[dispatcherServlet]的servlet.Service()引发异常[请求处理失败;嵌套异常为 org.springframework.data.MongoDb.UncategorizedMongoDbException

  • 失败:生成失败,出现异常。 null