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