能够通过连接名称识别 RabbitMQ 客户端将非常有用。
我正在使用 Spring Cloud Streams 抽象,并且使用默认设置我得到类似的东西:
如何在 Spring Boot 客户端中设置自定义 RabbitMQ 连接名称?
EDIT
春季启动 1.7+
这是基于加里·拉塞尔答案的解决方案:
@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());
}
}
它与默认配置 https://github.com/wildloop/streams-demo/blob/master/src/main/resources/application-1vh.yml,但不适用于多系统连接 https://github.com/wildloop/streams-demo/blob/master/src/main/resources/application-2vh.yml.
春季启动 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 https://github.com/spring-cloud/spring-cloud-stream/issues/1541在多绑定器场景中。
从版本 2.0 1.7 开始(请参阅文档 https://docs.spring.io/spring-amqp/reference/html/_reference.html#connections)你可以提供一个ConnectionNameStrategy
...
@Bean
public CachingConnectionFactory connectionFactory() {
CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
cf.setConnectionNameStrategy(f -> "myConnectionName");
return cf;
}
EDIT
该策略可以在连接打开之前的任何时间设置。比如说,如果你想使用 Spring Boot 的自动配置工厂(默认情况下由 Spring Cloud Stream 使用),你可以这样做......
@Bean
public SmartInitializingSingleton reconfigureCf(final CachingConnectionFactory cf) {
return () -> cf.setConnectionNameStrategy(f -> "myName");
}
这将在任何事情发生之前运行start()
ed.
实际上它被向后移植到1.7.x https://jira.spring.io/browse/AMQP-684.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)