当前位置: 首页 > 知识库问答 >
问题:

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

壤驷华辉
2023-03-14

我正在使用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(组播)
<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>

那么如何访问队列呢?例如,如果我使用stomp.py命令行工具,如下所示:

>订阅site.sof.order.fulfillment.submission.activeomni.queue

我得到了错误:

[username] does not have permission='CREATE_ADDRESS' on address /queue/Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

发送site.sof.order.fulfillment.submission.activeomni.topic“hello”

这是我遗漏的命名约定吗?还是一种指定主题vs队列的方法?我在这里遗漏了什么,太明显了,无法清楚地记录下来?

共有1个答案

罗伟志
2023-03-14

让我先提供一些背景资料...

ActiveMQ Artemis地址模型包括3个主要元素--地址、队列和路由类型。这些是低级实体,用于实现代理支持的所有不同协议和配置的所有不同语义。

相比之下,STOMP只支持模棱两可的“目的地”。STOMP1.2规范对目的地做了如下说明:

ActiveMQ Artemis支持STOMP目的地的点对点和pub/sub语义。您可以在最新的ActiveMQ Artemis STOMP文档中阅读有关如何配置这些语义的更多信息。

在STOMP点对点用例中,消息被发送到目的地,并从同一目的地消费。STOMP生产者和消费者使用的名称相同。为了支持这些语义,代理使用具有相同名称的核心地址和核心选播队列。

在STOMP pub/sub用例中,客户机在目的地创建订阅,然后可以使用订阅接收发送到该目的地的消息。STOMP订阅者和生产者使用的名称相同。为了支持这些语义,代理使用具有不同名称的核心地址和核心组播队列。核心队列的名称由代理自动生成。然后,订阅服务器可以直接从基础核心订阅队列接收消息。

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
 类似资料:
  • 目前,我已经开始使用ActiveMQ处理JMS主题。我已经通过JAVA代码(如下所述)创建了发布者和持久订阅者,并且在订阅者端也收到了消息。 Publisher.Java 订阅者.java 我对以下主题有一些疑问, 如何检查有多少订阅者使用 Java JMS 在主题中主动查找消息? 如何从主题中获取活动和持久订阅者列表? 我们是否可以删除主题中发布的消息? 在这些情况下帮助我。 提前致谢。

  • 我正在试验消息驱动Beans,以便从外部ActiveMQ实例接收主题订阅消息。 我的测试首先从队列订阅开始,它工作得很好。 然后我想尝试主题订阅,但我无法让它工作。 这就是我所拥有的: 会议记录。xml 这是MDB: 我不知道为什么,但从日志中我可以看到,TomEE创建了一个队列,而不是一个主题: 另一个证明是,当我添加持续时间配置时,服务器不会启动: 然后服务器抱怨这不适合配置类型javax.j

  • 我正在开发消息推送给订阅特定事件的所有用户子集。用户订阅RabbitMQ中的主题,格式为:user-id.event-type.id.我使用Spring WebSockJS、Stomp、RabbitMQ以及前端SockJS和Angular JS。用户应该被通知关于事件的所有行动(评论等,日期更改)。 到目前为止,我们拥有的: 首先,我通过REST webservice终结点进行身份验证,并将令牌放

  • 是否有一种方法可以使用AWS CLI列出特定SQS队列订阅的所有AWS SNS主题? 我已经知道如何看到一个SNS主题上的订阅者列表,但这只有在我知道SNS主题的名称时才起作用。在这种情况下,我只知道SQS队列的名称。 我在网上搜索什么也找不到。

  • 我试图利用固有的WSO2ESB主题发布到jms队列。我已经创建了主题,并提供了一个订阅者URL:jms:/topictest?transport.jms.destinationtype=queue。然而,当我将消息发布到主题时,它不能被传递到队列。日志生成以下内容 “系统无法从jms:/queue?destination=topictest URL推断传输信息。” 另外,我似乎不知道如何发布到WS