rabbitmq 如何使用spring ampq重新队列消息

rbl8hiat  于 2023-08-05  发布在  RabbitMQ
关注(0)|答案(1)|浏览(175)

在对消息重新排队时,我们希望将消息放置在队列的开始/前面。这意味着如果我在队列中有“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

gijlo24d

gijlo24d1#

RabbitMQ在2.7版本中被更改为在队列的头部重新排队消息。以前的版本在队列的尾部重新排队-see here
您的观察是因为Spring AMQP默认将预取设置为1(通过调用basicQos)-这只允许1条消息在客户端未完成。如果basicQos没有被调用,代理将把所有四条消息发送给客户端,这样如果队列由于预取而为空,被拒绝的消息将显示到队列的后面。
如果您将prefetchCount设置为至少4,您将看到相同的行为。

编辑

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

相关问题