Как прервать код при публикации сообщения в несуществующей очереди в rabbitmq
Я написал сервер-клиентское приложение.
Сторона сервера
Сервер инициализирует очередь queue1 с ключом маршрутизации key1 при прямом обмене.
После инициализации и объявления он потребляет данные всякий раз, когда кто-то пишет на нем.
Сторона клиента
клиент опубликует некоторые данные об этом обмене, используя ключ маршрутизации key1.
Также я установил обязательный флаг в true перед публикацией.
проблема
все хорошо, когда я запускаю сервер первым. Но у меня возникла проблема, когда я запускаю клиент сначала, и он публикует данные с ключом маршрутизации. Когда клиент публикует данные, нет исключений из брокера.
требование
Я хочу исключения или ошибки, когда я опубликовал данные в несуществующей очереди.
2 ответа
Если вы будете публиковать сообщения с mandatory
флаг установлен в true
затем это сообщение будет возвращено обратно в случае, если оно не может быть перенаправлено в какую-либо очередь.
Что касается несуществующих бирж, запрещается публиковать сообщения на несуществующих биржах, поэтому вы должны будете получить ошибку об этом, что-то вроде NOT_FOUND - no exchange 'nonexistent_exchange' in vhost '/'
,
Вы можете объявить обмены очередями и связать их по мере необходимости и на стороне клиента. Эти операции идемпотентны.
Обратите внимание, что создание и привязка обменов и очередей при каждой публикации могут негативно повлиять на производительность, поэтому не только при каждой публикации, но и при запуске клиента.
PS: если вы используете rabbitmq-c
тогда стоит цитировать basic_publish
документация
Обратите внимание, что на уровне протокола AMQ basic.publish является асинхронным методом:
это означает, что условия ошибки, возникающие в посреднике (например, публикация в несуществующем обмене), не будут отражены в возвращаемом значении этой функции.
Я трачу много времени, чтобы найти это сделать. У меня есть пример кода на Python с использованием pika lib, чтобы показать, как отправить сообщение с помощью режима доставки, чтобы предотвратить ожидающий ответ при отправке сообщения в несуществующую очередь (брокер будет игнорировать сообщение, поэтому не нужно получать ответное сообщение)
import pika
# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection()
# Open the channel
channel = connection.channel()
# Declare the queue
channel.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False)
# Enabled delivery confirmations
channel.confirm_delivery()
# Send a message
if channel.basic_publish(exchange='test',
routing_key='test',
body='Hello World!',
properties=pika.BasicProperties(content_type='text/plain',
delivery_mode=1),
mandatory=True):
print('Message was published')
else:
print('Message was returned')
Ссылка: http://pika.readthedocs.org/en/latest/examples/blocking_publish_mandatory.html