2015-06-22 56 views
0

因此,我已經聲明瞭一個長度爲1的隊列,並且發佈者不會自動確認這些消息,這意味着我已收到我收到的每條消息。因此,這裏發生的消息不是消息嗎?在1個長度的隊列中沒有在rabbitmq中收到的消息會發生什麼?

當新消息到達隊列中時,舊的未消息消息會發生什麼情況?

Map < String, Object > args = new HashMap < String, Object >(); 
args.put("x-max-length", 1); 
channel.queueDeclare("myqueue", false, false, false, args); 
channel.basicConsume("myqueue", false, consumer); 

我想要實現的是myqueue只能容納一條消息,任何發佈者都可以閱讀該消息,但不應該刪除該消息。當新消息到達隊列時,它應該擦除該消息並放入新消息。

回答

1

RabbitMQ無法刪除已經傳遞給使用者的消息。如果消費者決定對消息進行確認,那麼RabbitMQ將等待消費者的ack/nack或者拒絕,以便決定如何處理所述消息。

傳遞給消費者的消息不計入隊列長度。

從文檔:

在用於準備消息的數量的所有病例;未確認的消息不計入極限。

https://www.rabbitmq.com/maxlength.html

想象你是在機場排隊,然後輪到你辦理登機手續,你是不是在排隊了,如果有人問算隊列長度,即人不會把你考慮在內。 RabbitMQ與隊列長度類似。

+0

感謝您的回答,但是我通過發送不ack來實現我的目的,然後而不是使用basicConsume,我已經使用了basicGet,它現在將隊列用作長度1並始終保存最新消息。 – Mani

相關問題