Как правильно обрабатывать ошибки HTTP-запроса? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть простой http-клиент, который передает каждый запрос в ExecutorService и применяет их с задержкой.

    protected static final int RETRY_ATTEMPTS = 5;
    private static final int GROUP_REQUEST_DELAY_MS = 55;
    private static final ScheduledExecutorService REQUEST_FROM_USER_EXECUTOR = 
        Executors.newSingleThreadScheduledExecutor();

    public RequestResponse post(String url) throws IOException {
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = call(httpPost);

        return new RequestResponse(
            httpResponse.getStatusLine().getStatusCode(),
            EntityUtils.toString(httpResponse.getEntity()),
            headers(httpResponse.getAllHeaders())
        );
    }

    private HttpResponse call(HttpRequestBase request) throws IOException {
        int attempts = 0;

        HttpResponse httpResponse = null;
        SocketException socketException = null;
        do {
            try {
                httpResponse = client.execute(request);
            } catch(SocketException e) {
                socketException = e;
            }

            if(httpResponse != null)
                break;

            attempts++;
            log.debug("Attempt: {}, SocEx: {}", attempts, socketException != null);
        }while(attempts < RETRY_ATTEMPTS);

        if(httpResponse == null)
            // TODO

        if(socketException != null) {
            log.error("Network problem");
            logRequest(request, httpResponse);
            throw socketException;
        }

        return httpResponse;
    }

    public synchronized Future<RequestResponse> sendAsGroup(String url) {
        return REQUEST_FROM_GROUP_EXECUTOR.schedule(() -> post(url), GROUP_REQUEST_DELAY_MS, TimeUnit.MILLISECONDS);
    }

Иногда сервер выдает ошибку http 504 или около того. Я хочу обработать эту ошибку и повторно отправить этот запрос. Как я могу сделать это правильно, не превышая лимит для запросов к серверу?

1 Ответ

1 голос
/ 08 ноября 2019

Вы должны использовать HttpRequestRetryHandler для восстановления после ошибок транспортного уровня (TCP) и ServiceUnavailableRetryStrategy для повторного выполнения запроса в случае ошибки уровня протокола (HTTP).

...