如何在 Spring Boot 中设置 amqp RabbitMQ 消费者标签?

问题描述 投票:0回答:3

在问题How to set the consumer-tag value in spring-amqp有人问如何在使用Spring Amqp时更改消费者标签,答案建议提供

ConsumerTagStrategy
的实现。

我正在使用 Spring Boot 2.0.5,我试图弄清楚我是否可以进行相同的自定义,尽管我找不到任何关于它的配置属性,也没有提供

ConsumerTagStrategy
类型的 bean 似乎有效。

我该怎么办?

java spring spring-boot spring-amqp
3个回答
6
投票

Override boot's container factory bean declaration and add it there.

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
        SimpleRabbitListenerContainerFactoryConfigurer configurer,
        ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setConsumerTagStrategy(q -> "myConsumerFor." + q);
    return factory;
}


0
投票

即使是加里的回答也很好,但并不总是有效。例如,在具有自动配置和使用

RabbitListener
的 Spring Boot 中,您可能会遇到一些奇怪的情况,即应用程序拒绝启动或您的工厂将不会被使用。我建议改用
BeanPostProcessor
。下面是一个简单的例子:

@Component
public class ConsumerTagByAppSetter implements BeanPostProcessor {

    private final String appName;

    public ConsumerTagByAppSetter(@Value("${spring.application.name}") String appName) {
        this.appName = appName;
    }

    @Override
    public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
        if (bean instanceof SimpleRabbitListenerContainerFactory) {
            ((SimpleRabbitListenerContainerFactory) bean).setConsumerTagStrategy(q -> appName + "." + q);
        }
        return bean;
    }
}

此后处理器应用于通过自动配置创建和自定义的工厂,并仅更改生成消费者标签的方式,我认为这比尝试从头开始更安全且开箱即用...


0
投票

您不必重写 SimpleRabbitListenerContainerFactory。

通过创建将由 spring boot 自动配置应用的额外 bean 来自定义它就足够了。

    @Bean
    ContainerCustomizer<SimpleMessageListenerContainer> containerCustomizer(@Value("${spring.application.name}") String applicationName) {
        return container -> container.setConsumerTagStrategy(queue -> applicationName + "_" + UUID.randomUUID());
    }
© www.soinside.com 2019 - 2024. All rights reserved.