Spring Retryable - асинхронный контекст

У меня проблема с @Retryable в контексте Async, у меня есть вызов службы, который возвращает исключение SocketTimeOut. Я ожидал, что повторим попытку 3 раза, у меня есть @EnableRetry, но я вижу что-то немного странное в журналах, a sleep interruptedException. Вот часть трассировки стека.

Вызвано: java.lang.InterruptedException: сон прерван в org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke (RetryOperationsInterceptor.java:118) ~ [spring-retry-1.2.1.RELEASE.jar! /: Na] в каком-то сервисе .somemethod (someservice.java) ~ [classes /: na] 2018-01-18 18: 59: 39.818 ИНФОРМАЦИЯ 14 --- [lTaskExecutor-1] someExceptionHandler: поток прерывается во время сна; вложенное исключение - java.lang.InterruptedException: сон прерван в org.springframework.retry.backoff.ThreadWaitSleeper.sleep (ThreadWaitSleeper.java:30) ~ [spring-retry-1.2.1.RELEASE.jar! /: na] в org .springframework.retry.backoff.StatelessBackOffPolicy.backOff (StatelessBackOffPolicy.java:36) ~ [spring-retry-1.2.1.RELEASE.jar! /: na] в java.util.concurrent.FutureTask.run (FutureTask.java: 266) [na: 1.8.0_141] в org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:673) ~ [spring-aop-4.3.8.RELEASE.jar! /: 4.3.8. RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:738) ~ [spring-aop-4.3.8.RELEASE.jar! /: 4.3.8.RELEASE]

Не уверен, что это отвлекающий маневр, но это происходит после истечения тайм-аута чтения, я ожидал, что он повторит попытку, но, скорее, я вижу это в журналах. Я знаю, что повторная попытка Spring имеет ожидание по умолчанию в 1 секунду, мне интересно, не прерывается ли она, таким образом, влияя на ее способность повторять попытку.

T.I.A


person aspiringCoder    schedule 22.01.2018    source источник


Ответы (1)


Вызвано: java.lang.InterruptedException: сон прерван в

Просто означает, что что-то еще в вашем приложении прерывает поток, пока он ожидает в backOff, тем самым убивая сценарий повтора.

Это по замыслу ...

if (this.logger.isDebugEnabled()) {
    this.logger
            .debug("Abort retry because interrupted: count="
                    + context.getRetryCount());
}

... когда вы прерываете поток, вы явно указываете ему прекратить то, что он делает (если он делает что-то прерываемое, например, засыпает).

person Gary Russell    schedule 22.01.2018
comment
Спасибо за ответ, Гэри - а что будет, если мы не указали политику отсрочки - так что на самом деле наш метод аннотирован @Retryable без параметров - отсчет равен нулю или по умолчанию равен 1 секунде? Читал, что может быть ноль? Итак, я смог воссоздать, добавив следующую строку - Thread.currentThread.interrupt (), я видел, что она останавливает повторную попытку, однако у меня такая же ошибка, НО этот поток, который я прервал, должен был работать, а не спать, но я прервал сон проблема. Это базовое соединение сокетов SSL, которое истекло, я попробую запутать некоторый код и добавить его, если необходимо - person aspiringCoder; 22.01.2018
comment
Вы можете использовать NoBackOffPolicy, чтобы избежать сна, но это не может быть связано с использованием аннотации @Retryable; вам нужно будет подключить перехватчик как @Bean и использовать свойство interceptor в аннотации. - person Gary Russell; 22.01.2018
comment
Итак, просто чтобы подтвердить по умолчанию (аннотация без параметров), поток будет спать? Добавив перехватчик и предоставив NoBackOffPolicy, этого не произойдет? - person aspiringCoder; 22.01.2018
comment
Отмечено как правильное, это должно сработать для меня, учитывая, что тайм-аут для вызова сокета SSL в любом случае составляет 15 секунд - действительно не должно быть необходимости спать. Посмотрим, как пойдет, спасибо за информацию! - person aspiringCoder; 23.01.2018
comment
Очень быстрое отслеживание - можем ли мы не просто сделать это - {@Retryable (backoff = @Backoff (0))} - person aspiringCoder; 26.01.2018
comment
К сожалению нет; с политиками backOff на основе сна любое значение ‹= 0 принудительно устанавливается на 1 мс, и, в любом случае, Thread.sleep() вызывается безоговорочно, и он будет прерываться, даже если сон равен 0. - person Gary Russell; 26.01.2018