es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hacer que Spring RabbitMQ falle en caso de falta de intercambio.

Hay una propiedad interesante spring.rabbitmq.listener.simple.missing-queues-fatal=true que hace que SimpleMessageListenerContainer y toda la aplicación fallen cuando intento configurarlo con una cola inexistente, lo cual es lo que quiero. No quiero tener una aplicación que se ejecute en un estado inválido.

No puedo encontrar una solución similar para los exchanges como:

spring.rabbitmq.listener.simple.missing-exchanges-fatal

En los registros, se producen varios errores como:

ERROR 432430 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Shutdown Signal: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'some-non-existent-exchange' in vhost '/', class-id=40, method-id=30)

y la aplicación se inicia. Me gustaría que fallara. ¿Cómo puedo hacerlo?

¿Cómo puedo hacer que Spring Boot y RabbitMQ fallen al intentar enlazar con cualquier cola o exchange inexistente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Actualmente, no hay una propiedad directa en Spring Boot o Spring AMQP que permita al aplicativo fallar al intentar enlazar a un intercambiador que no existe. Sin embargo, puede lograr este comportamiento escribiendo código personalizado para lanzar un RuntimeException cada vez que se encuentre un error de canal con el código 404.

    Aquí hay un ejemplo de cómo lograrlo:

    1. Implemente un RabbitMQConnectionListener personalizado que escuche los errores del canal.
    @Component
    public class CustomRabbitMQConnectionListener implements RabbitListenerEndpointRegistry, RabbitMQConnectionListener {
    
        @Override
        public void onCreate(Connection connection) {
            connection.addShutdownListener(cause -> {
                if (cause != null && cause.isHardError() && cause.getReason().equals("NOT_FOUND - no exchange")) {
                    throw new RuntimeException("Failed to bind to non-existent exchange");
                }
            });
        }
    
        // Implemente otros métodos de RabbitListenerEndpointRegistry
    }
    
    1. Agregue el oyente al contenedor Spring.
    @Configuration
    public class RabbitMQConfig {
    
        @Autowired
        private RabbitListenerEndpointRegistry rabbitListenerEndpointRegistry;
    
        @Bean
        public CustomRabbitMQConnectionListener customRabbitMQConnectionListener() {
            CustomRabbitMQConnectionListener listener = new CustomRabbitMQConnectionListener();
            rabbitListenerEndpointRegistry.addListener(listener);
            return listener;
        }
    }
    

    Al implementar un RabbitMQConnectionListener personalizado, puede escuchar los errores del canal y lanzar un RuntimeException cada vez que se encuentre un error de canal con el código 404, lo que indica que no se ha encontrado el intercambiador. El oyente se puede registrar como un bean de Spring y agregar al RabbitListenerEndpointRegistry para que forme parte del contenedor Spring.

    Con esta implementación, la aplicación fallará si intenta enlazar a un intercambiador que no existe.

Comments are closed.