如何为 RabbitMQ 连接设置自定义名称?

wil*_*oop 5 rabbitmq spring-cloud-stream

能够通过连接名称识别 RabbitMQ 客户端将非常有用。

我正在使用 Spring Cloud Streams 抽象,并且使用默认设置我得到类似的东西:

在此输入图像描述

如何在 Spring Boot 客户端中设置自定义 RabbitMQ 连接名称?


编辑

春季启动 1.7+

这是基于加里·拉塞尔答案的解决方案:

@Configuration
public class MessagingConfiguration {
    private final String instanceId = UUID.randomUUID().toString().substring(0, 8); // TODO: Environment/Consul/Eureka
    private final String connectionNamePrefix;
    private AtomicInteger connectionNumber = new AtomicInteger(0);

    public MessagingConfiguration(@Value("${custom.rabbitmq.connection-name-prefix:SpringBootApp}") String connectionNamePrefix) {
        this.connectionNamePrefix = connectionNamePrefix;
    }

    private String generateConnectionName() {
        return connectionNamePrefix + '#' + instanceId + ':' +  connectionNumber.getAndIncrement();
    }

    @Bean
    public SmartInitializingSingleton reconfigureConnectionFactory(final AbstractConnectionFactory cf) {
        return () -> cf.setConnectionNameStrategy(f -> generateConnectionName());
    }
}
Run Code Online (Sandbox Code Playgroud)

它适用于默认配置,但不适用于多系统连接

春季启动 2.0.1+

@Configuration
public class MessagingConfiguration {
    private final String instanceId = UUID.randomUUID().toString().substring(0, 8); // TODO: Environment/Consul/Eureka
    private final String connectionNamePrefix;
    private AtomicInteger connectionNumber = new AtomicInteger(0);

    public MessagingConfiguration(@Value("${custom.rabbitmq.connection-name-prefix:SpringBootApp}") String connectionNamePrefix) {
        this.connectionNamePrefix = connectionNamePrefix;
    }

    private String generateConnectionName() {
        return connectionNamePrefix + '#' + instanceId + ':' +  connectionNumber.getAndIncrement();
    }

    @Bean
    public ConnectionNameStrategy defineConnectionNameStrategy() {
        return connectionFactory -> generateConnectionName();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,多绑定程序场景中存在错误。

Gar*_*ell 5

从版本2.0 1.7 开始(请参阅文档),您可以提供ConnectionNameStrategy...

@Bean
public CachingConnectionFactory connectionFactory() {
    CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
    cf.setConnectionNameStrategy(f -> "myConnectionName");
    return cf;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

该策略可以在连接打开之前的任何时间设置。比如说,如果你想使用 Spring Boot 的自动配置工厂(默认情况下由 Spring Cloud Stream 使用),你可以这样做......

@Bean
public SmartInitializingSingleton reconfigureCf(final CachingConnectionFactory cf) {
    return () -> cf.setConnectionNameStrategy(f -> "myName");
}
Run Code Online (Sandbox Code Playgroud)

这将在编辑任何内容之前运行start()

实际上它被向后移植到1.7.x