重试一个http连接

我正在做一个http请求。 我在一个平台(android)networking操作经常失败,因为networking连接可能不会立即可用。 因此,我想在完全失败之前尝试相同的连接N次。 想到这样的事情:

DefaultHttpClient mHttp = ...; public HttpResponse runHttpRequest(HttpRequestBase httpRequest) throws IOException { IOException last = null; for (int attempt = 0; attempt < 3; attempt++) { try { HttpResponse response = mHttpClient.execute(httpRequest); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { return response; } } catch (IOException e) { httpRequest.abort(); last = e; } } throw last; } 

我最担心的是连接处于某种状态,在以后的重试中是无效的。 换句话说,我是否需要完全重新创build“httpRequest”,是否应该避免在catch块中调用httpRequest.abort(),并且只在最终失败时调用它?

谢谢

Solutions Collecting From Web of "重试一个http连接"

文档没有提到这样的事情会发生,尽pipe你必须尝试。 更重要的是,有一些事情,你应该考虑你的代码…

  1. 您应该公开一些重试次数,允许调用者指定这个值。
  2. 您应该只在发生exception时才重试; 你现在重试,除非你得到了200.但是,如果,例如,你得到一个404 …这并不意味着你的请求失败的意义上说,networking没有失败……相反,旅行到服务器,但服务器根本没有请求的资源…所以在这种情况下重试是没有意义的。
  3. 按原样,您可以禁止各种不同types的exception。 logging列表中发生的所有exception并返回某种包含响应的结果对象(如果所有尝试都失败,可能为空),以及所有exception的列表都可能是有意义的。 否则,您从发生的一组exception中抛出一些任意的exception,可能会掩盖失败。
  4. 现在你只要一遍又一遍地去处理相同的请求…如果出现拥塞,你只需要添加它就可以了。 如果你的IP地址被禁止太多的活动,你可能会添加到…任何types的重试逻辑应该有一个回退行为,有一定量的重试之间的等待时间间隔增加每次失败。

HttpRequestRetryHandler好像在这里可能会有所帮助。

我build议使用jcabi-aspects (我是开发人员)的AOP和Java注释:

 @RetryOnFailure(attempts = 3, delay = 5) public String load(URL url) { return url.openConnection().getContent(); }