能够通过其连接名称识别RabbitMQ客户端是有用的。
我正在使用Spring Cloud Streams抽象和默认设置我得到类似的东西:
如何在Spring Boot客户端中设置自定义RabbitMQ连接名称?
这是基于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。
@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。
答案 0 :(得分:2)
从版本 2.0 1.7开始(参见AJAX),您可以提供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()
编辑之前运行。