Spring - recover annotation is not been called

Viewed 40

I'm using Retryable and Recover annotation in spring, but the recover method is not triggered after all retry attempts

My code:

in the application class I added - @EnableRetry(proxyTargetClass=true)

@Slf4j
@Component
public class OpenAuditMessageReceiver implements MessageListener {

    @Autowired
    private MessageReceiver messageReceiver;

    @SneakyThrows
    @Override
    @Retryable(value = {SQLException.class} , maxAttempts = 2, backoff = @Backoff(delay = 2000))
    public void onMessage(Message message, byte[] pattern) {
        try {
            log.info("OpenAuditMessageReceiver got {}", new String(message.getBody()));
            OpenAuditDTO openAuditDTO = messageReceiver.getObjectMapper().readValue(message.toString(), OpenAuditDTO.class);
            log.debug("Consumed - {}", openAuditDTO);
            messageReceiver.getAuditEntityRepository().insert(openAuditDTO);
            log.info("Successfully saved Audit Information");
        } catch (Exception e){
            log.error("Error occurred while handling {}", message, e);
            if(e instanceof SQLException){
                throw e;
            }
        }
    }

    @Recover
    public void recover(SQLException e, Message message, byte[] pattern){
        log.info("#####    handle Recovery Mechanism    #####");
    }
}
1 Answers

@SneakyThrows causes the exception to be wrapped in an UndeclaredThrowableException. So we don't find a matching @Recover method.

enter image description here

Related