gpt4 book ai didi

java - Apache HttpClient 临时错误 : NoHttpResponseException

转载 作者:IT老高 更新时间:2023-10-28 13:54:00 31 4
gpt4 key购买 nike

我有一个接受 XML POST 方法的网络服务。它工作正常,然后在某些随机情况下,它无法与抛出 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);

但是这个重试从来没有被调用过。 (是的,我正在使用正确的 instanceof 子句)。在调试此类时永远不会被调用。

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

重要除了弄清楚为什么会出现异常之外,我最关心的一个重要问题是为什么 retryhandler 不在这里工作?

最佳答案

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

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

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com