所以我已经声明了一个长度为1的队列,并且发布者不会自动发送消息,这意味着我收到了每条消息都收到了消息。那么这里发生的消息是什么?
当新邮件到达队列时,旧的未经处理的邮件会发生什么??
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应该只保留一条消息,任何发布者都可以阅读该消息,但不应该删除该消息。当新消息到达队列时,它应该删除该消息并放入新消息。
答案 0 :(得分:2)
RabbitMQ无法删除已传递给消费者的消息。如果消费者决定回复消息,那么RabbitMQ将等待消费者的ack / nack或拒绝,以决定如何处理所述消息。
传递给消费者的邮件不计入队列长度。
来自文档:
在所有情况下都使用就绪消息的数量;未确认的消息不计入限制。
https://www.rabbitmq.com/maxlength.html
想象一下,你在机场的队列中,然后轮到你办理登机手续,你不再在队列中,如果有人被要求计算队列长度,那个人不会带你去考虑到了。 RabbitMQ与队列长度类似。