如何配置 rabbit 连接工厂但保持 Spring 引导自动配置?
How to configure the rabbit connection factory but keep the Spring Boot autoconfiguration?
我想以编程方式在 org.springframework.amqp.rabbit.connection.CachingConnectionFactory 上设置 host
属性。我想保留 Spring 引导自动配置的默认值和来自我的 application-{profile-name}.yml 文件的所有其他值,因此出于这些原因,我不想简单地创建自己的 CachingConnectionFactory豆.
我发现 org.springframework.boot.autoconfigure.amqp.ConnectionFactoryCustomizer class 看起来很有前途,因为我看到它是如何在 RabbitAutoConfiguration class 中被调用来配置底层 com.rabbitmq.client.ConnectionFactory 的spring 框架 CachingConnectionFactory。但是,我不确定如何创建我的 ConnectionFactoryCustomizer 实例并将其注册为回调,以及如何以正确的顺序调用它(我认为最后调用)。
我试过了,但仍然连接到“localhost”:
@Bean
@Order(Integer.MAX_VALUE)
public ConnectionFactoryCustomizer myConnectionFactoryCustomizer() {
return factory -> {
factory.setHost("anotherhost");
};
}
我也尝试过这种方法,我的灵感来自另一个 Whosebug post 的尝试,问题有点类似:
@Bean
public SmartInitializingSingleton configureConnectionFactory(final CachingConnectionFactory factory) {
factory.setHost("anotherhost");
return () -> {
factory.setHost("anotherhost");
};
}
但这两种方法都不起作用。正在执行调用 factory.setHost
的代码,所以我显然做错了什么。我的日志输出仍然是这样的:
2021-10-17 13:45:24,271|INFO||myContainer-3|org.springframework.amqp.rabbit.connection.CachingConnectionFactory|Attempting to connect to: [localhost:5672]
那么,以编程方式覆盖连接工厂中主机等值的正确方法是什么? (当然是在创建任何连接之前)
引导配置 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定义中完成(不一定是runner),但不能在myConnectionFactoryCustomizer
bean中完成,因为存在循环引用。
或
@Bean
ApplicationRunner runner(CachingConnectionFactory ccf) {
ccf.setAddresses(null);
ccf.setHost("another");
return args -> {
};
}
我想以编程方式在 org.springframework.amqp.rabbit.connection.CachingConnectionFactory 上设置 host
属性。我想保留 Spring 引导自动配置的默认值和来自我的 application-{profile-name}.yml 文件的所有其他值,因此出于这些原因,我不想简单地创建自己的 CachingConnectionFactory豆.
我发现 org.springframework.boot.autoconfigure.amqp.ConnectionFactoryCustomizer class 看起来很有前途,因为我看到它是如何在 RabbitAutoConfiguration class 中被调用来配置底层 com.rabbitmq.client.ConnectionFactory 的spring 框架 CachingConnectionFactory。但是,我不确定如何创建我的 ConnectionFactoryCustomizer 实例并将其注册为回调,以及如何以正确的顺序调用它(我认为最后调用)。
我试过了,但仍然连接到“localhost”:
@Bean
@Order(Integer.MAX_VALUE)
public ConnectionFactoryCustomizer myConnectionFactoryCustomizer() {
return factory -> {
factory.setHost("anotherhost");
};
}
我也尝试过这种方法,我的灵感来自另一个 Whosebug post 的尝试,问题有点类似:
@Bean
public SmartInitializingSingleton configureConnectionFactory(final CachingConnectionFactory factory) {
factory.setHost("anotherhost");
return () -> {
factory.setHost("anotherhost");
};
}
但这两种方法都不起作用。正在执行调用 factory.setHost
的代码,所以我显然做错了什么。我的日志输出仍然是这样的:
2021-10-17 13:45:24,271|INFO||myContainer-3|org.springframework.amqp.rabbit.connection.CachingConnectionFactory|Attempting to connect to: [localhost:5672]
那么,以编程方式覆盖连接工厂中主机等值的正确方法是什么? (当然是在创建任何连接之前)
引导配置 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定义中完成(不一定是runner),但不能在myConnectionFactoryCustomizer
bean中完成,因为存在循环引用。
或
@Bean
ApplicationRunner runner(CachingConnectionFactory ccf) {
ccf.setAddresses(null);
ccf.setHost("another");
return args -> {
};
}