Как я могу использовать @Retryable (label = "...") для ведения журнала или мониторинга? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть простой повторяющийся метод, аннотированный

@Retryable(label = "myLabel")

Согласно документации, он должен быть

Уникальный ярлык для статистической отчетности

Доступен ли этот ярлык внутри RetryListener? Как я могу использовать это?

1 Ответ

1 голос
/ 24 марта 2020

Метка доступна в атрибуте 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");
    }

}

Контекст доступен в методах слушателя.

В 1.3 есть новая функция .

1.3 еще не выпущен, но есть моментальный снимок 1.3.0.BUILD-SNAPSHOT в репозитории моментальных снимков репозитория https://repo.spring.io/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");
    }

}
...