单个活动消费者 (SAC) - 让消费者线程仅从单个队列消费

Single active consumer (SAC) - having a consumer thread consume only from a single queue

我正在尝试在绑定到一致哈希交换的队列中使用单个活动消费者 (SAC),它有 4 个队列。这是为了根据路由键分发消息,并在每个队列中进行有序处理。

在创建 Spring SimpleMessageListenerContainer 时,在 TaskExecutor 中设置了一个有 4 个线程的执行器线程池,假设每个队列有一个消费者线程。

simpleContainer.setTaskExecutor(Executors.newFixedThreadPool(4));

测试的时候,4个队列都只有1个线程在消费,很少有2个线程消费4个队列的消息。这就像让一个消费者从多个队列消费。

我需要的是在启用 SAC 的情况下让消费者线程一次只从一个队列消费。在这种情况下,我希望线程池中的 4 个线程分别从一个队列中消耗。有办法实现吗?

如果你把并发增加到4,你会得到4个消费者,每个消费者从所有4个队列消费;但是 SAC 意味着只有其中一个会实际从每个队列中消费。

但是,不能保证每个人都会得到一个队列。

或者您可以使用 4 个单独的容器,每个队列一个,并发性为 1。

或者,DirectMessageListenerContainer 每个队列使用 1 个消费者(默认)。