4.1.2
版本:2.2.4.RELEASE
地址:官方文档
文章目录
命名连接
从1.7版本开始,提供了ConnectionNameStrategy
用来注入到AbstractionConnectionFactory
。生成的名称用于标识特定应用程序与目标RabbitMQ连接。这个连接的名称会展示在R阿布币TMQ的控制台上。这个名称不需要唯一并且也不能做为连接的标识符、例如,再HTTP API请求中。该值应该是人类可读的并且是connection_name
键下ClientProperties
的一部分。你可以使用简单的Lambda:
connectionFactory.setConnectionNameStrategy(connectionFactory -> "MY_CONNECTION");
ConnectionFactory
参数可以通过一些逻辑来区分目标连接名称。默认情况下,AbstractConnectionFactory
的beanName,表示对象的十六进制字符串,以及一个内部的记数共同构成了connection_name
。<rabbit:connection-factory>
名称空间也支持connection-name-strategy
属性。
ConnectionNameStrategy
的一个实现类SimplePropertyValueConnectionNameStrategy
将连接名称设置成应用程序的属性。您可以将其声明为@Bean并将其注入连接工厂,如下例所示:
@Bean
public ConnectionNameStrategy cns() {
return new SimplePropertyValueConnectionNameStrategy("spring.application.name");
}
@Bean
public ConnectionFactory rabbitConnectionFactory(ConnectionNameStrategy cns) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
...
connectionFactory.setConnectionNameStrategy(cns);
return connectionFactory;
}
这个属性必须存在于应用的上下文中。
当使用Spring Boot并且自动配置connection factory时,你只需要声明ConnectionNameStrategy @Bean
Boot将会自动检测bean并将其注入到工厂中。
阻止的连接和资源限制
连接可能会被阻止,以便与内存警报对应的broker保持一致。从2.0版本起,org.springframework.amqp.rabbit.connection.Connection
可以提供给com.rabbitmq.client.BlockedListener
实例连接被阻止和未被阻止的通知。此外AbstractConnectionFactory
通过其内部BlockedListener
实现分别发出一个ConnectionBlockedEvent
和ConnectionUnblockedEvent
。这些允许您提供应用程序逻辑,以便对broker上的问题做出适当的反应,并(例如)采取一些纠正措施。
使用单个CachingConnectionFactory
配置应用程序时,例如默认情况下,Spring Boot自动配置。应用会停止工作当连接被broker阻止的时候。当它被broker阻止时,它的任何client都会停止工作。如果在同一个应用程序中有生产者和消费者,当生产者阻塞连接时(因为broker已经没有资源了)而且消费者无法释放(因为连接被阻止了),最终陷入死锁。为了缓解问题,我们建议使用相同的选项再创建一个单独的CachingConnectionFactory实例 — 一个是生产者,一个是消费者。对于在消费者线程上执行的事务生产者,不可能使用单独的CachingConnectionFactory,因为它们应该重用与消费者事务关联的通道。
从2.0.2起,RabbitTemplate
有一个配置选项可以自动使用第二个connection factory,除非正在使用事务。请看Using a Separate Connection了解更多。publisher连接的ConnectionNameStrategy与的主要策略相同使用.publisher
附加到调用该方法的结果后。
从1.7.7开始,当调用SimpleConnection.createChannel()
缺无法创建一个channel时(例如,已经达到了channelMax
限制并且缓存中也没有可用的channel)就会抛出 AmqpResourceNotAvailableException
。您可以在RetryPolicy
中使用此异常,以便在一些回退之后恢复操作。