我如何使用 @Retryable(label="...") 进行日志记录或监控?

How can i use @Retryable(label="...") for logging or monitoring purposes?

我有一个用

注释的简单可重试方法
@Retryable(label = "myLabel")

根据文档,应该是

A unique label for statistics reporting

RetryListener 中是否可以访问此标签?我该如何使用它?

标签在上下文的 RetryContext.NAME 属性中可用。

@Component
class Foo {

    private static final Logger log = LoggerFactory.getLogger(Foo.class);

    @Retryable(label = "myLabel")
    public void retriable() {
        log.info("Here with label: " + RetrySynchronizationManager.getContext().getAttribute(RetryContext.NAME));
        throw new RuntimeException("test");
    }

    @Recover
    public void recover(Exception e) {
        log.info("Recovered");
    }

}

上下文在侦听器方法中可用。

有一个new feature in 1.3

1.3 尚未发布,但在 spring 快照存储库 https://repo.spring.io/snapshot.

中有快照 1.3.0.BUILD-SNAPSHOT

这也使您可以访问方法调用。

@Component
class MyRetryListener extends MethodInvocationRetryListenerSupport {

    private static final Logger log = LoggerFactory.getLogger(MyRetryListener.class);

    @Override
    protected <T, E extends Throwable> boolean doOpen(RetryContext context,
            MethodInvocationRetryCallback<T, E> callback) {

        log.info("Invocation of method: " + callback.getInvocation().getMethod().toGenericString()
                + " with label: " + callback.getLabel());
        return super.doOpen(context, callback);
    }

}

@Component
class Foo {

    private static final Logger log = LoggerFactory.getLogger(Foo.class);

    @Retryable(label = "myLabel")
    public void retriable() {
        log.info("Here");
        throw new RuntimeException("test");
    }

    @Recover
    public void recover(Exception e) {
        log.info("Recovered");
    }

}