У меня есть существующая очередь, созданная в RabbitMQ. Он может быть создан с параметром x-dead-letter-exchange
или без него. Я создаю пользователя этой очереди весной, используя RabbitTemplate. Когда я объявляю очередь, я не хочу указывать параметр x-dead-letter-exchange
. Я хотел бы, чтобы шаблон каким-то образом определял его сам или не заботился. Я бросаю AmqpRejectAndDontRequeueException
от своего потребителя, чтобы указать плохие сообщения, но я хочу, чтобы создатель очереди отвечал за решение, создавать ли обмен и очередь для отклоненных сообщений.Весна с AMQP и RabbitMQ, очередь с опциональным x-dead-letter-exchange
Вот мой боб, который объявляет очереди в 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;
}
Это работает отлично, но когда создатель очереди решает не использовать мертвую функцию письма, я вижу следующее сообщение об ошибке:
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'
Сообщение немного длиннее, оно продолжает сообщать мне, какая сторона имеет то, что x-dead-letter-exchange
(нет или имя обмена). Я пробовал разные комбинации (например, создавая очередь с обменом, а не указывая ее весной или создавая очередь без обмена и указывая ее весной), только чтобы увидеть разные варианты этого сообщения.
Как объявить очередь, чтобы она просто принимала любые параметры, уже установленные в очереди?
При объявлении объектов RabbitMQ, таких как очереди и обмены, вы должны указать одни и те же параметры, RabbitMQ не будет выполнять слияние каких-либо параметров. Как вы это делаете с весной, я не знаю. –