我想在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
,所以我显然做错了什么。我的日志输出仍然是:
那么,以编程方式覆盖连接工厂中的host等值的正确方法是什么?(当然,在创建任何连接之前)2021-10-17 13:45:24,271 |信息| | myContainer-3 | org.springframework.amqp.rabbit.connection。CachingConnectionFactory|尝试连接:[localhost:5672]
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定义中完成(不一定是运行器),但它不能在myConnectionFactoryCustomizer
bean中完成,因为有一个循环引用。
或
@Bean
ApplicationRunner runner(CachingConnectionFactory ccf) {
ccf.setAddresses(null);
ccf.setHost("another");
return args -> {
};
}