在对消息重新排队时,我们希望将消息放置在队列的开始/前面。这意味着如果我在队列中有“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条答案
按热度按时间gijlo24d1#
RabbitMQ在2.7版本中被更改为在队列的头部重新排队消息。以前的版本在队列的尾部重新排队-see here。
您的观察是因为Spring AMQP默认将预取设置为1(通过调用
basicQos
)-这只允许1条消息在客户端未完成。如果basicQos
没有被调用,代理将把所有四条消息发送给客户端,这样如果队列由于预取而为空,被拒绝的消息将显示到队列的后面。如果您将
prefetchCount
设置为至少4,您将看到相同的行为。编辑
如果你真的想在一开始就排队,你可以使用retry和RepublishMessageRecovery。