Python 到 ActiveMQ 的 Stomp 连接有错误的主题名称

Python Stomp connection to ActiveMQ has wrong Topic Name

我正在尝试形成对 ActiveMQ 服务器的 Python + Stomp 订阅。我正在针对本地主机上的 ActiveMQ 服务器进行测试。一切似乎都正常,只是主题 XYZ 的订阅名称被命名为 ActiveMQ.Advisory.Consumer.Queue.XYZ,而我要连接的队列(由 java 客户端创建)被命名为 XYZ.

有没有办法订阅这个 "short" 名称队列?

import stomp

QUEUE_NAME='XYZ'

class MyListener(stomp.ConnectionListener):
    def on_error(self, headers, message):
        print('received an error "%s"' % message)
    def on_message(self, headers, message):
        print('received a message "%s"' % message)

headers = {}
conn = stomp.Connection( )
conn.set_listener('127.0.0.1:61616', MyListener())
conn.start()
conn.connect('admin', 'admin', wait=True)

conn.subscribe(destination=QUEUE_NAME, id=2, ack='auto')

time.sleep(6660)
conn.disconnect()

本地ActiveMQ控制台显示"Topic":

而真实服务器有一个简称队列:

这看起来像是为了支持 "advisory messages" 的正常经纪人行为。它不应该对您的应用程序有任何直接影响。有关详细信息,请参阅 ActiveMQ documentation on this subject

终于回到这个问题了...看了一些其他的例子后,我猜到了一个答案,经过测试,成功了(呸!)。以前我可以看到我自己的消息,但是目标订阅者(写在java)从来没有收到我的消息。

如果你想用当前的stomp库发送到现有的ActiveMQ队列,队列名需要加上前缀/topic/。例如(根据我的问题)如果你想发送到名为 XYZ 的队列,stomp 发送代码需要使用目的地 /topic/XYZ如果这在某处有记录,我找不到它!

必填代码段:

import time
import stomp

MQ_SERVER     = "192.168.1.111"
MQ_PORT       = 61613
MQ_USERNAME   = "user"
MQ_PASSWORD   = "pass"
MQ_QUEUENAME  = 'XYZ'

conn = stomp.Connection( [( MQ_SERVER, MQ_PORT )] )
conn.start()
conn.connect( MQ_USERNAME, MQ_PASSWORD, wait=True )

for i in range( 3 ):
    conn.send( body="Hello World", destination='/topic/'+MQ_QUEUENAME )  # <- HERE
    time.sleep( 1 )

conn.disconnect()

我不确定这是否仅适用于 ActiveMQ,还是适用于其他消息系统风格。