防止在 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();