如何使用spring rabbitmq配置不同队列中的超时,重试或最大尝试次数

时间:2017-07-29 04:02:59

标签: java rabbitmq spring-amqp spring-rabbitmq

是否可以为每个队列进行这些设置?我有重要的队列,所以我需要更多的重试,但有不太重要的队列,我不想配置重试,尝试等等

public Queue newQueue(String name) {
    return new Queue(name, durable, exclusive, autoDelete, arguments);
}

我在Queue类中看到,可以将参数map作为最后一个参数传递,但我不知道它是在这里,还是通过属性。

3 个答案:

答案 0 :(得分:2)

这些东西不是队列的属性,它们是添加到侦听器容器的重试建议的属性。为每个队列使用不同的容器/建议。请参阅Spring AMQP参考手册。

答案 1 :(得分:2)

我能够在这样的配置中更改最大重试次数和退避策略:

spring:
  rabbitmq:
    listener:
      simple:
        retry:
          enabled: true
          initial-interval: 1000
          max-attempts: 3
          max-interval: 10000
          multiplier: 2.0

仍然失败的消息将被丢弃,并带有此配置的警告。参见this article for configuring dead letter queue

答案 2 :(得分:1)

在我的情况下,我不得不使用重试拦截器创建一个监听器工厂,在重试拦截器中我设置了最大尝试的值。

也许适合你:

@Autowired
private ConnectionFactory connectionFactory;

@Autowired
private SomeService someService;

@RabbitListener(id = "queueListener", queues = "queueName",
        containerFactory = "listenerContainerFactory")
@RabbitHandler
public void notifyLegacyListener(SomeObject obj) {
    someService.doSomething(obj);
}

@Bean
public SimpleRabbitListenerContainerFactory listenerContainerFactory() {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setMessageConverter(jsonMessageConverter());
    factory.setConcurrentConsumers(3);
    factory.setMaxConcurrentConsumers(10);
    factory.setAdviceChain(new Advice[] {retries()});
    return factory;
}

@Bean
public RetryOperationsInterceptor retries() {
    return RetryInterceptorBuilder.stateless().maxAttempts(Queues.QUEUE_LEGACY.getMaxAttempts())
            .backOffOptions(1000,
                    3.0, 10000)
            .recoverer(new RejectAndDontRequeueRecoverer()).build();
}

@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}