Подписка и чтение из темы: ActiveMQ и Python

Я пытаюсь подписаться на тему в ActiveMQ, запущенную в localhost, используя stompest для подключения к брокеру. Пожалуйста, обратитесь к коду ниже:

import os
import json
from stompest.sync import Stomp
from stompest.config import StompConfig

CONFIG = StompConfig(uri=os.environ['MQ_URL'],
                     login=os.environ['MQ_UID'],
                     passcode=os.environ['MQ_DWP'],
                     version="1.2")

topic = '/topic/SAMPLE.TOPIC'

msg = {'refresh': True}

client = Stomp(CONFIG)
client.connect()
client.send(topic, json.dumps(msg).encode())
client.disconnect()

client = Stomp(CONFIG)
client.connect(heartBeats=(0, 10000))
token = client.subscribe(topic, {
    "ack": "client",
    "id": '0'
})

frame = client.receiveFrame()
if frame and frame.body:
    print(f"Frame received from MQ: {frame.info()}")
client.disconnect()

Хотя я вижу активное соединение с веб-консолью ActiveMQ, в коде не получено никакого сообщения. Поток управления, кажется, останавливается на frame = client.receiveFrame().

Я не нашел надежного ресурса или документации по этому поводу.

Я делаю что-то не так здесь?


person Saurav Pradhan    schedule 19.11.2020    source источник


Ответы (1)


Это ожидаемое поведение, поскольку вы используете тему (например, семантику pub/sub). Когда вы отправляете сообщение в тему, оно будет доставлено всем существующим подписчикам. Если абоненты не подключены, то сообщение отбрасывается.

Вы отправляете свое сообщение до того, как подключатся какие-либо подписчики, что означает, что брокер отклонит сообщение. Как только подписчик подключается, сообщения для получения отсутствуют, поэтому receiveFrame() просто заблокирует ожидание кадра, как замечания по документации:

Имейте в виду, что этот метод заблокирует навсегда, если по проводу не будут поступать кадры.

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

person Justin Bertram    schedule 19.11.2020