我正在尝试在我的Android应用中实现HttpRequestRetryHandler。我已阅读HttpRequestRetryHandler here的文档。
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {
public boolean retryRequest(
IOException exception,
int executionCount,
HttpContext context) {
if (executionCount >= 5) {
// Do not retry if over max retry count
return false;
}
if (exception instanceof InterruptedIOException) {
// Timeout
return false;
}
if (exception instanceof UnknownHostException) {
// Unknown host
return false;
}
if (exception instanceof ConnectException) {
// Connection refused
return false;
}
if (exception instanceof SSLException) {
// SSL handshake exception
return false;
}
HttpRequest request = (HttpRequest) context.getAttribute(
ExecutionContext.HTTP_REQUEST);
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}
return false;
}
};
httpclient.setHttpRequestRetryHandler(myRetryHandler);
文档中的示例说明不应重试某些异常。例如,不应重试InterruptedIOException。
问题1 为什么不应该重试InterruptedIOException?
问题2 如何知道要重试的哪个例外,哪个不应该?例如 - 我们应该重试ConnectionTimeoutException和SocketTimeoutException吗?
另外文档说 HttpClient假设非实体封闭方法(如GET和HEAD)幂等,而实体封闭方法(如POST和PUT)则不是。
问题3 这是否意味着我们不应该重试POST和PUT方法,如果没有,那么我们应该如何重试HttpPost请求?
答案 0 :(得分:1)
我认为它只是RetryHandler
实施的一个例子。
问题1为什么不应该重试InterruptedIOException?
在这个例子中,我认为超时的原因是resource unavailability at URL
,因此重试不会做得更好。这就是原因,它被设置为假。如果在您的情况下,您认为可能仅仅是因为连接速度缓慢或某些间歇性问题,请随意将其设置为重试。
问题2如何知道要重试的哪个例外,哪个不应该?例如 - 我们应该重试ConnectionTimeoutException和SocketTimeoutException吗?
任何例外,您认为这是因为暂时性问题,您可以重试。任何例外,其原因在性质上更具永久性,例如:找不到资源或不应重试某些业务异常,因为它们总是会失败。
问题3这是否意味着我们不应该重试POST和PUT方法,如果没有,那么我们应该如何重试HttpPost请求?
仅允许在没有任何外部依赖关系的情况下重新启动进程的情况下重试。