首页 > 解决方案 > 防止在 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;
    }

提前感谢您的帮助!

标签: loggingresilience4j

解决方案


最简单的方法是添加 CallNotPermittedException到被忽略的异常列表中,这样它们就不会被重试。其他一切都是您的代码。您可以决定何时以及如何记录捕获的异常。

RetryConfig retryConfig = RetryConfig.custom()
    .ignoreExceptions(CallNotPermittedException.class)
    .build();

推荐阅读