使用 REST 时的 ActiveMQ 持久性问题

Posted

技术标签:

【中文标题】使用 REST 时的 ActiveMQ 持久性问题【英文标题】:ActiveMQ persistence issue while using REST 【发布时间】:2015-01-21 05:01:37 【问题描述】:

我正在使用默认的 ActiveMQ(版本 5.10.0)配置,该配置应该将消息保存到磁盘。

当我在一个主题上发布一些消息时,关闭activemq,重新启动它然后启动消费者,消费者没有收到消息。

这里有详细的说明。

    我使用 REST 接口为主题 X 订阅消费者。 我使用 REST 发布关于主题 X 的消息 我关闭了 ActiveMQ,然后重新启动它。 我启动了一个消费者来接收关于主题 X 的消息。没有收到任何内容。

那么,我发送的消息发生了什么?

我用于发布的命令:

curl -u admin:admin -d "body=test" "http://localhost:8161/api/message/erdata" -d type=topic

订阅命令:

wget --user admin --password admin --save-cookies cookies.txt --load-cookies cookies.txt --keep-session-cookies "http://localhost:8161/api/message/erdata?type=topic&clientId=consumer"

更新

根据 Erik 的回答,我尝试使用虚拟主题。 我已将以下代码添加到 activemq.xml:

<destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <virtualTopic name=">" prefix="VirtualTopicConsumers.*." selectorAware="false"/>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>

我还更改了发布和消费的命令。

用于发布的新命令:

curl -u admin:admin -d "body=val1" "http://localhost:8161/api/message/VirtualTopic/erdata" -d type=topic

新的消费命令:

wget --user admin --password admin --save-cookies cookies.txt --load-cookies cookies.txt --keep-session-cookies "http://localhost:8161/api/message/Consumer/A/VirtualTopic/erdata?type=queue&clientId=A"

现在的问题是我什至没有在消费者中收到任何消息。 hawtio 告诉我,我有一个主题 VirtualTopic.erdata,其中有 0 个消费者,4 条消息入队,0 条出队和 0 条分派消息。有一个队列 Consumer.A.VirtualTopic.erdata 有 1 个消费者,但有 0 个已入队、已分派和已出队的消息。我在这里做错了什么?

格雷戈

【问题讨论】:

【参考方案1】:

主题不支持没有持久订阅的持久性,或队列解决方案中的主题之一,例如虚拟主题。但是 REST API 不支持持久订阅, 所以你有几个选择。

如果您需要多个订阅者获取消息的副本,并确保消息在中断后仍然存在,您可以使用Virtual Topics and/or Composite queues。

但是,如果您只关心下一个消费者收到消息,那么您只需将“队列”指定为上面示例中的类型即可直接放入队列:

curl -u admin:admin -d "body=test" "http://localhost:8161/api/message/erdata" -d type=queue

【讨论】:

您好,埃里克,感谢您的回答。我试过了,现在我的主题订阅中没有收到任何消息。我已经在上面更新的问题中写下了我的更改 - 你能告诉我我的错误在哪里吗? 查看创建的队列名称与您使用的 URL。 Consumer/A/VirtualTopic/erdata 创建了一个名为 Consumer.A.VirtualTopic.erdata 的队列。如果将其更改为 VirtualTopic/erdata,那么您将监听消息被持久保存到的同一个队列。使用您设置的复制和粘贴 VT,所有主题都会将消息复制到以 VirtualTopic 开头的队列。阅读文档了解更多详情。

以上是关于使用 REST 时的 ActiveMQ 持久性问题的主要内容,如果未能解决你的问题,请参考以下文章

Activemq 是不是保证持久化?

深入讲解ActiveMQ5.X消息的持久性

使用 KahaDB 时如何持久化 Activemq 队列/主题中的消息?

jersey rest web 服务与 Activemq 中间件集成

ActiveMq:持久队列和离线系统

SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用