Spring 可重试 - 异步上下文

Spring Retryable - Async context

异步上下文中的@Retryable 有问题,我有一个返回 SocketTimeOut 异常的服务调用。我本来希望重试 3 次,我确实有 @EnableRetry,但是我在日志中看到一些我有点奇怪的东西,一个睡眠中断异常。这是堆栈跟踪的一部分。

Caused by: java.lang.InterruptedException: sleep interrupted at org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:118) ~[spring-retry-1.2.1.RELEASE.jar!/:na] at someservice.somemethod(someservice.java) ~[classes/:na] 2018-01-18 18:59:39.818 INFO 14 --- [lTaskExecutor-1] someExceptionHandler : Thread interrupted while sleeping; nested exception is java.lang.InterruptedException: sleep interrupted at org.springframework.retry.backoff.ThreadWaitSleeper.sleep(ThreadWaitSleeper.java:30) ~[spring-retry-1.2.1.RELEASE.jar!/:na] at org.springframework.retry.backoff.StatelessBackOffPolicy.backOff(StatelessBackOffPolicy.java:36) ~[spring-retry-1.2.1.RELEASE.jar!/:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_141] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.8.RELEASE.jar!/:4.3.8.RELEASE] at 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

Caused by: java.lang.InterruptedException: sleep interrupted at

简单的意思是当线程在 backOff 中等待时,您的应用程序中的其他东西正在中断线程,从而终止重试场景。

这是设计使然...

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

...当你中断一个线程时,你是在明确地告诉它停止它正在做的事情(如果它正在做一些可中断的事情,比如休眠)。