如何使用ActiveMQ与stomp.py配置持久化主题?
ActiveMQ持久化主题配置问题解决
我尝试用ActiveMQ配置持久化主题,目前消息能正常收发,但订阅者不在线时消息会丢失,主题的持久化未生效。原以为设置client-id和订阅id后,连接断开时消息会被持久化,但当前代码没起作用。
发布者代码
import time import stomp conn = stomp.Connection() conn.connect('admin', 'password', wait=True) for i in range(1, 21): message = "message %d"%i print(message) conn.send(body=message, destination='/topic/test', persistent=True) time.sleep(1) conn.disconnect()
初始订阅者代码
import time import stomp class MyListener(stomp.ConnectionListener): def on_error(self, frame): print('received an error "%s"' % frame.body) def on_message(self, frame): print('received a message "%s"' % frame.body) conn = stomp.Connection() conn.set_listener('', MyListener()) conn.connect('admin', 'admin', wait=True, headers = {'client-id': 'testname'}) conn.subscribe(destination='/topic/test', id=1, ack='auto', persistent=True)
问题原因与解决办法
要实现ActiveMQ主题的持久化,必须创建持久化订阅(Durable Subscription)。仅设置client-id和persistent=True参数是不够的,还需要在订阅时通过headers指定activemq.subscriptionName,这个订阅名称需要和client-id绑定,让Broker识别这是一个需要持久化的订阅,这样当订阅者离线时,Broker才会保存发送到该主题的消息,等订阅者重新连接后再投递。
修正后的订阅者代码
import time import stomp class MyListener(stomp.ConnectionListener): def on_error(self, frame): print('received an error "%s"' % frame.body) def on_message(self, frame): print('received a message "%s"' % frame.body) conn = stomp.Connection() conn.set_listener('', MyListener()) conn.connect('admin', 'admin', wait=True, headers = {'client-id': 'testname'}) conn.subscribe(destination='/topic/test', id=1, ack='auto', persistent=True, headers = {"activemq.subscriptionName":"testsub"})
内容的提问来源于stack exchange,提问作者Dick
相关产品推荐
相关产品推荐

