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());
}
...当你中断一个线程时,你是在明确地告诉它停止它正在做的事情(如果它正在做一些可中断的事情,比如休眠)。
异步上下文中的@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());
}
...当你中断一个线程时,你是在明确地告诉它停止它正在做的事情(如果它正在做一些可中断的事情,比如休眠)。