如何为 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。
能够通过连接名称识别 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。