【问题标题】:What happens to message in queue of 1 length which is not acked in rabbitmq?在rabbitmq中未确认的长度为1的队列中的消息会发生什么?
【发布时间】:2015-09-07 23:04:09
【问题描述】:

所以我已经声明了一个长度为 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 应该只保存一条消息,并且任何发布者都可以阅读该消息,但它不应该删除该消息。当新消息到达队列时,它应该删除该消息并放入新消息。

【问题讨论】:

    标签: java rabbitmq message-queue


    【解决方案1】:

    RabbitMQ 不能删除已经传递给消费者的消息。如果消费者决定确认消息,那么 RabbitMQ 将等待来自消费者的确认/确认或拒绝,以便决定如何处理该消息。

    传递给消费者的消息不计入队列长度。

    来自文档:

    在所有情况下都使用就绪消息的数量;未确认的消息不计入限制。

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

    假设你在机场排队,然后轮到你办理登机手续,你不再排队,如果有人被要求计算排队长度,那个人不会考虑你. RabbitMQ 对队列长度做了类似的事情。

    【讨论】:

    • 感谢您的回答,但是我通过不发送 ack 实现了我的目的,然后我没有使用 basicConsume,而是使用了 basicGet,它现在使用队列作为长度 1 并始终保存最新消息。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2021-07-21
    • 2015-11-24
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多