2017-04-18 110 views
0

我正在使用Spring AMQP處理RabbitMQ中的消息。

下面是問題:
1.(比方說)裏面有3條信息處於就緒狀態RabbitMQ
2.第一個被MessageListener接收並開始處理。 (說)它結束了拋出一個異常
3.在這種情況下,容器保持啓動,但其餘2消息不處理,直到我重新啓動容器。第一個消息也處於未確認狀態。

當MessageListener拋出異常時,RabbitMQ監聽器停止監聽消息

它是預期的行爲嗎?如果沒有,如何確保其他2條消息將被處理,而不管第一個處理失敗?

MQ configuraion

<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" /> 

<rabbit:admin connection-factory="connectionFactory" /> 

<rabbit:listener-container 
    connection-factory="connectionFactory" 
    concurrency="1" 
    acknowledge="auto"> 
    <rabbit:listener queue-names="testQueue" ref="myProcessorListener " /> 
</rabbit:listener-container> 

MessageListener類

public class MyProcessorListener implements MessageListener{ 
.... 
    @Override 
public void onMessage(Message message) { 
try{ 
...Some logic... 

} catch (Exception e) { 
    throw new RuntimeException(e.getMessage(), e); 
} 

回答

1

該消息被重新傳送一遍又一遍;爲了拒絕(並丟棄或路由到死信隊列),您需要丟棄AmqpRejectAndDontRequeueException或將容器的requeue-rejected屬性設置爲false。使用Java進行配置時,它的格式爲defaultRequeueRejected

您也可以使用自定義錯誤處理程序。

這是全部explained in the reference manual

+0

消息得到redelivered是我所期望的。但是我的擔心是,當一條消息被拒絕時,爲什麼監聽器沒有在隊列中處理其他消息。 – rupesh

+0

RabbitMQ在隊列頭部重排被拒絕的消息,所以如果你只有'concurrency =「1」',它將被重新處理(並且先被拒絕)。您還可以從默認值(1)增加'prefetch',以便在收到拒絕之前將其他消息發送給使用者。 –

+0

感謝您的回覆。我在MessageListener [在onMessage()方法]中放置了一個斷點。當第一條消息被拾取時,中斷點被執行。之後,我收到失敗,消息仍處於「Unacked」狀態[我在RabbitMQ控制檯上查看]。如果你說這條消息在隊列頭部重新排隊並重新處理,那麼我的斷點應該再次執行,並且消息應該從「未確定」狀態移動到「準備就緒」狀態。我的代碼中有些東西看起來不對。你能讓我知道我做錯了什麼嗎? – rupesh