2014-08-29 56 views
0

據我所知(http://activemq.apache.org/message-redelivery-and-dlq-handling.html)可以由消費者或經紀人完成重新交付。 我有一些問題,但:JMS/Active MQ - 經紀人與消費者重新交付

消費者的重新交付如何在底下工作?消費者是否緩存來自代理商的消息並在本地重新發送消息?如果消費者在兩者之間終止會發生什麼?這樣的消息將會丟失?我認爲,只要消費者不承認消息不應該。但在這種情況下,該消息仍然可以在經紀商處獲得?

是否有任何指導何時使用經紀人與消費者重新交付?任何建議?

回答

3

消費者在本地緩存消息並將其重新傳遞給客戶端,直到滿足重新傳遞計數爲止,然後自動將消息認爲是壞消息(posin ack)。消費者可以根據確認模式控制是否將其標記爲重新發送。如果無論出於何種原因,消費者不能或不想處理消息,則它也可以將其踢回,並且如果它關閉會話,它將再次可用於消費。

經紀人將持有該消息,直到它從消費者得到一個確認。如果您的消費者設置爲AUTO_ACKNOWLEDGE,那麼如果發生未處理的異常或消費者意外終止,則可能會丟失消息。否則,如果您的消費者正在使用事務或CLIENT_ACKNOWLEDGE,它會給你對何時發生的控制。

對於事務,如果消費者在提交之前下降,它將可用於下一個消費者或消費者重新連接時。

我一直使用CLIENT_ACKNOWLEDGE事務,所以我不想肯定地說,如果Session.recover()在消費者關閉之前沒有被調用,消息將會丟失。

從消費者的角度來看,這也被稱爲重試邏輯。

關於經紀人與消費者的重新交付:默認情況下,經紀人只是一直給消費者提供相同的消息,直到滿足重新交付計數。如果您告訴經紀人在給定的時間後不要重新發送,那麼您的消費者可以使用其他可能被處理的消息。

什麼時候這樣做是真的取決於你的應用程序正在發生什麼。也許一個特定的消息需要被放到一個數據庫中,並且該數據庫目前不可用,並且您想要轉移到其他地方的消息/有另一個目的?

+0

這不完全正確。 ActiveMQ MessageConsumer確實擁有已在交易中交付的消息緩存,並將在發送回滾時將其本地重新發送至設置的重新傳遞限制。 – 2014-08-29 21:30:34

+0

@TimBish感謝您的標註。我以爲已經編輯過這個。我開始思考其他事情的迴應。 – 2014-08-30 02:45:26

+0

這是否意味着如果我們選擇經紀人重新交付,那麼消息將不會緩存在消費者身上,並且每次都來自代理(從而增加網絡使用)?另一個問題是:是否有類似確認超時的情況,以便經紀人或消費者在一段時間後不重新發送消息而沒有ACK? – Janek 2014-08-31 17:03:51