2014-10-20 38 views
1

我有關於重新傳遞郵件的問題。ActiveMQ和redelivery

的設置如下:

兩個AMQ實例AMQ1和AMQ2(版本5.10.0)在主/從配置中運行(其中AMQ1是主站)和兩個消費者A和B由相同的隊列取出問:客戶端被配置爲使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE,並且它們坐在循環提取(拉模式)消息中,沒有確認任何消息。

測試用例:

  1. 發送持久消息到隊列Q.
  2. 該消息由A.
  3. 停止AMQ1消耗,這帶來了AMQ2。現在

,兩種情況之一發生:

一)消費者再次接收到該消息導致該消息被放在死信隊列。 b)消費者B收到消息,現在A和B都有相同的消息。

在a)我面對的問題是,如果A崩潰的消息丟失。在b)問題是,現在兩個消費者採取相同的信息。

是否有可能配置AMQ以跟蹤重新連接使用者,因此如果它發現它已經存在於某些消費者中,它不會重新發送消息?至少應該有a)的方法來避免將消息放入DLQ中?

謝謝!

+0

您是否有理由等待確認您的消息?如果你不告訴經紀人你已經處理了這封郵件,它將在郵件恢復時嘗試重新發送郵件。我很驚訝你看到了行爲a),但b)對你所描述的內容非常期待。 – Tim 2014-10-21 00:35:44

+1

@Tim我正在處理需要幾分鐘才能完成的消息。我將最終確認這個消息,但在此過程中重新啓動AMQ將導致我的問題中描述的測試用例。 – garfen235 2014-10-21 08:07:20

+0

好的,根據你的描述,聽起來好像你的消費者會在不承認第一條消息的情況下拉第二條(和第三條,第四條等)消息。感謝您的澄清。 – Tim 2014-10-21 15:49:45

回答

1

我不相信有一種方法可以配置ActiveMQ重新發送消息,如果客戶端重新連接,因爲客戶端重新啓動,但不是如果代理重新啓動或故障轉移。您最好的選擇可能是堅持在您的客戶端JMSMessageID爲您已處理,但沒有ack'ed任何消息,以便您可以忽略重複時,他們再次到達,這將解決問題在A中。

您可以使用message groups來確保郵件始終發送給同一個使用者(防止方案B),但我從來沒有使用過它們,因此我不確定它們是否適用於故障轉移場景中的兩個代理。但如果你認爲它可能會有所幫助,那麼這將是一個簡單的測試。