我无法覆盖 RabbitListener 上的 containerFactory
I cannot override containerFactory on RabbitListener
我面临着被覆盖的问题,更准确地说是在我的一个 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 实例并将其传递给项目 A 中的 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 名称。
要么改成只修改自己的bean,要么加一个SmartInitializingSingleton
在BPP有运行.
后重新修改你的bean
我面临着被覆盖的问题,更准确地说是在我的一个 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 实例并将其传递给项目 A 中的 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 名称。
要么改成只修改自己的bean,要么加一个SmartInitializingSingleton
在BPP有运行.