2014-11-23 122 views
0

我正在使用默認的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個入隊,分派和出隊消息。我在這裏做錯了什麼?

格雷戈爾

回答

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