RabbitMQ-Spring AMQP【翻译】4.1.2——Naming Connections & Blocked Connections and Resource Constraints

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中使用此异常,以便在一些回退之后恢复操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值