#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 для достижения этой цели.