我使用默认的ActiveMQ(版本5.10.0)配置,该配置应该将消息持久保存到磁盘。
当我在主题上发布一些消息时,关闭activemq,再次重新启动它然后启动消费者,消费者不会收到消息。
这里有详细说明。
那么,我发来的消息怎么了?
我用于发布的命令:
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个已排队,已分派和已出列的消息。我在这里做错了什么?
格里
答案 0 :(得分:0)
主题不支持没有持久订阅的持久性,也不支持排队解决方案的主题之一,例如虚拟主题。但是,REST API不支持持久订阅, 所以你有两个选择。
如果您要求多个订阅者获取邮件的副本,并确保邮件在中断后仍然存在,则可以使用Virtual Topics and/or Composite queues。
但是,如果您只关心下一个消费者获取消息,那么您只需指定&#34; queue&#34;就可以直接进入队列。作为上例中的类型:
curl -u admin:admin -d "body=test" "http://localhost:8161/api/message/erdata" -d type=queue