防止在 Resilience4j Retry 的 onException() 上进行详细记录
Prevent verbose logging on Resilience4j Retry's onException()
在 onException() 函数中记录错误消息时,我在日志文件中收到过多的日志。
当断路器进入 OPEN 状态时,我会得到每个被阻止的呼叫的日志行。
在 R4j 中是否有一种本机方法来防止这种情况发生?
如果调用相同,则没有兴趣无限期地记录相同的信息。
这是代码快照:
onMessage方法
@Override
public void onMessage(final Message message) {
//Decorate message operation
CheckedRunnable myCheckedRunnable = Decorators
.ofCheckedRunnable(() -> processMessage(message))
.withCircuitBreaker(myCircuitBreaker)
.withRetry(myRetry)
.decorate();
//Trigger message operation and catch exceptions
Try.run(myCheckedRunnable ).onSuccess(aVoid -> acknowledgeMessage(message)).recover(throwable -> onException(throwable, message));
}
onException 方法
protected Void onException(final Throwable t, final Message message) {
try {
String messageId = message != null? message.getJMSMessageID(): null;
if (Arrays.asList(Resilience4jConfig.adapterSourceListenerSkipExceptions).stream().noneMatch(c -> c.isInstance(t))) {
logger.error(
"My Error message printed when blocked call is caught: {} - {}",messageId , t.toString());
if(session != null){
session.recover();
}
}else{
logger.warn(
"My other warning message printed when blocked call is caught: {} - {}", messageId, t.toString());
message.acknowledge();
}
} catch (JMSException e) {
logger.error("An error- {}", e);
}
return null;
}
提前感谢您的帮助!
最简单的方法是将CallNotPermittedException
添加到忽略的异常列表中,这样它们就不会被重试。
其他一切都是你的代码。您可以决定何时以及如何记录捕获的异常。
RetryConfig retryConfig = RetryConfig.custom()
.ignoreExceptions(CallNotPermittedException.class)
.build();
在 onException() 函数中记录错误消息时,我在日志文件中收到过多的日志。 当断路器进入 OPEN 状态时,我会得到每个被阻止的呼叫的日志行。 在 R4j 中是否有一种本机方法来防止这种情况发生? 如果调用相同,则没有兴趣无限期地记录相同的信息。
这是代码快照:
onMessage方法
@Override
public void onMessage(final Message message) {
//Decorate message operation
CheckedRunnable myCheckedRunnable = Decorators
.ofCheckedRunnable(() -> processMessage(message))
.withCircuitBreaker(myCircuitBreaker)
.withRetry(myRetry)
.decorate();
//Trigger message operation and catch exceptions
Try.run(myCheckedRunnable ).onSuccess(aVoid -> acknowledgeMessage(message)).recover(throwable -> onException(throwable, message));
}
onException 方法
protected Void onException(final Throwable t, final Message message) {
try {
String messageId = message != null? message.getJMSMessageID(): null;
if (Arrays.asList(Resilience4jConfig.adapterSourceListenerSkipExceptions).stream().noneMatch(c -> c.isInstance(t))) {
logger.error(
"My Error message printed when blocked call is caught: {} - {}",messageId , t.toString());
if(session != null){
session.recover();
}
}else{
logger.warn(
"My other warning message printed when blocked call is caught: {} - {}", messageId, t.toString());
message.acknowledge();
}
} catch (JMSException e) {
logger.error("An error- {}", e);
}
return null;
}
提前感谢您的帮助!
最简单的方法是将CallNotPermittedException
添加到忽略的异常列表中,这样它们就不会被重试。
其他一切都是你的代码。您可以决定何时以及如何记录捕获的异常。
RetryConfig retryConfig = RetryConfig.custom()
.ignoreExceptions(CallNotPermittedException.class)
.build();