Spring 引导 - 兔子自定义 ConnectionFactory
Spring Boot - Rabbit Custom ConnectionFactory
在 Spring AMQP/Rabbit 中是否有任何 public 实用方法可用于创建自定义 Rabbit 连接工厂。截至目前,我正在使用以下代码
@Bean(name = "rp1")
@ConfigurationProperties(prefix = "app.custom")
public RabbitProperties rp1() {
return new RabbitProperties();
}
public ConnectionFactory cf1(
@Qualifier("rp1") RabbitProperties rp1) {
final CachingConnectionFactory cf1 = new CachingConnectionFactory();
connectionFactory.setHost(rp1.getHost());
//remaing code left off
}
@Bean(name = "rp2")
@ConfigurationProperties(prefix = "app.custom1")
public RabbitProperties rp2() {
return new RabbitProperties();
}
public ConnectionFactory cf2(
@Qualifier("rp2") RabbitProperties rp2) {
final CachingConnectionFactory cf2 = new CachingConnectionFactory();
connectionFactory.setHost(rp2.getHost());
//remaing code left off
}
在application.properties中传递了以下值
示例属性
- app.custom.host=本地主机app.custom.port=5372
- app.custom1.host=localhost1 app.custom1.port=5373
是否有更好的方法来执行此操作,例如传递自定义 RabbitProperties 并通过设置所有属性取回连接工厂?基本上类似于 RabbitAutoConfiguration RabbitConnectionFactoryCreator class 中的 rabbitConnectionFactory bean。我需要在我的应用程序中支持多个兔子集群。因此不能使用自动配置,因为它只支持 1 个集群
我们最多可以建议 RabbitConnectionFactoryBean
。不建议在目标项目中使用开箱即用的 @ConfigurationProperties
。它们主要用于 Spring 引导,并且经常更改。
您完全可以借鉴上述自动配置的配置思路,构建您自己的 CachingConnectionFactory
对象。
更新
根据您的说法,您似乎真的可以提取一个通用方法以使用特定属性实例调用:
@Bean(name = "rp1")
@ConfigurationProperties(prefix = "app.custom")
public RabbitProperties rp1() {
return new RabbitProperties();
}
@Bean
public ConnectionFactory cf1(
@Qualifier("rp1") RabbitProperties rp1) {
return createConnectionFactoryByProperties(rp1);
}
@Bean(name = "rp2")
@ConfigurationProperties(prefix = "app.custom1")
public RabbitProperties rp2() {
return new RabbitProperties();
}
@Bean
public ConnectionFactory cf2(
@Qualifier("rp2") RabbitProperties rp2) {
return createConnectionFactoryByProperties(rp2);
}
private CachingConnectionFactory createConnectionFactoryByProperties(RabbitProperties rp) {
final CachingConnectionFactory cf = new CachingConnectionFactory();
connectionFactory.setHost(rp.getHost());
//remaing code left off
}
在 Spring AMQP/Rabbit 中是否有任何 public 实用方法可用于创建自定义 Rabbit 连接工厂。截至目前,我正在使用以下代码
@Bean(name = "rp1")
@ConfigurationProperties(prefix = "app.custom")
public RabbitProperties rp1() {
return new RabbitProperties();
}
public ConnectionFactory cf1(
@Qualifier("rp1") RabbitProperties rp1) {
final CachingConnectionFactory cf1 = new CachingConnectionFactory();
connectionFactory.setHost(rp1.getHost());
//remaing code left off
}
@Bean(name = "rp2")
@ConfigurationProperties(prefix = "app.custom1")
public RabbitProperties rp2() {
return new RabbitProperties();
}
public ConnectionFactory cf2(
@Qualifier("rp2") RabbitProperties rp2) {
final CachingConnectionFactory cf2 = new CachingConnectionFactory();
connectionFactory.setHost(rp2.getHost());
//remaing code left off
}
在application.properties中传递了以下值
示例属性
- app.custom.host=本地主机app.custom.port=5372
- app.custom1.host=localhost1 app.custom1.port=5373
是否有更好的方法来执行此操作,例如传递自定义 RabbitProperties 并通过设置所有属性取回连接工厂?基本上类似于 RabbitAutoConfiguration RabbitConnectionFactoryCreator class 中的 rabbitConnectionFactory bean。我需要在我的应用程序中支持多个兔子集群。因此不能使用自动配置,因为它只支持 1 个集群
我们最多可以建议 RabbitConnectionFactoryBean
。不建议在目标项目中使用开箱即用的 @ConfigurationProperties
。它们主要用于 Spring 引导,并且经常更改。
您完全可以借鉴上述自动配置的配置思路,构建您自己的 CachingConnectionFactory
对象。
更新
根据您的说法,您似乎真的可以提取一个通用方法以使用特定属性实例调用:
@Bean(name = "rp1")
@ConfigurationProperties(prefix = "app.custom")
public RabbitProperties rp1() {
return new RabbitProperties();
}
@Bean
public ConnectionFactory cf1(
@Qualifier("rp1") RabbitProperties rp1) {
return createConnectionFactoryByProperties(rp1);
}
@Bean(name = "rp2")
@ConfigurationProperties(prefix = "app.custom1")
public RabbitProperties rp2() {
return new RabbitProperties();
}
@Bean
public ConnectionFactory cf2(
@Qualifier("rp2") RabbitProperties rp2) {
return createConnectionFactoryByProperties(rp2);
}
private CachingConnectionFactory createConnectionFactoryByProperties(RabbitProperties rp) {
final CachingConnectionFactory cf = new CachingConnectionFactory();
connectionFactory.setHost(rp.getHost());
//remaing code left off
}