Инкрементальная линейная отсрочка в Spring Retry

Я использую следующую аннотацию в методе, который хочу повторить:

@Retryable(maxAttempts = 5, backoff = @Backoff(delay = 1000))
private boolean myMethod() {
    ...
}

Эта повторная попытка работает должным образом, как и экспоненциальная задержка, которая не показана. В некоторых случаях я хотел бы использовать линейную инкрементную повторную попытку, а не экспоненциальную (сначала 1-секундное ожидание, затем 2-секундное, 3-секундное и т. Д.). Похоже, мне нужно delayExpresion, но я не знаком со SpEL, чтобы знать, что здесь использовать. Я пытался:

@Retryable(maxAttempts = 5, backoff = @Backoff(delay = 1000, delayExpression = "#{delay + 1000}"))

Возможно ли то, что я пытаюсь сделать (где задержка увеличивается на 1000) с помощью SpEL? Или, может быть, мой подход к линейному повторению вообще верен?


person user4739556    schedule 21.12.2017    source источник


Ответы (1)


Это невозможно с помощью аннотаций.

Retryable имеет параметр interceptor():

/**
 * Retry interceptor bean name to be applied for retryable method. Is mutually
 * exclusive with other attributes.
 * @return the retry interceptor bean name
 */
String interceptor() default "";

Итак, вам следует подумать о создании RetryOperationsInterceptor bean-компонента через RetryInterceptorBuilder и внедрить туда пользовательский BackOffPolicy с желаемой линейной логикой.

person Artem Bilan    schedule 21.12.2017
comment
Текущая задержка недоступна как переменная для выражений SpEL, и, в любом случае, выражение не оценивается при каждой попытке доставки, а только один раз во время инициализации. Итак, как сказал Артем, единственное решение - это кастомный BackOffPolicy через interceptor. - person Gary Russell; 22.12.2017
comment
Я понимаю. Воспользовавшись вашим советом, создал RetryOperationsInterceptor bean-компонент с пользовательским BackOffPolicy, затем прошел interceptor в Retryable. Это прекрасно работает. Спасибо! - person user4739556; 27.12.2017