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中传递了以下值

示例属性

  1. app.custom.host=本地主机app.custom.port=5372
  2. 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 
}