问题描述
当在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: {} - {}",t.toString());
message.ackNowledge();
}
} catch (JMSException e) {
logger.error("An error- {}",e);
}
return null;
}
在此先感谢您的帮助!
解决方法
最简单的方法是将CallNotPermittedException
添加到被忽略的异常列表中,这样就不会重试它们。
其他一切都是您的代码。您可以决定何时以及如何记录捕获的异常。
RetryConfig retryConfig = RetryConfig.custom()
.ignoreExceptions(CallNotPermittedException.class)
.build();