Java Spring AMQP-将消息返回到队列的开头

Java Spring AMQP-将消息返回到队列的开头,java,rabbitmq,spring-amqp,spring-rabbit,Java,Rabbitmq,Spring Amqp,Spring Rabbit,我想知道是否有办法将消息返回到队列中的原始位置。例如,假设我们有以下顺序: A-B-C-D,A是头,D是尾。通常,当我们使用nack或REQUUE=true的reject时,它只是将消息排在当前尾部之后。在这种情况下,当A被重新排队时,新的排序变成B-C-D-A。但是,我想知道是否有任何方法可以排队到队列的开头。因此,如果发送回,它将被放置在队列的开头,即原始位置 我使用Spring AMQP搜索解决方案。您需要将预取qos设置为1。否则,任何预取的邮件都将在重新交付邮件之前送达 但是,这会影响

我想知道是否有办法将消息返回到队列中的原始位置。例如,假设我们有以下顺序:

A-B-C-D,A是头,D是尾。通常,当我们使用nack或REQUUE=true的reject时,它只是将消息排在当前尾部之后。在这种情况下,当A被重新排队时,新的排序变成B-C-D-A。但是,我想知道是否有任何方法可以排队到队列的开头。因此,如果发送回,它将被放置在队列的开头,即原始位置


我使用Spring AMQP搜索解决方案。

您需要将预取qos设置为1。否则,任何预取的邮件都将在重新交付邮件之前送达


但是,这会影响性能。

AMQP队列不是这样工作的。你为什么需要这种行为?我知道这不是他们正常的行为方式。我想这样做的原因是我需要在处理消息时遵循严格的顺序。例如,follow X和unfollow X消息的处理方式应该与它们发送的方式完全相同。我不想先处理unfollow。所以,假设在处理消息时数据库关闭,我通常会发送nack或requeue=true的reject,这会破坏订单。我可以自己解决这个问题。但我在寻找一些可能由弹簧或兔子支持的东西。希望这是有意义的。如果没有看到相应的后续消息,消费者会选择取消后续消息。这将恢复自然顺序。这需要数据库检查。例如,如果follow和unfollow在很短的时间间隔内发送,那么您的建议可能有效。但如果这两个月之间有一个月的时间。不会有任何相应的后续操作,我们必须检查数据库。顺便说一句,Follow/unfollow只是一个例子。案例可能更复杂。请确定,您是在谈论ListenerContainer中的setPrefetchCount吗?我是说,我应该用它来设置预取计数吗?因为如果是的话,我已经做到了。问题是,当我nack消息时,由于数据库不可用,它会将消息重新排队到队列的末尾。我想让它回到属于它的任何地方,排在队伍的最前面。我希望我没有误解您的解决方案。只要预回迁计数为1,它将转到队列的最前面,并将立即重新交付。如果预回迁计数大于1,您将在重新回迁的消息之前收到其他预回迁消息。很久以前很多年以前RabbitMQ习惯于在尾部而不是头部重新鸣叫,但后来改为在头部重新鸣叫。我不知道。谢谢@Gary Russell。一个问题tho。所以prefetchCount=1,我们对消息进行nack并重新查询,它将被重新传递。这是否意味着,如果我们总是发送nack,它可能会陷入一个循环中?是的,当然。如果消息具有唯一的messageId属性,则可以使用有状态重试拦截器,并在多次重试后放弃。请参阅参考手册。它处于手动确认模式,据我所知,重试拦截器仅在自动模式下工作。另外,您是否可以参考关于这一点的任何来源:RabbitMQ用于在尾部而不是头部重新排队,但如果可能,它已更改为在头部重新排队?不幸的是,我找不到它。