Spring @Retryable - 호출 시 기록 방법
사용하고 있다compile 'org.springframework.retry:spring-retry:1.2.2.RELEASE'
와 함께Spring Boot 1.5.9.RELEASE
.
메서드를 재시도하도록 설정되었으며 정상적으로 동작합니다.
@Retryable(value = { IOException.class }, maxAttempts = 5, backoff = @Backoff(delay = 500))
public void someMethod(){...}
재시도 발생 시 특정 메시지를 출력하려면 어떻게 해야 합니까?
등록할 수 있습니다.RetryListener
:
@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
대신.예를 들어 다음과 같습니다.
@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());
}
});
}
코드를 훑어보면org.springframework.retry.support.RetryTemplate
는 조작을 재시도하기 위한 재시도 로직을 실행합니다.이 템플릿은 다음과 같은 간단한 로그만 기록합니다.
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
단, 이는 권장되지 않습니다.
또 다른 방법은 Retry Context를 체크하는 것입니다.
@Retryable(maxAttempts = 2, include = RuntimeException.class)
public void test() {
log.info("test");
if (RetrySynchronizationManager.getContext().getRetryCount() > 0) {
log.warn(RetrySynchronizationManager.getContext());
}
throw new RuntimeException();
}
[ RetryContext : count = 1, lastException = lang.RuntimeException, excepted=false]
언급URL : https://stackoverflow.com/questions/49066706/spring-retryable-how-to-log-when-it-is-invoked
'programing' 카테고리의 다른 글
카테고리 slug로 쿼리하는 방법 (0) | 2023.03.27 |
---|---|
Woocommerce REST API - 커스텀루트 추가 (0) | 2023.03.27 |
Angular가 있는 자동 다이내믹 브레드 크럼 만드는 방법JS + 각도 UI 라우터 (0) | 2023.03.22 |
Oracle SQL Developer에서 변수를 사용하는 방법 (0) | 2023.03.22 |
프로젝트 웹 사이트를 프로그래밍하기 위한 단순 클린 CMS (0) | 2023.03.22 |