logging - 防止在 Resilience4j Retry 的 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();
推荐阅读
- angular - NGXS 使用运算符更新状态,然后将数据持久化到 firebase
- javascript - 如何将参数传递给函数
- javascript - 电子应用程序如何打开另一个电子应用程序?
- reactjs - Antd Forms,从自定义组件中获取值?
- python - 如何在 DEAP 遗传算法的每一代之后更新或调整评估函数
- matlab - matlab中csv文件的直方图
- java - 我可以使组件透明而不隐藏它吗?
- sql-server - 从存储过程插入期间“精度无效”?
- python - .insert() 函数不适用于我的输入框
- json - 使用 Laravel API 资源获取全日历中的事件