Search code examples
spring-bootrabbitmqspring-amqpspring-rabbit

Make Spring RabbitMQ fail on missing exchange


There is nice property spring.rabbitmq.listener.simple.missing-queues-fatal=true it makes SimpleMessageListenerContainer and whole application fail when I set it a non existent queue - which is what I want. I don't want to have an application running in invalid state.

I can't find similar solution for exchanges like

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

I get in logs several

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)

and application starts. I would like it to fail. How can I do it?

How can I make spring boot/rabbit fail when trying to bind to any of non existing queue or exchange?


Solution

  • The exchange does nothing with listener. We need it along side with a routing key when we produce data into AMQP. The listener has that option to fail because it is out of end-user control and starts automatically when application is ready. The exchange is used in the RabbitTemplate when you send a data. See publisherReturns option on the CachingConnectionFactory for use-case like yours to handle such an error in case of missed exchange:

    https://docs.spring.io/spring-amqp/docs/current/reference/html/#cf-pub-conf-ret https://www.rabbitmq.com/confirms.html

    You also add a ReturnsCallback into your RabbitTemplate to catch an unrouted message and its reason and handle such an error respectively: in your case stop the app, e.g. System.exit(1);.