使用REST时ActiveMQ持久性问题

问题描述:

我正在使用默认的ActiveMQ(版本5.10.0)配置,它应该将消息保留到磁盘。使用REST时ActiveMQ持久性问题

当我在主题上发布某些消息时,请关闭activemq,重新启动它,然后启动使用者,使用者不会收到消息。

这里是一个详细的描述。

  1. 我使用REST接口为主题X订阅消费者。
  2. 我使用REST发布有关主题X的消息
  3. 我关闭了ActiveMQ,然后重新启动它。
  4. 我开始消费者接收关于主题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"

UPDATE

基于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个入队,分派和出队消息。我在这里做错了什么?

格雷戈尔

主题不支持持久耐用不订阅,或话题的一个排队的解决方案,如虚拟主题。但是,REST API不支持持久订阅,因此您只剩下几个选项。

如果您需要多个订户获取该消息的副本,并确保该消息存在中断,则可以使用Virtual Topics and/or Composite queues

不过,如果你只关心接下来的消费者得到消息,那么你可以把直到队列只需在你的榜样指定“队列”作为类型上面:

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

喜埃里克,感谢你的答案。我尝试过,现在我的主题订阅中没有收到任何消息。我在上面更新的问题中写了我的更改 - 你能告诉我我的错误在哪里吗? – 2014-11-24 09:40:43

+0

查看创建的队列名称与您使用的URL。 Consumer/A/VirtualTopic/erdata创建了一个名为Consumer.A.VirtualTopic.erdata的队列。如果您将此更改为VirtualTopic/erdata,则您将收听消息正在持续保存的同一队列。使用您设置的复制和粘贴VT,所有主题都会将消息复制到以VirtualTopic开头的队列中。阅读文档以获取更多细节。 – 2014-11-24 14:52:36