您可以注册一个
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) {
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"));
}
});
如果您不需要从所有三个拦截点记录日志,可以覆盖
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());
}
});
}