receive.py:
#!/usr/bin/env python3
import pika
import sys
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='device', exchange_type='direct')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
channel.queue_bind(
exchange='device', queue=queue_name, routing_key='abc')
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))
connection.close()
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
channel.start_consuming()
sender.py:
#!/usr/bin/env python3
import pika
import sys
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='device', exchange_type='direct')
message = 'Hello World!'
channel.basic_publish(
exchange='device', routing_key='abc', body=message)
print(" [x] Sent %r:%r" % ('abc', message))
connection.close()
У меня выше receiver
& sender
который работает хорошо:
// first bash session
# python3 receive1.py
[*] Waiting for logs. To exit press CTRL+C
[x] 'abc':b'Hello World!'
// second bash session
# python3 send1.py
[x] Sent 'abc':'Hello World!'
Моя проблема:
Если я сначала позвоню sender.py
, то позвоню receiver.py
, receiver.py
не будетполучить сообщение.Я знаю это, потому что когда sender.py
отправляет сообщение, обмен фактически не привязывается ни к какой очереди, поэтому, согласно дизайну rabbitmq, он отбрасывает все сообщения без привязки очереди для обмена.
Одним из решений является использованиеименованную очередь, а также объявить / связать ее в sender.py
.Но если я сделаю это, если в прошлый раз потребитель не получил сообщение от последнего отправителя, у нового потребителя этого времени может появиться шанс получить старое сообщение от последнего отправителя.
И для меня разница во времени междуreceiver
& sender
быть готовым очень мало.Поэтому мне просто интересно, если возможно, чтобы pika
обнаружил в sender.py
, что exchange
уже связывается с queue
или нет?Если не связать, я посплю какое-то время и отправлю.
У кого-нибудь есть предложения?