Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como executar uma callback quando o circuit breaker voltar para o estado fechado?

Olá. Quando o microsserviço de pagamento tenta notificar a confirmação para o de pedidos e o de pedidos está fora do ar, ele está salvando o registro como CONFIRMADO_SEM_INTEGRACAO.

Queria saber como faço para definir uma função para ser executada quando o circuit breaker voltar para o estado fechado, que seria quando o microsserviço de pedidos voltar. Essa função pegaria todos os registros no estado CONFIRMADO_SEM_INTEGRACAO e enviaria a confirmação para o microsserviço de pedidos, sem precisar de intervenç do usuário.

2 respostas
solução!

Oi Teo, tudo bem?

Para executar uma callback quando o circuit breaker voltar para o estado fechado, você pode utilizar a biblioteca Hystrix do Spring Cloud. O Hystrix possui um recurso chamado EventListener, que permite que você defina uma função para ser executada quando o circuit breaker é fechado novamente.

Você pode criar uma classe que implementa a interface HystrixCommandExecutionHook e sobrescrever o método onExecutionSuccess. Nesse método, você pode verificar se o circuit breaker voltou para o estado fechado e, caso positivo, executar a função desejada.

Aqui está um exemplo de como você pode fazer isso:

import com.netflix.hystrix.HystrixCommandExecutionHook;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.strategy.HystrixPlugins;

public class MyHystrixCommandExecutionHook extends HystrixCommandExecutionHook {

    @Override
    public <T> void onExecutionSuccess(HystrixCommandKey commandKey, T response) {
        if (commandKey.name().equals("NomeDoSeuCircuito")) {
            // Verifica se o circuit breaker voltou para o estado fechado
            if (HystrixPlugins.getInstance().getCommandExecutionHook().isCommandExecutionInterrupted()) {
                // Executa a função desejada
                enviarConfirmacoes();
            }
        }
    }

    private void enviarConfirmacoes() {
        // Lógica para enviar as confirmações para o microsserviço de pedidos
    }
}

Depois de criar essa classe, você precisa registrar o seu HystrixCommandExecutionHook personalizado. Isso pode ser feito no método main da sua aplicação, por exemplo:

import com.netflix.hystrix.strategy.HystrixPlugins;

public class Main {

    public static void main(String[] args) {
        // Registra o HystrixCommandExecutionHook personalizado
        HystrixPlugins.getInstance().registerCommandExecutionHook(new MyHystrixCommandExecutionHook());

        // Restante do código da sua aplicação
    }
}

Dessa forma, toda vez que o circuit breaker voltar para o estado fechado, a função enviarConfirmacoes será executada automaticamente. Lembrando que isso é uma ideia do que você pode fazer.

Um abraço e bons estudos.

Consegui aqui, após vários problemas. O primeiro é que eu não sabia que a função com @CircuitBreaker não pode ser chamada dentro da mesma classe, porque o fallback não é chamado. Então criei uma outra classe de serviço só para isso. O outro problema é que muita coisa nessas bibliotecas se torna deprecada com o tempo e eu não estava conseguindo interceptar os eventos. Tive que testar várias funções e procurar coisas nos pacotes da biblioteca. No meio desse processo todo, percebi que o gateway está com um problema em que ele demora atualizar quando um dos serviços é reiniciado. É mais rápido terminar o gateway e reiniciar.