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

How to set custom name for RabbitMQ connection?

能够通过连接名称识别 RabbitMQ 客户端会很有用。

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

如何在我的 Spring 引导客户端中设置自定义 RabbitMQ 连接名称?


编辑

Spring 引导 1.7+

这是基于 Gary Russell 的回答的解决方案:

@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());
    }
}

它适用于 default configuration, but doesn't work for a multiple systems connection

Spring 引导 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();
    }
}

注意,在multi-binder场景中有一个bug

从版本 2.0 1.7(参见 the documentation)开始,您可以提供 ConnectionNameStrategy...

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

编辑

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

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

这将是 运行,然后再 start() 编辑。

实际上它被移植到 1.7.x