如何配置兔子连接工厂,但保持Spring Boot自动配置?



我想在org.springframework.amqp.rabbit.connection.CachingConnectionFactory上以编程方式设置host属性。我想保留Spring Boot自动配置的默认值和来自我的应用程序-{profile-name}的值。因此,由于这些原因,我不想简单地创建自己的CachingConnectionFactory bean。

我找到了org.springframework.boot.autoconfigure.amqp.ConnectionFactoryCustomizer类,它看起来非常有前途,因为我看到它是如何在RabbitAutoConfiguration类中被调用来配置底层的com.rabbitmq.client.ConnectionFactory,它在spring框架CachingConnectionFactory中。但是,我不确定如何创建我的ConnectionFactoryCustomizer实例并将其注册为回调,以及如何以正确的顺序调用它(我认为是最后调用)。

我试过了,但是仍然连接到"localhost":

@Bean
@Order(Integer.MAX_VALUE)
public ConnectionFactoryCustomizer myConnectionFactoryCustomizer() {
return factory -> {
factory.setHost("anotherhost");
};
}

我也尝试过这种方法,我从另一个stackoverflow帖子中得到启发,尝试了一个类似的问题:如何为RabbitMQ连接设置自定义名称?

@Bean
public SmartInitializingSingleton configureConnectionFactory(final CachingConnectionFactory factory) {
factory.setHost("anotherhost");
return () -> {
factory.setHost("anotherhost");
};
}

但是这两种方法都不起作用。代码正在执行调用factory.setHost,所以我显然做错了什么。我的日志输出仍然是:

2021-10-17 13:45:24,271 |信息| | myContainer-3 | org.springframework.amqp.rabbit.connection。CachingConnectionFactory|尝试连接:[localhost:5672]

那么,以编程方式覆盖连接工厂中的host等值的正确方法是什么?(当然,在创建任何连接之前)

Boot配置CachingConnectionFactory.addresses属性(覆盖host)。

试试这个…

@Bean
@Order(Integer.MAX_VALUE)
public ConnectionFactoryCustomizer myConnectionFactoryCustomizer() {
return factory -> {
factory.setHost("anotherhost");
};
}
@Bean
ApplicationRunner runner(CachingConnectionFactory ccf) {
ccf.setAddresses(null);
return args -> {
};
}

它可以在任何其他bean定义中完成(不一定是运行器),但它不能在myConnectionFactoryCustomizerbean中完成,因为有一个循环引用。

@Bean
ApplicationRunner runner(CachingConnectionFactory ccf) {
ccf.setAddresses(null);
ccf.setHost("another");
return args -> {
};
}

最新更新