Перейти к основному содержимому

Как выполнять повторные попытки с помощью Restclient

Profile picture
Автор
Harpal Singh
Software Engineer
Profile picture
Автор
Namastecode
Оглавление

1. Введение

В этом кратком руководстве мы узнаем, как реализовать retryable calls с помощью RestClient и spring-retry.

Иногда network connections могут быть ненадёжными, что приводит к временным сбоям при выполнении HTTP requests. Причин таких сбоев может быть много, поэтому нам нужно системно их обрабатывать.

Мы знаем, что WebClient предоставляет из коробки механизм retry. Однако RestClient всё ещё нуждается в этой возможности. Давайте посмотрим, как использовать spring-retry, библиотеку, которая позволяет повторять неудачные операции.

2. Настройка spring-retry

Вкратце, spring-retry предлагает простой подход к реализации возможностей retry с помощью annotations. Кроме того, мы можем настраивать поведение по своему усмотрению. Но сначала нам нужно импортировать последнюю версию spring-retry и spring-aspects в наш проект:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>2.0.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>6.1.4</version>
</dependency>

Теперь мы можем использовать аннотацию @Retryable. Давайте применим её к методу сервиса, который инкапсулирует вызов RestClient.

3. Настройте RestClient с помощью @Retryable

Наконец, мы можем аннотировать метод с помощью @Retryable, чтобы включить функциональность retry. Кроме того, мы можем настроить поведение retry, например, задать backoff policy:

@EnableRetry
public class ExampleService {
    @Retryable(maxAttempts = 5, backoff = @Backoff(delay = 1000))
    public String performRestCall() {
        return restClient
        .get()
        .uri("https://example.com")
        .retrieve()
        .body(String.class);
    }
}

Выше мы используем @EnableRetry, чтобы активировать политику повторных попыток, и аннотируем метод сервиса @Retryable. Это эмулирует post call к примеру URI и возвращает String. Мы должны аннотировать с помощью @EnableRetry; в противном случае аннотация @Retryable будет проигнорирована.

3.1. Повторные попытки при Exceptions

В некоторых случаях мы можем захотеть повторно выполнить метод, когда возникает исключение. Для этого мы можем использовать атрибут retryFor аннотации @Retryable. Например, мы можем повторить вызов метода, когда выбрасывается CustomException:

@Retryable(maxAttempts = 5, retryFor = {CustomException.class})
public String performRestCallWithCustomException() {
    // ...
    // throws CustomException
}

Как мы видим, мы можем легко настроить retry behavior так, как мы хотим.

4. Заключение

В этом руководстве мы научились реализовывать механизм повторных попыток с помощью RestClient и spring-retry. Мы также увидели, как использовать аннотацию @Retryable для включения функциональности повторных попыток и настройки поведения при повторе.

Мы можем посмотреть полный code on Github.

Related

Запуск PostgreSQL в Docker Container
Давайте узнаем, как запустить PostgreSQL в Docker container с помощью этого пошагового руководства. Используя Docker, мы сможем легко настроить и обеспечить portability нашей PostgreSQL database.