It would be useful to be able to identify the RabbitMQ client by its connection name.
I'm using Spring Cloud Streams abstraction and with default settings I getting something like that:
How can I set a custom RabbitMQ connection name in my Spring Boot client?
EDIT
Spring Boot 1.7+
This is solution based on Gary Russell's answer:
@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());
}
}
It works with the default configuration, but doesn't work for a 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();
}
}
Note, there is a bug in a multi-binder scenario.