Reputation: 10908
I have an existing queue created in RabbitMQ. It can be created with or without x-dead-letter-exchange
parameter. I am creating a consumer of this queue in Spring using the RabbitTemplate. When I declare the queue, I don't want to specify the x-dead-letter-exchange
parameter. I would like the template to somehow figure it itself or not care. I am throwing AmqpRejectAndDontRequeueException
from my consumer to indicate bad messages, but I want the creator of the queue to be responsible for the decision whether or not to create an exchange and queue for the rejected messages.
Here is my bean that declares the queue in Spring:
@Bean
Queue queue() {
Map<String, Object> args = new HashMap<>();
// set the queue with a dead letter feature
args.put("x-dead-letter-exchange", REJECTED_EXCHANGE);
args.put("x-dead-letter-routing-key", REJECTED_ROUTING_KEY);
Queue queue = new Queue(Constants.QUEUE_NAME, false, false, false, args);
return queue;
}
This works fine, but when the creator of the queue decides not to use the dead letter feature, I see the following error:
Channel shutdown: channel error; protocol method: #method<channel.close>
(reply-code=406, reply-text=PRECONDITION_FAILED -
inequivalent arg 'x-dead-letter-exchange' for queue 'queueName'
The message is a bit longer, it continues telling me which side has which x-dead-letter-exchange
(none or a name of the exchange). I've tried different combinations (e.g. creating the queue with exchange and not specifying it in the Spring or creating the queue without the exchange and specifying it in the Spring), only to see different variants of this message.
How do I declare the queue so it simply accepts whatever parameters are already set in the queue?
Upvotes: 12
Views: 21682
Reputation: 4432
From: https://github.com/jondot/sneakers/issues/121
Try completing all the messages in the queue, delete the queue, then try and re-declare it with the code that failed above. I think you'll find this particular error goes away
Upvotes: 0
Reputation: 4718
Yes.This kind of issue happens when you have created exchanges or queues manually in rabbitMQ and then you application try to create other one.And it finds the same queue or exchanges with different properties/configuration so it shows mismatch in configuration.
Solution:
Allow your application program to create exchanges and queues only.
Hope this helps.
Upvotes: 0
Reputation: 131
Yes, The possible cause is - if you declare some queues manually and later your program (client in code) tries to create one (based on the settings you had in code) then you get this error. The reason behind it is when your code (client application) tries to access one queue. It gets a signal from the server that the connection is not available for this.
To solve this problem
Upvotes: 8
Reputation: 321
As you can see in the spring docs: The RabbitMQ broker will not allow declaration of a queue with mismatched arguments.
, so you can't do it.
In the RabbitMQ Java API there is a method to check whether a queue already exists: queueDeclarePassive
.
If the Spring AMQP API provides a similar functionality you can use it before trying to declare the queue.
Upvotes: 7