1

我正在尝试在我的 Android 应用程序中实现 HttpRequestRetryHandler。我在这里阅读了 HttpRequestRetryHandler 的文档。

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 请求?

4

1 回答 1

1

我认为这只是实施的一个例子RetryHandler

问题1 为什么不应重试InterruptedIOException?

在这个例子中,我相信它假设超时的原因是resource unavailability at URL,因此重试不会做得更好。这就是原因,它被设置为假。如果在您的情况下,您认为这可能只是因为连接速度慢或一些间歇性问题,请随时将其设置为 true 以重试。

问题 2 如何知道哪些异常要重试,哪些不应该重试?例如 - 我们是否应该重试 ConnectionTimeoutException 和 SocketTimeoutException?

任何异常,您认为这是由于暂时性问题,您可以重试。任何其原因在性质上更持久的异常,例如未找到资源或某些业务异常,都不应该重试,因为它们总是会失败。

问题 3 这是否意味着我们不应该重试 POST 和 PUT 方法,如果不是,那么我们应该如何重试 HttpPost 请求?

仅在您可以在没有任何外部依赖的情况下重新启动进程的情况下才允许重试。

于 2012-11-20T19:54:56.463 回答