Python pika - 发布到不存在的交易所不会引发异常
Python pika - Publishing to non-existing exchange does not raise exception
根据https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish,发布时,
If the exchange name is specified, and that exchange does not exist, the server will raise a channel exception.
使用 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 '/'")
- 鼠兔 1.0.1
- RabbitMQ 服务器 3.7.4
- 二郎 20.3
- Python 3.6.5
如果您使用 Wireshark 进行数据包捕获,它会解释您所看到的行为。从 RabbitMQ 发送到您的测试应用程序的 Channel.Close
是 异步 ,因此您的第二个 basic_publish
调用在收到第一个 Channel.Close
之前执行。 RabbitMQ 或 Pika 都没有错误。
注意: RabbitMQ 团队监控 rabbitmq-users
mailing list 并且有时只在 Whosebug 上回答问题。
根据https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish,发布时,
If the exchange name is specified, and that exchange does not exist, the server will raise a channel exception.
使用 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 '/'")
- 鼠兔 1.0.1
- RabbitMQ 服务器 3.7.4
- 二郎 20.3
- Python 3.6.5
如果您使用 Wireshark 进行数据包捕获,它会解释您所看到的行为。从 RabbitMQ 发送到您的测试应用程序的 Channel.Close
是 异步 ,因此您的第二个 basic_publish
调用在收到第一个 Channel.Close
之前执行。 RabbitMQ 或 Pika 都没有错误。
注意: RabbitMQ 团队监控 rabbitmq-users
mailing list 并且有时只在 Whosebug 上回答问题。