在问题How to set the consumer-tag value in spring-amqp有人问如何在使用Spring Amqp时更改消费者标签,答案建议提供
ConsumerTagStrategy
的实现。
我正在使用 Spring Boot 2.0.5,我试图弄清楚我是否可以进行相同的自定义,尽管我找不到任何关于它的配置属性,也没有提供
ConsumerTagStrategy
类型的 bean 似乎有效。
我该怎么办?
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;
}
即使是加里的回答也很好,但并不总是有效。例如,在具有自动配置和使用
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;
}
}
此后处理器应用于通过自动配置创建和自定义的工厂,并仅更改生成消费者标签的方式,我认为这比尝试从头开始更安全且开箱即用...
您不必重写 SimpleRabbitListenerContainerFactory。
通过创建将由 spring boot 自动配置应用的额外 bean 来自定义它就足够了。
@Bean
ContainerCustomizer<SimpleMessageListenerContainer> containerCustomizer(@Value("${spring.application.name}") String applicationName) {
return container -> container.setConsumerTagStrategy(queue -> applicationName + "_" + UUID.randomUUID());
}