Как прервать код при публикации сообщения в несуществующей очереди в rabbitmq

Я написал приложение сервер-клиент.
На стороне сервера
сервер инициализирует очередь queue1 с ключом маршрутизации key1 при прямом обмене .
После инициализации и объявления он потребляет данные всякий раз, когда кто-то пишет на них.

Клиентская сторона

клиент опубликует некоторые данные об этом обмене, используя ключ маршрутизации key1.
Также перед публикацией я установил для флага mandotory значение true.

Проблема

все в порядке, когда я сначала запускаю сервер. Но у меня возникла проблема, когда я сначала запускаю клиент, и он публикует данные с ключом маршрутизации. Когда клиент публикует данные, брокер не делает исключений.

Требование
Я хочу исключение или ошибку при публикации данных в несуществующей очереди.


person Chintan Patel    schedule 01.10.2015    source источник


Ответы (2)


Если вы будете публиковать сообщения с флагом mandatory, установленным на true, то это сообщение будет возвращено обратно, если его нельзя будет перенаправить ни в какую очередь.

Что касается несуществующих бирж, то публиковать сообщения на несуществующие биржи запрещено, поэтому вам придется получить об этом ошибку, что-то вроде NOT_FOUND - no exchange 'nonexistent_exchange' in vhost '/'.

Вы можете объявить обмены очередями и привязать их по мере необходимости на стороне клиента. Эти операции идемпотентны.

Обратите внимание, что создание и привязка обменов и очередей при каждой публикации может отрицательно сказаться на производительности, поэтому делайте это при запуске клиента, а не при каждой публикации.

P.S.: если вы используете rabbitmq-c, то стоит указать basic_publish документация

Обратите внимание, что на уровне протокола AMQ basic.publish является асинхронным методом:

это означает, что условия ошибки, возникающие у брокера (например, публикация на несуществующей бирже), не будут отражены в возвращаемом значении этой функции.

person pinepain    schedule 01.10.2015
comment
Как обрабатывать немаршрутизированное сообщение от клиента? - person Chintan Patel; 01.10.2015
comment
Если вы имеете в виду, как узнать, что сообщение было возвращено после публикации с помощью basic_publish в rabbitmq-c, то спросите об этом в проблемах Rabbitmq-c github - github.com/alanxz/rabbitmq-c/issues, это был бы хороший вопрос. - person pinepain; 01.10.2015
comment
@Zac Я использовал метод amqp_simple_wait_frame_noblock для получения AMQP_BASIC_RETURN_METHOD . Код ответа равен 312, а текст ответа равен NO_ROUTE. - person Chintan Patel; 01.10.2015

Я трачу много времени, чтобы найти это. У меня есть пример кода на 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

person Sơn Lâm    schedule 12.03.2016