spring-boot - 我无法在 RabbitListener 上覆盖 containerFactory
问题描述
我面临着被覆盖的问题,更准确地说是在我的 RabbitListener 之一的 containerFactory 中。
假设我有 projectA,它的一个依赖项(库 B)在运行时实例化以下配置。
@Configuration
public class AmqpConfiguration {
@Bean
public static BeanPostProcessor bpp() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof RabbitTemplate) {
RabbitTemplate rabbitTemplate = (RabbitTemplate) bean;
rabbitTemplate.addBeforePublishPostProcessors(new LogRequestBeforePublishPostProcessor());
} else if (bean instanceof AbstractRabbitListenerContainerFactory) {
AbstractRabbitListenerContainerFactory<?> rabbitContainerFactory = (AbstractRabbitListenerContainerFactory<?>) bean;
rabbitContainerFactory.setAfterReceivePostProcessors(new LogRequestAfterReceivePostProcessor());
}
return bean;
}
};
}
}
如您所见,上面的 bean 在 RabbitTamplate 和 AbstractRabbitListenerContainerFactory 实例中注入了 MessagePostProcessor 的自定义实现。
我的问题是我想扩展或覆盖已在下面的代码中设置的 AbstractRabbitListenerContainerFactory 的 MessagePostProcessor。
rabbitContainerFactory.setAfterReceivePostProcessors(new LogRequestAfterReceivePostProcessor());
为了克服这种情况,我尝试创建一个 SimpleRabbitListenerContainerFactory 的新实例并将其传递给我在 projectA 中的 RabbitListener,但不幸的是我没有让它工作。使用调试模式,我看到 libraryB 的 MessagePostProcessor 被调用。
请参阅下面的测试代码。
@Configuration
public class LoggingContainerConfiguration {
@Bean(name = "rabbitListenerContainerFactoryNew")
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
ConnectionFactory connectionFactory, MessageConverter objJsonMessageConverter, ObjectMapper objectMapper) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(objJsonMessageConverter);
factory.setAfterReceivePostProcessors(new LogPaymentEventDTOAfterReceivePostProcessor(objectMapper));
return factory;
}
}
@RabbitListener(containerFactory = "rabbitListenerContainerFactoryNew",
queues = {"test1", "test2"})
public void listener(Pojo pojo) {
...
}
您对如何在我的 RabbitListener 中覆盖 connectionFactory 的 MessagePostProcessor 有什么建议吗?
先感谢您。
解决方案
项目 B 的 BPP 修改所有实例;不是按豆名。
要么将其更改为仅修改其自己的 bean,要么您可以添加一个SmartInitializingSingleton
以在 BPP 运行后重新修改您的 bean。
推荐阅读
- html - 使用 wrap 删除 flexbox 中的剩余空间
- javascript - Jquery 使用切换按钮调整 Div 大小
- reactjs - socket.io - 从动态创建的命名空间接收发射事件
- java - 从 dataproc 中的谷歌存储中读取文件
- laravel - 在 Laravel 生产中删除了供应商文件夹
- python-3.x - 试图使 asyncio 与 telnetlib 一起工作
- pandas - 熊猫新列对于某些行具有相同的值
- mongodb - kubernetes部署时如何在mongodb中设置wiredTigerCacheSize
- svg - 使用纯 SVG 将内联标签添加到水平条
- svg - 如何更改svg中路径的位置?