Как прервать код при публикации сообщения в несуществующей очереди в 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

Другие вопросы по тегам