【问题标题】:how to requeue a message using spring ampq如何使用spring amqp重新排队消息
【发布时间】:2016-12-13 22:18:11
【问题描述】:

在重新排队消息时,我们希望将消息放置在队列的开头/前面。 这意味着如果我在队列中作为“D、C、B、A”和进程 A,然后想在开始时放回队列中,我的队列应该如下所示:- “A,D,C,B”。 因此,我应该能够处理 B,并且由于 A 在队列的开头移动,因此应该在末尾处理它。

有趣的是,当尝试使用 rabbitMQ 的本机 AMQP 库时,它可以按上述预期工作。

但是,当我们通过 spring AMQP library 进行处理时,消息仍然保留在原来的位置,不会到达队列的最前面。

这是我们尝试过的代码:

public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception {
    if(new String(message.getBody()).equalsIgnoreCase("A")){
            System.out.println("Message = =="+new String(message.getBody()));

            channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
        }else{
            System.out.println("Message ==="+new String(message.getBody()));
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        }

}

知道为什么它在 Spring 中不起作用但在 rabbimq amqp 本机库中起作用吗?

Spring AMQP 版本:spring-amqp-1.4.5.RELEASE Rabbitmq amqp 客户端版本:3.5.1

【问题讨论】:

    标签: rabbitmq spring-amqp spring-rabbit


    【解决方案1】:

    RabbitMQ 在 2.7 版中已更改为在队列头部重新排队消息。以前的版本在队列尾部重新排队 - see here

    您的观察是因为 Spring AMQP 默认将预取设置为 1(通过调用 basicQos) - 这仅允许 1 条消息在客户端未完成。如果未调用basicQos,代理将向客户端发送所有四个消息,因此如果队列因预取而为空,则将显示被拒绝的消息进入队列的后面。

    如果您将prefetchCount 设置为至少 4,您将看到相同的行为。

    编辑

    如果你真的想在一开始就排队,你可以使用 retry 和RepublishMessageRecoverer

    【讨论】: