SimpleMessageListenerContainer使用RetryOperationsInterceptor订阅多个队列

时间:2018-10-16 21:33:31

标签: spring-boot rabbitmq spring-rabbit spring-rabbitmq

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

我的SimpleMessageListenerContainer已配置为:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

增大concurrentConsumers(至少3)或切换到DirectMessageListenerContainer。 参见choosing a container