You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:35:26