Как мне создать / настроить свой собственный AMQP ContainerFactory в Spring Boot?

#spring-boot #spring-amqp

#spring-boot #spring-amqp

Вопрос:

Я добавил это как попытку создать и настроить свой собственный SimpleRabbitListenerContainerFactory для замены по умолчанию

 @Bean
open fun myFactory(cf: ConnectionFactory): SimpleRabbitListenerContainerFactory {
    val factory = SimpleRabbitListenerContainerFactory()
    factory.setConnectionFactory(cf)
    factory.setDefaultRequeueRejected(false)
    factory.setAfterReceivePostProcessors(MessagePostProcessor {
        it.messageProperties.contentType = MediaType.APPLICATION_JSON_VALUE
        return@MessagePostProcessor it
    })
    return factory
}
  

Когда код выполняется, я все еще вижу

 o.s.a.r.listener.BlockingQueueConsumer   : Rejecting messages (requeue=true)
  

это наводит меня на мысль, что spring boot не использует мой ContainerFactory. Полагаю, мне действительно все равно, использует ли он мой, если я могу настроить его правильно. Каков наилучший способ решить эту проблему?

Ответ №1:

Смотрите документацию.

Платформа ищет фабрику с именем rabbitListenerContainerFactory по умолчанию, если вы не задали containerFactory свойство в аннотации.

По умолчанию инфраструктура ищет компонент с именем rabbitListenerContainerFactory в качестве источника для использования фабрикой …

Чтобы переопределить компонент Boot, назовите его rabbitListenerContainerFactory .

При этом, как правило, лучше всего использовать конфигуратор, чтобы были применены ваши свойства загрузки…

 @Bean(name = "rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
        SimpleRabbitListenerContainerFactoryConfigurer configurer,
        ConnectionFactory connectionFactory) {

    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    configurer.configure(factory, connectionFactory);

    factory.setDefaultRequeueRejected(false)
    factory.setAfterReceivePostProcessors(MessagePostProcessor {
        it.messageProperties.contentType = MediaType.APPLICATION_JSON_VALUE
        return@MessagePostProcessor it
    })

    return factory;
}