Запрос / ответ Masstransit RabbitMQ не может создать обмен с автоматическим удалением

#rabbitmq #masstransit

#rabbitmq #masstransit

Вопрос:

Мы пытаемся реализовать сценарий запроса / ответа, в котором сообщения будут удалены сервер (потребитель) не работает. Мы начинаем с отсутствия обменов / очередей в установке rabbit mq.

Существует сервер, который создает свой собственный обмен / очередь, и мы хотим, чтобы это было auto-delete=true .

В случае, если сервер запускается раньше клиента, обмен создается с правильной конфигурацией. Но когда клиент запущен, мы получаем эту ошибку:

RabbitMQ.Client.Исключения.OperationInterruptedException: операция AMQP была прервана: причина закрытия AMQP, инициированная одноранговым узлом, code = 406, text =»PRECONDITION_FAILED — неэквивалентный аргумент ‘auto_delete’ для обмена ‘simple_request’ в vhost ‘****’: получено ‘false’, но текущее значение ‘true'», classId = 40, methodId=10, причина =

В случае, если клиент запускается первым и пытается отправить сообщение, создается обмен с именем очереди, которое мы определили, но это не auto-delete=true то, что приводит к ошибке:

Сбой передачи RabbitMQ: операция AMQP была прервана: причина закрытия AMQP, инициированная одноранговым узлом, code = 406, text =»PRECONDITION_FAILED — неэквивалентный аргумент ‘auto_delete’ для обмена ‘simple_request’ в vhost ‘****’: получено ‘true’, но текущее значение ‘false'»,classId = 40, methodId = 10, причина = сбой передачи RabbitMQ: супервизор останавливается, дополнительные области не могут быть созданы

когда сервер в конечном итоге запускается.

Как мы реализуем очереди автоматического удаления в сценарии ответа на запрос?

Ответ №1:

Вы можете обновить URI в своем клиенте для очереди обслуживания, чтобы включить параметры строки запроса, чтобы очередь была создана правильно.

rabbitmq://host/vhost/queue?autodelete=trueamp;durable=false

Примечание, которое я включил durable=false , но это только в том случае, если вы используете недолговечную очередь, и я хотел быть полным.

Комментарии:

1. Это все еще способ сделать это в 2021 году? Я хотел бы видеть некоторый (не зависящий от брокера) MT API в SendEndpointProvider. GetSendEndpoint() для управления этим поведением. Спасибо!

2. Ну, теперь вы можете использовать queue:queue-name?autodelete=trueamp;durable=false , но в остальном, да, это то же самое.

3. Спасибо! Возможно ли что-то подобное для служебной шины Azure? Я должен поддерживать оба. В конечном счете, я хотел бы, чтобы очередь автоматически удалялась после установленного времени ожидания, что должно быть возможно для обоих брокеров. Кажется, я просто не могу найти способ MassTransit для достижения этой цели.