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

时间:2018-03-03 22:29:56

标签: rabbitmq spring-cloud-stream

能够通过其连接名称识别RabbitMQ客户端是有用的。

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

enter image description here

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

修改

Spring Boot 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,但不适用于multiple systems connection

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

请注意,多方约束方案中有bug

1 个答案:

答案 0 :(得分:2)

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

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

the documentation

修改

可以在打开连接之前随时设置策略。例如,如果您想使用Spring Boot的自动配置工厂(默认情况下由Spring Cloud Stream使用),您可以执行以下操作...

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

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

实际上它已向后移植到enter image description here