微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我无法覆盖 RabbitListener

如何解决我无法覆盖 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 的新实例并将其传递给我在 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?