2013-05-29 40 views
0

我正在嘗試使用.NET客戶端創建基於ActiveMQ的基於消息的應用程序。JMS:更新消息版本/阻止某些消息排入隊列

  • 客戶1:Web服務(製片人)
  • 客戶2:Windows服務(消費者)

我的問題是:是否有可能阻止某種類型或含量分別從消息正在由客戶端排隊?

我想這樣做的原因是版本更新。

我想會有一段時間,當我需要擴展或更改消息類型。 我的計劃是按照以下順序進行更新:

  1. 阻止舊版本的消息排隊。
  2. 等到消費者處理完所有舊版本的消息。
  3. 更新生產者和消費者軟件。

我希望Web服務在更新過程中仍然可用以報告給調用。但它不應該能夠排隊新的消息。

當然,如果有更好的方法來解決這個問題,請讓我知道。

回答

1

一般來說,每個隊列只有一種有效載荷是個好主意。一個簡單的方法是爲兩個不同的消息版本使用兩個不同的隊列。喜歡的東西:

mysystem.orders.1_0 
mysystem.orders.1_1 

版本應該是隊列名稱的最後一部分,因爲它可以很容易地與wildcards,它被用於很多在ActiveMQ中的配置選項工作。

將不同的版本拆分成不同的隊列可以解決不得不同時升級生產者和消費者的問題,並且還會告訴您是否所有1_0消息都已被使用。

+0

好的,這聽起來不錯。但有沒有辦法'關閉'過時的隊列mysystem.orders.1_0,所以舊的Web服務得到一個異常或什麼? –

+0

是的,但只有當您通過塊靜態定義所有目標(您將刪除1_0),並設置用戶授權插件以使admin =「false」(意味着它們無法創建目標動態;請參閱http://activemq.apache.org/security)。然後,您需要重新啓動ActiveMQ來獲取新的靜態目標,然後通過JMX刪除該隊列。 –