如何使用spring ampq重新排列消息

时间:2016-08-08 08:07:51

标签: rabbitmq spring-amqp spring-rabbitmq

在重新排队消息时,我们希望将消息放在队列的开头/前面。 这意味着如果我在队列中有“D,C,B,A”和进程A,然后想要在开始时放回队列,我的队列应如下所示: - “A,d,C,B”。 所以,我应该能够处理B,因为在队列开始时移动A应该在结束时处理它。

有趣的是,当尝试使用RabbitMQ的原生AMQP库时,它按照上面的预期进行操作。

但是,当我们通过Spring AMQP库执行此操作时,该消息仍然存在,不会发送到队列的前面。

以下是我们尝试的代码:

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

1 个答案:

答案 0 :(得分:0)

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

您的观察是因为Spring AMQP默认情况下将预取设置为1(通过调用basicQos) - 这只允许在客户端发出1条消息。如果未调用basicQos,代理将向客户端发送所有四条消息,以便显示如果由于预取而队列为空,则被拒绝的消息将返回队列的后面

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

修改

如果您真的想在开头排队,可以使用RepublishMessageRecoverer重试。