Java Spring AMQP Rabbit-单个消费者监听多个队列-交货订单是什么?

Java Spring AMQP Rabbit-单个消费者监听多个队列-交货订单是什么?,java,rabbitmq,spring-amqp,spring-rabbit,Java,Rabbitmq,Spring Amqp,Spring Rabbit,首先让我确定我解释了这个问题: 我必须按照实际创建的顺序处理多个已填充的队列。这意味着,如果队列包含: q1:m1、m2、m5、m7 q2:m3、m6、m9 q3:m4,m8 我希望对它们进行处理,以便m4不会在m1、m2或m3之前进行处理。m3可以随时执行(它不必等待m1和m2,但可以等待,因为它很可能更容易/更安全地实现)。直到处理m7之后,m8才会处理 我知道这会使工作序列化——但是使用多个线程,并且我已经锁定了负载中的其他一些值,这有助于确保它们不会相互干扰并获得一定量的并行处理 我们只

首先让我确定我解释了这个问题:

我必须按照实际创建的顺序处理多个已填充的队列。这意味着,如果队列包含:

q1:m1、m2、m5、m7

q2:m3、m6、m9

q3:m4,m8

我希望对它们进行处理,以便m4不会在m1、m2或m3之前进行处理。m3可以随时执行(它不必等待m1和m2,但可以等待,因为它很可能更容易/更安全地实现)。直到处理m7之后,m8才会处理

我知道这会使工作序列化——但是使用多个线程,并且我已经锁定了负载中的其他一些值,这有助于确保它们不会相互干扰并获得一定量的并行处理

我们只是遇到了第三季度在第一季度和第二季度的记录之前处理的问题,所以它实际上不能做它应该做的事情。q1和q2确实需要更长的时间来处理,我们希望将更多的记录放入这些队列中

我已经要求发送方更改为单个队列,但我不确定他们是否会进行此更改(不同的团队,不同的优先级),因此我正在尝试制定一个实际的备份计划

现在是我的实际问题:
我已经看到,您可以为多个队列设置一个侦听器—是否有关于我接收消息的顺序的文档?它只是一个循环,总是从每个队列中获取最早的记录吗?或者它总是从它正在侦听的所有队列中发送给我的侦听器的最旧记录吗?

它取决于预回迁,默认情况下,预回迁为1,这意味着代理将发送1条消息并等待确认。预回迁应用于通道(跨所有队列)

如果container
concurrentConsumers
为1(默认值),它们将被串行处理,但顺序是不确定的——这取决于代理如何交付它们。我不知道rabbitmq在单个通道的多个队列上有消费者时使用的内部算法;最好假设它是不确定的

我已请求发件人更改为单个队列

生产者使用路由密钥发布到exchange—他不应该关心下游的队列拓扑。使用者通过绑定到该交换来决定队列拓扑-如果将交换更改为扇出,则可以将单个队列绑定到该交换,并且无论生产者使用何种路由密钥,都可以按顺序获取消息

如果制作人“拥有”交换,并且不愿意更改它,那么您可以将扇出交换绑定到他的交换,并将您的单个队列绑定到该交换

当然,如果他在交换中加入队列,消息将在那里累积


但是,正如我所说,生产者不需要参与队列拓扑。

谢谢-我担心它没有被记录下来-我希望我错过了定义它的几行。是的,制作人“拥有”交换——他们设计了队列等(他们在内部也使用了队列)。我会看看扇出交换的想法,如果这看起来是一个很好的解决办法——我会把你的回答标记为答案。谢谢你的快速回复。我认为扇出与我想要的正好相反……除非我误解了你的意思。我想把3个队列有效地分成1个队列。扇出可以这样配置吗?我说扇出是因为绑定到它的每个队列都会获得每条消息,而不管路由密钥如何。因此,如果您将扇出绑定到其交换,并将单个队列绑定到扇出,则他发送到其交换的所有内容都将在您的单个队列中结束。您还可以使用主题交换,队列绑定了通配符路由键
#
,这实际上是相同的(但效率稍低)。但是,需要从原始队列中使用一些内容(或者在队列上设置一个TTL),否则您将耗尽内存。我必须看看这个,如果我没记错的话,我们现在正在使用一个主题交换,所以我应该能够用3个路由键从他的主题绑定到我的扇出交换,并且一个队列应该绑定到扇出交换(如你所说)…有效地使它成为漏斗而不是扇出。您还说,我必须解决一些问题来处理原始队列,以便在从我的扇出队列中处理完消息后将其删除(因此我仍然知道在备份队列时,队列的进度如何)。我没有考虑扇出的路由键-如果他的交换是主题交换,您还可以使用路由密钥
#
将一个新队列绑定到他的exchange—避免跳跃。