防止在Resilience4j重试的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: {} - {}",t.toString());

                message.ackNowledge();
            }
        } catch (JMSException e) {
            logger.error("An error- {}",e);
        }
        return null;
    }

在此先感谢您的帮助!

解决方法

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

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