我正在使用ActiveMQ Artemis消息系统,并且正在使用STOMP(stomp.py)测试我的设置。
我在Artemis上创建了一个名为Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic的“地址”,并为其附加了两个队列:Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue和Site.SOF。 Order.Fulfillment.Submission.ActiveOmni.log.queue
我创建了可以访问站点的用户。*
那么我如何访问队列?例如,如果我像这样使用stomp.py命令行工具:
> subscribe Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue
我收到错误:[用户名]在地址Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue上没有权限='CREATE_ADDRESS'
所以我尝试在前面添加“ / queue /”,如我在教程中所见
> subscribe /queue/Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue
但是我遇到相同的错误:[用户名]在地址/queue/Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue上没有权限='CREATE_ADDRESS'
我可以毫无问题地发送到主题/地址。以下结果将在两个队列中均出现“ hello”消息。
send Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic "hello"
我是否缺少此命名约定?还是指定主题与队列的方法?我在这里遗漏了什么太明显而无法清楚记录的东西?
谢谢!
<bindings>
<address-binding routing-types="ANYCAST" name="DLQ" id="2"/>
<address-binding routing-types="ANYCAST" name="ExpiryQueue" id="6"/>
<address-binding routing-types="MULTICAST" name="activemq.notifications" id="10"/>
<address-binding routing-types="MULTICAST" name="Site.SOF.Order.Fulfillment.Submission.Topic" id="92"/>
<queue-binding address="Site.SOF.Order.Fulfillment.Submission.Topic" filter-string="" name="Site.SOF.Order.Fulfillment.Submission.log.Queue" id="97" routing-type="MULTICAST"/>
<queue-binding address="DLQ" filter-string="" name="DLQ" id="4" routing-type="ANYCAST"/>
<queue-binding address="ExpiryQueue" filter-string="" name="ExpiryQueue" id="8" routing-type="ANYCAST"/>
<queue-binding address="Site.SOF.Order.Fulfillment.Submission.Topic" filter-string="" name="Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Queue" id="94" routing-type="MULTICAST"/>
</bindings>
让我先提供一些背景信息...
ActiveMQ Artemis地址模型包括3个主要元素-地址,队列和路由类型。这些是低级实体,用于为代理支持的所有不同协议和配置实现所有不同的语义。
相反,STOMP仅支持模糊的“目的地”。 STOMP 1.2 specification谈到目的地:
STOMP服务器被建模为可以向其发送消息的一组目的地。 STOMP协议将目标视为不透明字符串,并且其语法是服务器实现特定的。此外,STOMP并未定义目的地的传递语义。目的地的传递或“消息交换”的语义可能因服务器而异,甚至因目的地而异。这使服务器可以利用STOMP支持的语义进行创新。
在核心地址模型中,消息被发送到地址并从队列中使用。地址和队列是独立命名的,因此核心生产者和消费者使用的名称可以不同。
ActiveMQ Artemis支持STOMP目的地的点对点和pub / sub语义。您可以在latest ActiveMQ Artemis STOMP documentation中阅读有关如何配置这些语义的更多信息。
在STOMP点对点用例中,消息被发送到目的地,并从同一目的地消费。 STOMP生产者和消费者使用的名称相同。为了支持这些语义,代理使用核心地址和核心anycast队列具有相同名称。
在STOMP发布/订阅用例中,客户端在目标上创建订阅,然后该订阅可用于接收发送到该目标的消息。 STOMP订户和生产者都使用的名称相同。为了支持这些语义,代理使用核心地址和核心multicast队列具有不同名称。核心队列的名称由代理自动生成。然后,订阅者可以直接从底层核心订阅队列接收消息。
所有这些工作都是在STOMP客户端的幕后完成的,但是了解STOMP如何映射到ActiveMQ Artemis的地址模型很重要,因此您可以适当地配置它]
在您的情况下,您已经为一个地址配置了2个multicast
队列,并且尝试从这些队列中使用。此用例是点对点和pub / sub之间的混合,因为您具有静态定义的队列(即,不是代理自动为响应订户而自动创建的队列),但是队列是多播的。这些队列就像静态配置的持久订阅。要直接访问队列,您需要使用客户端中的标准队列名称(即FQQN)。 FQQN遵循<address>::<queue>
的模式,因此您可以使用[]Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic::Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue
或
Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic::Site.SOF.Order.Fulfillment.Submission.ActiveOmni.log.queue