2017-01-07 35 views
0

使用Spring-boot和Spring-starter-amqp作爲我的消息傳遞應用程序。我的問題場景是這樣的:Spring RabbitMQ - Message Requeue limit

第一個問題:我想重發我的消息只有5次,然後消息應該從隊列中發出,如果發生業務異常(這裏我只關注業務異常)。

第二個問題:如果第一個用例是可能的,我們可以通過某種方式增加嘗試次數。假設在第一次嘗試時發生業務異常,它應該立即要求,但在第二次嘗試中,應該在2分鐘後然後4分鐘,然後6分鐘,然後8分鐘,然後10分鐘,如時間將根據嘗試增加。

感謝

回答

0

對於簡單的情況下(嘗試之間固定延遲),您可以配置隊列發送拒絕的郵件一紙空文交流,並拋出AmqpRejectAndDontRequeueException

將隊列綁定到死信交換,並在該隊列上設置一個生存時間(ttl),並使用原始隊列綁定到的死信交換進行配置。該消息將在TTL到期後重新發送。

您需要檢查x-death標頭以確定消息已遍歷循環的次數。重試完畢後,拋出一個ImmediateAcknowledgeAmqpException放棄該消息。

對於可變延遲,您必須自己重新發布消息,進行延遲消息交換(有一個代理插件),每次重試延遲都會增加。

另請參閱this answer

+0

不想使用代理插件;我們可以使用自定義攔截器來做到這一點嗎? – blackOcean

+0

否;對於變量延遲,您將不得不使用延遲的消息交換插件或將消息自己發佈到DLQ你可以使用帶有messageProperties.setExpiration()的'RabbitTemplate.send(message)''參見[這裏](https://www.rabbitmq.com/ttl.html) - Spring AMQP將映射到期 –

+0

如果我使用RabbitTemplate.send(message)發送消息)和messageProperties.setExpiration()來延遲消息超時。我如何計算由於消費者的業務異常導致的失敗嘗試的次數 – blackOcean