[发送/订阅JMS对象,ActiveMQ Artemis和STOMP时如何指定主题或队列

问题描述 投票:0回答:1

我正在使用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>
jms stomp activemq-artemis stomp.py
1个回答
0
投票

让我先提供一些背景信息...

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
© www.soinside.com 2019 - 2024. All rights reserved.