使用 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 持久性问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 KahaDB 时如何持久化 Activemq 队列/主题中的消息?