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);
}
消息得到redelivered是我所期望的。但是我的擔心是,當一條消息被拒絕時,爲什麼監聽器沒有在隊列中處理其他消息。 – rupesh
RabbitMQ在隊列頭部重排被拒絕的消息,所以如果你只有'concurrency =「1」',它將被重新處理(並且先被拒絕)。您還可以從默認值(1)增加'prefetch',以便在收到拒絕之前將其他消息發送給使用者。 –
感謝您的回覆。我在MessageListener [在onMessage()方法]中放置了一個斷點。當第一條消息被拾取時,中斷點被執行。之後,我收到失敗,消息仍處於「Unacked」狀態[我在RabbitMQ控制檯上查看]。如果你說這條消息在隊列頭部重新排隊並重新處理,那麼我的斷點應該再次執行,並且消息應該從「未確定」狀態移動到「準備就緒」狀態。我的代碼中有些東西看起來不對。你能讓我知道我做錯了什麼嗎? – rupesh