2
respostas

Fallback method não aciona como deveria!

Estou tendo problemas com meu fallback method que aparentemente nunca é chamado quando o serviço de pedidos está fora do ar! A seguir o código que usei para construir os métodos:

Na classe Controller:

@PatchMapping("/{id}/confirm")
    @CircuitBreaker(name = "updateOrderPaymentCall", fallbackMethod = "authorizedPaymentWhitPendedIntegration")
    public ResponseEntity<HttpStatus> confirmPayment(@PathVariable @NotNull Long id) {
        service.confirmPayment(id);
        return ResponseEntity.ok().build();
    }

    public void authorizedPaymentWhitPendedIntegration(Long id, Exception ex) {
        service.alterPaymentStatus(id);
    }

Na classe Service:

@Transactional
    public void alterPaymentStatus(Long id) {
        var payment = repository.findById(id).orElseThrow(() -> new EntityNotFoundException("Payment not found for id: %d".formatted(id)));
        payment.comfirmWhitPendedIntegration();
        repository.save(payment);
    }

Meu application.porperties:

resilience4j.circuitbreaker.instances.updateOrderPaymentCall.slidingWindowSize= 3
resilience4j.circuitbreaker.instances.updateOrderPaymentCall.minimumNumberOfCalls= 2
resilience4j.circuitbreaker.instances.updateOrderPaymentCall.waitDurationInOpenState= 50s

Link do repositório com o projeto: https://github.com/GuilhermeABRoncari/AluraFood-Payments

O que será que pode estar acontecendo? O.o

2 respostas

Olá, Guilherme! Como vai?

Pelo que observei no código que você compartilhou, parece que o problema está na assinatura do seu método fallback authorizedPaymentWhitPendedIntegration. No Spring, o método fallback deve ter a mesma assinatura do método original, mas com um parâmetro adicional do tipo Throwable ou Exception ao final.

No seu caso, o método confirmPayment recebe um parâmetro Long id. Portanto, o método fallback authorizedPaymentWhitPendedIntegration também deve receber um Long id, mas com um parâmetro adicional Exception ex ao final.

Seu código deveria ficar assim:

@PatchMapping("/{id}/confirm")
@CircuitBreaker(name = "updateOrderPaymentCall", fallbackMethod = "authorizedPaymentWhitPendedIntegration")
public ResponseEntity<HttpStatus> confirmPayment(@PathVariable @NotNull Long id) {
    service.confirmPayment(id);
    return ResponseEntity.ok().build();
}

public void authorizedPaymentWhitPendedIntegration(Long id, Exception ex) {
    service.alterPaymentStatus(id);
}

O parâmetro Exception ex no método authorizedPaymentWhitPendedIntegration é necessário para que o Spring saiba que esse é um método de fallback. Ele não será usado dentro do método, mas é necessário para que o Spring o reconheça como tal.

Espero ter ajudado e bons estudos!

Cara... fiz as alterações e ainda não resolveu... Já não sei o que fazer. Segue no link o estado atual do projeto: https://github.com/GuilhermeABRoncari/AluraFood-Payments