【问题标题】:Trouble subscribing to ActiveMQ Artemis with Stomp. Queue already exists使用 Stomp 订阅 ActiveMQ Artemis 时遇到问题。队列已存在
【发布时间】:2021-05-25 01:48:18
【问题描述】:

我在这里做错了什么?我正在尝试使用 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()

【问题讨论】:

  • 您为什么使用完全限定队列名称 (FQQN)?正常用例不需要这个。另外,您使用的是什么版本的 ActiveMQ Artemis?
  • 我也试过只使用队列名称。我希望队列由订阅创建,然后在断开连接后消失,而 FQQN 最适合这个。
  • 多播(又名发布订阅或主题)和任播(又名点对点或队列)语义的工作方式之间存在明显差异。你在寻找什么确切的行为?另外,您使用的是什么版本的 ActiveMQ Artemis?
  • Artemis 2.13.0 多播。我正在发布到一个地址,目的是在订阅者连接时创建要订阅的队列。
  • 如果您使用多播并且希望您的客户端接收发布到某个地址的消息,那么为什么不订阅多播地址(即主题)而不是 FQQN?这就是这个用例通常要做的事情。

标签: python stomp activemq-artemis


【解决方案1】:

我建议您尝试latest release of ActiveMQ Artemis。自一年前发布 2.13.0 以来,一些与 STOMP 相关的问题已得到修复,具体ARTEMIS-2817 看起来像您的用例。

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

此外,如果您想使用topic/ 或queue/ 前缀来控制来自代理的路由语义,那么您应该按照the documentation 中的描述适当地设置anycastPrefix 和multicastPrefix。


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

【讨论】:

  • 那么如果我有多个订阅者需要共享消息,我应该订阅主题(地址)吗?我升级到2.17。 Stomp 现在效果更好,但是当我订阅 test.topic 时,我收到一个错误,提示 queue: test.topic 不存在。如果我尝试 topic/test.topic,Artemis“topic/test.topic”中会出现一个新主题。我越来越糊涂了。
  • 我更新了我的答案以解决您的评论。就“队列:test.topic 不存在”问题而言,您可能需要为此创建一个新问题,以便充实所有细节。希望有帮助!
猜你喜欢
  • 2013-01-16
  • 2020-06-23
  • 2021-06-09
  • 2020-12-26
  • 2015-03-12
  • 2019-09-30
  • 2018-10-31
  • 2018-11-05
  • 2017-09-13
相关资源
最近更新 更多