首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Retryable -如何在调用时进行日志记录?

Spring @Retryable -如何在调用时进行日志记录?
EN

Stack Overflow用户
提问于 2018-03-02 17:55:13
回答 2查看 21.8K关注 0票数 23

我在Spring Boot 1.5.9.RELEASE中使用compile 'org.springframework.retry:spring-retry:1.2.2.RELEASE'

配置为重试我的方法,它工作正常:

代码语言:javascript
复制
@Retryable(value = { IOException.class }, maxAttempts = 5, backoff = @Backoff(delay = 500))
public void someMethod(){...}

重试时如何输出一些特定的消息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 00:19:47

您可以注册RetryListener

代码语言:javascript
复制
@Bean
public List<RetryListener> retryListeners() {
    Logger log = LoggerFactory.getLogger(getClass());

    return Collections.singletonList(new RetryListener() {

        @Override
        public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
            // The 'context.name' attribute has not been set on the context yet. So we have to use reflection.
            Field labelField = ReflectionUtils.findField(callback.getClass(), "val$label");
            ReflectionUtils.makeAccessible(labelField);
            String label = (String) ReflectionUtils.getField(labelField, callback);
            log.trace("Starting retryable method {}", label);
            return true;
        }

        @Override
        public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
            log.warn("Retryable method {} threw {}th exception {}",
                    context.getAttribute("context.name"), context.getRetryCount(), throwable.toString());
        }

        @Override
        public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
            log.trace("Finished retryable method {}", context.getAttribute("context.name"));
        }
    });

如果您不需要从所有3个截取点进行日志记录,则可以覆盖RetryListenerSupport。例如:

代码语言:javascript
复制
@Bean
public List<RetryListener> retryListeners() {
    Logger log = LoggerFactory.getLogger(getClass());

    return Collections.singletonList(new RetryListenerSupport() {

        @Override
        public <T, E extends Throwable> void onError(
                RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
            log.warn("Retryable method {} threw {}th exception {}",
                    context.getAttribute("context.name"), 
                    context.getRetryCount(), throwable.toString());
        }
    });
}
票数 38
EN

Stack Overflow用户

发布于 2018-03-02 21:19:14

通过查看代码,org.springframework.retry.support.RetryTemplate执行用于重试操作的重试逻辑。这个模板只记录一些简单的事情,比如:

代码语言:javascript
复制
o.s.retry.support.RetryTemplate          : Retry: count=0
o.s.retry.support.RetryTemplate          : Checking for rethrow: count=1
o.s.retry.support.RetryTemplate          : Retry: count=1
o.s.retry.support.RetryTemplate          : Checking for rethrow: count=2
o.s.retry.support.RetryTemplate          : Retry: count=2
o.s.retry.support.RetryTemplate          : Checking for rethrow: count=3
o.s.retry.support.RetryTemplate          : Retry failed last attempt: count=3

如果你想记录特定的异常,你可以捕获异常,记录它并重新抛出。不幸的是,据我所知,没有办法在框架中记录自定义消息。

另一种方法是隐藏实际的拦截器,该拦截器负责调用RetryOperationsInterceptor等方法,但不建议这样做。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49066706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档