Spring с AMQP и RabbitMQ, очередь с дополнительным обменом x-dead-letter

У меня есть существующая очередь, созданная в 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), только чтобы увидеть разные варианты этого сообщения.

Как объявить очередь, чтобы она просто принимала любые параметры, уже установленные в очереди?


person MartinTeeVarga    schedule 11.08.2015    source источник
comment
При объявлении объектов RabbitMQ, таких как очереди и обмены, вы должны указать точно такие же параметры, RabbitMQ не будет выполнять за вас какое-либо объединение параметров. Я не знаю, как это сделать с весной.   -  person old_sound    schedule 16.09.2015


Ответы (4)


Как вы можете видеть в весенних документах: The RabbitMQ broker will not allow declaration of a queue with mismatched arguments., поэтому вы не можете этого сделать.
В Java API RabbitMQ есть метод проверки того, существует ли уже очередь: queueDeclarePassive.

Если Spring AMQP API предоставляет аналогичную функциональность, вы можете использовать ее перед тем, как пытаться объявить очередь.

person Toresan    schedule 05.11.2015

Да, возможная причина - если вы объявляете несколько очередей вручную, а позже ваша программа (клиент в коде) пытается создать их (на основе настроек, которые у вас были в коде), вы получите эту ошибку. Причина в том, что ваш код (клиентское приложение) пытается получить доступ к одной очереди. Он получает сигнал от сервера, что соединение для этого недоступно.

Чтобы решить эту проблему

  • Удалите все очереди, которые вы создали вручную, и позвольте клиентской программе создавать их самостоятельно.
  • Если у вас возникли проблемы с удалением очередей из-за того, что в них есть какие-то данные или по какой-то причине вы хотите их сохранить, создайте одну очередь вручную и переместите все данные очереди, которые нужно удалить, через вкладку «Переместить» очереди.
person Ajay Sodhi    schedule 31.01.2019
comment
Удаление очередей и создание их при запуске приложения решено для меня - person manasouza; 17.09.2019

Да, такого рода проблема возникает, когда вы вручную создали обмены или очереди в rabbitMQ, а затем приложение пытается создать другой. И оно находит ту же очередь или обмены с разными свойствами / конфигурациями, поэтому показывает несоответствие в конфигурации.

Решение:

Разрешите вашей прикладной программе создавать только обмены и очереди.

Надеюсь это поможет.

person Siyaram Malav    schedule 15.11.2019

От: https://github.com/jondot/sneakers/issues/121

Попробуйте заполнить все сообщения в очереди, удалить очередь, затем попробуйте повторно объявить ее с помощью кода, который не удался. Я думаю, вы обнаружите, что эта конкретная ошибка исчезнет

person Alexis Gamarra    schedule 07.04.2020