Python pika - публикация на несуществующей бирже не вызывает исключений - PullRequest
0 голосов
/ 11 июня 2019

Согласно https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish, при публикации,

Если указано имя обмена, и этот обмен не существует, сервер вызовет исключение канала.

При использовании pika это происходит только во второй раз, когда сообщение отправляется на отсутствующий обмен по тому же каналу:

(env36x64) C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.4\sbin>rabbitmqctl.bat list_exchanges name
Listing exchanges for vhost / ...
amq.fanout
amq.match
amq.headers

amq.rabbitmq.trace
amq.topic
amq.direct

(env36x64) C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.4\sbin>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pika
>>> creds = pika.PlainCredentials('user', 'passw')
>>> params = pika.ConnectionParameters(host='ms7', port=5672, credentials=creds)
>>> conn = pika.BlockingConnection(params)
>>> ch = conn.channel()
>>> ch.basic_publish(exchange='invalid', routing_key='', body='hello')
>>> # No error. Not expected
>>> # Second attempt does raise exception, as expected
>>> ch.basic_publish(exchange='invalid', routing_key='', body='hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Administrator\Documents\env36x64\lib\site-packages\pika\adapters\blocking_connection.py", line 2239, in basic_publish
    self._flush_output()
  File "C:\Users\Administrator\Documents\env36x64\lib\site-packages\pika\adapters\blocking_connection.py", line 1331, in _flush_output
    raise self._closing_reason  # pylint: disable=E0702
pika.exceptions.ChannelClosedByBroker: (404, "NOT_FOUND - no exchange 'invalid' in vhost '/'")
  • pika 1.0.1
  • Сервер RabbitMQ 3.7.4
  • Эрланг 20.3
  • Python 3.6.5

1 Ответ

1 голос
/ 11 июня 2019

Если вы делаете захват пакета с помощью Wireshark, это объясняет поведение, которое вы видите.Channel.Close, отправленный из RabbitMQ в ваше тестовое приложение, - асинхронный , поэтому ваш второй вызов basic_publish выполняется до получения первого Channel.Close.Здесь нет ошибок ни в RabbitMQ, ни в Pika.


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногдаотвечает на вопросы по StackOverflow.

...