首页 > 解决方案 > SimpleMessageListenerContainer 使用 RetryOperationsInterceptor 订阅多个队列

问题描述

我正在使用订阅 3 个不同队列的 SimpleMessageListenerContainer。SimpleMessageListenerContainer 已经配置了具有指数退避策略的 RetryOperationsInterceptor。

我的 SimpleMessageListenerContainer 已配置:

container.addQueueNames("news.politics","news.science","news.tech");
container.setMaxConcurrentConsumers(10);
container.setAdviceChain(new Advice[]{retryInterceptor});

如果来自已消费的 3 个队列之一的消息进入错误状态导致异常,则消费者会按预期触发策略的指数返回。但是,我注意到消费者停止循环,以处理其他 2 个队列上的消息。我在想,由于消费者的“MaxConcurrentConsumer”设置为 10,消费者将开始产生消费者线程并循环其余队列。

  1. 这是 SimpleMessageListenerContainer 的正常行为吗?
  2. 这种行为可以调整吗?
  3. 对于我的用例,是否建议每个队列有一个 SimpleMessageListenerContainer 以保持它们隔离?也许想出一个装饰器 CompositeSimpleMessageListener 容器,它在每个队列内部都有一个 SimpleMessageListenerContainers 映射?

标签: spring-bootrabbitmqspring-rabbit

解决方案


增加消费者的算法有限;如果重试拦截器挂起消费者线程,它将阻止新消费者的启动。

要么增加concurrentConsumers(至少 3)或切换到DirectMessageListenerContainer. 请参阅选择容器


推荐阅读