使用 Stomp 订阅 ActiveMQ Artemis 时遇到问题。队列已存在

Trouble subscribing to ActiveMQ Artemis with Stomp. Queue already exists

我在这里做错了什么?我正在尝试使用 Stomp 来测试 Artemis 2.13.0 的某些内容,但是当我使用 Python 脚本的命令行实用程序时,我无法订阅队列,即使在我使用该实用程序之后也是如此将消息发布到地址。

此外,如果我给它一个新的队列名称,它会创建它,但不会拉取我发布给它的消息。这令人困惑。我的实际 Java 应用程序的行为与此完全不同——它使用的是 JMS

我与实用程序的连接是这样的:

stomp -H 192.168.56.105 -P 61616 -U user -W password
> subscribe test3.topic::test.A.queue

哪个给我这个错误:

Subscribing to 'test3.topic::test.A.queue' with acknowledge set to 'auto', id set to '1'
>
AMQ229019: Queue test.A.queue already exists on address test3.topic

这让我觉得 Stomp 在订阅时试图创建队列,但我在文档中看不到如何管理它。 http://jasonrbriggs.github.io/stomp.py/api.html

我也有一个 Python 脚本给了我同样的问题。

import os
import time
import stomp

def connect_and_subscribe(conn):
    conn.connect('user', 'password', wait=True)
    conn.subscribe(destination='test3.topic::test.A.queue', id=1, ack='auto')

class MyListener(stomp.ConnectionListener):
    def __init__(self, conn):
        self.conn = conn

    def on_error(self, headers, message):
        print('received an error "%s"' % message)

    def on_message(self, headers, message):
        print('received a message "%s"' % message)
        """for x in range(10):
            print(x)
            time.sleep(1)
        print('processed message')"""

    def on_disconnected(self):
        print('disconnected')
        connect_and_subscribe(self.conn)

conn = stomp.Connection([('192.168.56.105', 61616)], heartbeats=(4000, 4000))
conn.set_listener('', MyListener(conn))
connect_and_subscribe(conn)
time.sleep(1000)
conn.disconnect()

我建议您尝试 latest release of ActiveMQ Artemis. Since 2.13.0 was released a year ago a handful of STOMP related issues have been fixed specifically ARTEMIS-2817,它看起来像您的用例。

我不清楚 为什么 您使用完全限定队列名称 (FQQN),所以我倾向于认为这不是正确的方法,但无论您遇到什么问题,都应该在以后的版本中得到修复。如果您希望多个消费者共享单个订阅中的消息,那么使用 FQQN 将是一个不错的选择。

此外,如果您想使用 topic/queue/ 前缀来控制来自代理的路由语义,那么您应该适当地设置 anycastPrefixmulticastPrefix 作为the documentation.

中描述

这可能是巧合,但 ARTEMIS-2817 最初是由“BENJAMIN Lee WARRICK”报道的,它与“BenW”(即你的名字)惊人地相似。