使用@Retryable 打印重试次数

use*_*825 1 java spring-retry spring-boot

我在这样的方法上使用@Retryable:-

@Retryable( value = SQLException.class, 
      maxAttempts = 5, backoff = @Backoff(delay = 100))
void testMethod(String abc) throws SQLException{
//some method body that could throw sql exception
};
Run Code Online (Sandbox Code Playgroud)

我想打印重试次数,并显示如下消息:

Retry Number : 1
Retry Number : 2
...
Retry Number : 5
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

小智 27

您可以添加以下代码:

@Retryable( value = SQLException.class, 
      maxAttempts = 5, backoff = @Backoff(delay = 100))
void testMethod(String abc) throws SQLException{
log.info("Retry Number : {}",RetrySynchronizationManager.getContext().getRetryCount());
};
Run Code Online (Sandbox Code Playgroud)

RetrySynchronizationManager.getContext().getRetryCount() 将为您提供流的重试计数。


小智 6

你可以添加 retryListener

    @Retryable( value = SQLException.class, maxAttempts = 5, 
                backoff = @Backoff(delay = 100), listeners = {"retryListener"})
    void testMethod(String abc) throws SQLException{
    //some method body that could throw sql exception
    };
Run Code Online (Sandbox Code Playgroud)

retryListener 应该如下所示,您可以在错误时打印重试计数。

@Slf4j
@Component
class RetryListener extends RetryListenerSupport {

    @Override
    public <T, E extends Throwable> void close(RetryContext context,
                                               RetryCallback<T, E> callback, Throwable throwable) {

        log.error("Unable to recover from  Exception");
        log.error("Error ", throwable);
        super.close(context, callback, throwable);
    }

    @Override
    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        log.error("Exception Occurred, Retry Count {} ", context.getRetryCount());
        super.onError(context, callback, throwable);
    }

    @Override
    public <T, E extends Throwable> boolean open(RetryContext context,
                                                 RetryCallback<T, E> callback) {
        log.error("Exception Occurred, Retry Session Started ");
        return super.open(context, callback);
    }
}
Run Code Online (Sandbox Code Playgroud)