Повторное выполнение Mono с начала цепочки

Вопрос или проблема

В данный момент, когда возникает ForbiddenException, метод makeRequest повторно вызывается. Вместо этого я хотел бы, чтобы метод getAuthToken вызывался перед повторной попыткой метода makeRequest.

Кто-нибудь знает, как это сделать?

client
.getAuthToken()
.flatMap(token -> client.makeRequest(token))
.retryWhen(Retry.backoff(1, Duration.ofSeconds(1)).filter(ForbiddenException.class::isInstance));

Ответ или решение

Чтобы реализовать логику повторных попыток для вызова метода makeRequest, с предварительным вызовом метода getAuthToken при возникновении исключения ForbiddenException, вы можете воспользоваться оператором flatMap и функцией retryWhen для управления потоком данных.

Ниже приведен пример, который демонстрирует, как это можно реализовать:

client
    .getAuthToken()
    .flatMap(token -> client.makeRequest(token))
    .retryWhen(errors ->
        errors
            .filter(ForbiddenException.class::isInstance)
            .flatMap(error -> {
                // Вызываем getAuthToken перед повторной попыткой
                return client.getAuthToken();
            })
            .delayElements(Duration.ofSeconds(1)) // Задержка перед следующей попыткой
    )
    .subscribe(response -> {
        // обработка успешного ответа
    }, throwable -> {
        // обработка ошибки, если все попытки исчерпаны
    });

Объяснение кода:

  1. getAuthToken: Создаем первый шаг, который извлекает токен аутентификации.
  2. flatMap: Используем оператор flatMap для того, чтобы после получения токена выполнить метод makeRequest с токеном в качестве параметра.
  3. retryWhen:
    • errors: Поток ошибок, который сообщает о том, что произошло при выполнении.
    • filter(ForbiddenException.class::isInstance): Фильтруем ошибки, оставляя только экземпляры ForbiddenException.
    • flatMap: После фильтрации мы вновь вызываем метод getAuthToken, чтобы получить новый токен перед выполнением повторной попытки.
    • delayElements(Duration.ofSeconds(1)): Задаем паузу между попытками, чтобы избежать слишком частых вызовов.
  4. subscribe: Подписываемся на окончательный результат, обрабатывая как успешные ответы, так и ошибки, которые могут возникнуть после исчерпания всех попыток.

Таким образом, ваша логика будет возвращаться к методу getAuthToken каждый раз при возникновении ForbiddenException, тем самым обеспечивая актуальность токена.

Оцените материал
Добавить комментарий

Капча загружается...