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

标签 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在多粘合剂场景中。

最佳答案

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

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

enter image description here

编辑

可以在打开连接之前的任何时间设置该策略。例如,如果您想使用 Spring Boot 的自动配置工厂(默认情况下由 Spring Cloud Stream 使用),您可以执行以下操作...
@Bean
public SmartInitializingSingleton reconfigureCf(final CachingConnectionFactory cf) {
    return () -> cf.setConnectionNameStrategy(f -> "myName");
}

这将在任何事情发生之前运行 start()编。

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

关于rabbitmq - 如何为RabbitMQ连接设置自定义名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49089915/

相关文章:

spring-boot - 如何在@StreamListener 中添加日期条件

spring-boot - SpringBoot微服务@StreamListener抛出RunTimeException时无限次重试

django - 如何在 Django 应用程序中接收 RabbitMQ 消息? ( celery ?)

java - Spring Cloud 流: Republish to other amqp connection if current connection throws exception

rabbitmq - 有没有办法限制 RabbitMQ 队列上的消费者数量?

spring-boot - 使用JMeter进行RabbitMQ应用程序负载测试的后端Spring引导

spring - 使用 Java 和 Spring 的 AWS kinesis 消费者

java - 当应用程序没有生产者时,如何让 Spring Cloud Stream 创建 RabbitMQ 队列并绑定(bind)?

RabbitMQ工具: rabbitmqctl vs rabbitmqadmin

python - 使用 Rabbitmq 和 Python 进行 Stomp 广播