Как обнаружить обмен, уже связанный с очередью или нет в rabbitmq с pika? - PullRequest
1 голос
/ 03 июля 2019

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 или нет?Если не связать, я посплю какое-то время и отправлю.

У кого-нибудь есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...