【发布时间】:2017-01-01 16:41:13
【问题描述】:
我目前正在编写两个脚本来订阅消息服务器,使用 stomp 客户端库,write.py 写入数据和 read.py em> 获取数据。
如果我先启动 read.py 然后运行 write.py,write.py 会正确接收消息。
但是,如果我先运行 write.py 然后再运行 read.py,read.py 不会检索之前发送的任何消息到服务器。
以下是脚本的相关部分。
如何实现 write.py 放入队列的消息在 read.py 订阅和检索它们之前一直保留?
write.py
def writeMQ(msg):
queue = '/topic/test'
conn = stomp.Connection(host_and_ports=[(MQ_SERVER, MQ_PORT)])
try:
conn.start()
conn.connect(MQ_USER, MQ_PASSWD, wait=True)
conn.send(body=msg, destination=queue, persistent=True)
except:
traceback.print_exc()
finally:
conn.disconnect()
return
read.py
class MyListener(stomp.ConnectionListener):
def on_error(self, headers, message):
print ('received an error {0}'.format(message))
def on_message(self, headers, message):
print ('received an message {0}'.format(message))
def readMQ():
queue = '/topic/test'
conn = stomp.Connection(host_and_ports=[(MQ_SERVER, MQ_PORT)])
try:
conn.set_listener("", MyListener())
conn.start()
conn.connect(MQ_USER, MQ_PASSWD, wait=True)
conn.subscribe(destination=queue, ack="auto", id=1)
stop = raw_input()
except:
traceback.print_exc()
finally:
conn.disconnect()
return
【问题讨论】:
-
您使用的是哪个消息服务器?您一直在谈论队列,但从外观上看,您将消息发送到主题而不是队列。这是故意的吗?应该有多少客户接收一条消息?
-
@bbastu 只有一个客户端应该接收一条消息。服务器是由另一个人设置的,我将检查详细信息。如果我想使用队列而不是主题,我需要在服务器上做一些修改还是只更新我的代码?
-
我认为这取决于服务器。但是使用 apollo(我假设您正在使用)只需设置 queue=/queue/test。
-
@bbastu 是的,设置 queue=/queue/test 有效,感谢您的帮助。
标签: python python-2.7 message-queue stomp