Могут ли Spring Retryable или RetryTemplate использовать заголовок Retry-After для динамического отката? - PullRequest
1 голос
/ 25 октября 2019

Могу ли я заставить Spring's @Retryable или @RetryTemplate использовать число, полученное в заголовке Retry-After в HTTP 503 ответе «Служба недоступна», в качестве задержки для следующей итерации повторения?

Например:

@Retryable(maxAttempts = 42,
           backoff = @Backoff(delay = 1000),
           value = NotYetReady.class)
public boolean isExternalComponentReadyToUse() throws NotYetReady {
    ResponseEntity<String> response = callRestEndpointToCheckReadiness();
    if (!response.getStatus().is2xxSuccessful()) {
        int retryAfterInSeconds = response.getHeaders().get("Retry-After");
        // tell @Retryable to run next attempt after retryAfterInSeconds?
        throw new NotYetReady();
    }
    return true;
}

Наше Java-приложение использует внешний компонент, который занимает несколько минут. Этот компонент предоставляет конечную точку REST для проверки готовности. Конечная точка отправляет обратно 503 с заголовком Retry-After, если она может оценить, сколько времени займет оставшаяся установка.

1 Ответ

2 голосов
/ 25 октября 2019

Одним из способов будет сохранение значения в статическом ThreadLocal (например, MyHolder.setDelay(...)) и использование delayExpression в @Backoff() для извлечения этого значения.

Что-то вроде "T(com.foo.MyHolder).getDelay()".

Вам необходимо связать RetryOperationsInterceptor как @Bean с пользовательским BackoffPolicy и ссылаться на него в свойстве @Retryable.interceptor.

...