如何配置 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 -> {
    };
}