【问题标题】:Spring Retryable - Async contextSpring Retryable - 异步上下文
【发布时间】:2018-06-30 20:14:54
【问题描述】:

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

引起:java.lang.InterruptedException:睡眠中断 在 org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:118) ~[spring-retry-1.2.1.RELEASE.jar!/:na] 在 someservice.somemethod(someservice.java) ~[classes/:na] 2018-01-18 18:59:39.818 INFO 14 --- [lTask​​Executor-1] someExceptionHandler:线程在睡眠时中断;嵌套异常是 java.lang.InterruptedException: sleep interrupted 在 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

【问题讨论】:

    标签: java interrupted-exception spring-retry


    【解决方案1】:

    引起:java.lang.InterruptedException:睡眠中断在

    仅仅意味着你的应用程序中的其他东西在线程等待 backOff 时中断了它,从而终止了重试场景。

    这是设计使然...

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

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

    【讨论】:

    • 感谢 Gary 的回复 - 如果我们没有指定退避策略会发生什么 - 所以我们的方法实际上是用没有选项的 @Retryable 注释的 - 退避为零还是默认为 1第二?我读到它可能是零?所以我能够通过添加以下行来重新创建 - Thread.currentThread.interrupt(),我看到它停止了重试,但是我得到了同样的错误但是我中断的线程应该一直在运行而不是睡眠但我得到了睡眠中断问题。它是一个超时的基本 SSL 套接字连接,我会尝试混淆一些代码,并在需要时添加它
    • 您可以使用NoBackOffPolicy 来避免睡眠,但不能使用@Retryable 注释进行连接;您必须将拦截器连接为 @Bean 并在注释上使用 interceptor 属性。
    • 所以只是为了确认默认情况下(没有选项的注释)线程会休眠?通过添加拦截器,并提供它不会的 NoBackOffPolicy?
    • 标记为正确,这应该对我有用,因为 SSL 套接字调用的超时时间是 15 秒 - 真的不需要睡觉。看看情况如何,谢谢你的信息!
    • 很遗憾,没有;使用基于睡眠的 backOff 策略,任何值 Thread.sleep() 都会被无条件调用,即使睡眠为 0,它也会中断。
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2021-12-30
    • 2015-08-16
    • 2017-06-05
    • 2016-09-22
    • 2014-08-11
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多