Как использовать RetryInterceptorBuilder.StatefulRetryInterceptorBuilder.stateful () - PullRequest
1 голос
/ 18 июня 2020

У меня есть конфигурация RabbitMQ для повтора с отслеживанием состояния, как показано ниже:

@Bean
    public StatefulRetryOperationsInterceptor  statefulRetryOperationsInterceptor(CustomMessageRecoverer customRecoverer) {
        StatefulRetryOperationsInterceptor interceptor =
                RetryInterceptorBuilder.StatefulRetryInterceptorBuilder.stateful()
                        .maxAttempts(2)
                        .recoverer(customRecoverer)
                        .build();
        return interceptor;
    }


@Bean
public SimpleRabbitListenerContainerFactory queueListenerConnectionFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    configurer.configure(factory, connectionFactory());
    factory.setMessageConverter(jsonMessageConverter());
    factory.setConcurrentConsumers(this.minConsumersCount);
    factory.setMaxConcurrentConsumers(this.maxConsumersCount);
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    factory.setAdviceChain(statefulRetryOperationsInterceptor(messageRecoverer(rabbitTemplate(connectionFactory()))));
    return factory;
}

В заголовке моего сообщения установлен ID. Однако, когда прослушиватель Rabbit генерирует исключение, повторная попытка не выполняется. Ниже приведен мой слушатель

@RabbitListener(queues = "myQueue")
public void consume(Message<MyDto> msg) throws Exception {
throw new Exception("Test Exception");
} 

Что-то не так в моей реализации? Пожалуйста, предложите.

1 Ответ

0 голосов
/ 18 июня 2020

Ваш @RabbitListener использует rabbitListenerContainerFactory по умолчанию, а не ваш queueListenerConnectionFactory.

Если вам не нужен номер по умолчанию, переименуйте свой в rabbitListenerContainerFactory или используйте свойство containerFactory на слушателя, чтобы он использовал ваш.

...