RabbitMQ 笔记(一)Connection Factory

有三个连接工厂可供选择:

  • PooledChannelConnectionFactory
  • ThreadChannelConnectionFactory
  • CachingConnectionFactory

对于大多数用例,应该使用PooledChannelConnectionFactory。如果您希望确保严格的消息顺序而不需要使用作用域操作,则可以使用ThreadChannelConnectionFactory。如果您希望使用相关的发布者确认,或者希望通过其CacheMode打开多个连接,则应该使用CachingConnectionFactory。

当配置RabbitTemplate使用单独的连接时,你现在可以从2.3.2版本开始,将发布连接工厂配置为不同的类型。默认情况下,发布工厂是相同的类型,并且在主工厂上设置的任何属性也会传播到发布工厂。

PooledChannelConnectionFactory

该工厂基于Apache Pool2管理单个连接和两个通道池。一个池用于事务通道,另一个池用于非事务通道。池是具有默认配置的GenericObjectPool;提供了一个回调来配置池;更多信息请参阅Apache文档。

ThreadChannelConnectionFactory

这个工厂管理一个连接和两个ThreadLocal,一个用于事务性通道,另一个用于非事务性通道。这个工厂确保同一个线程上的所有操作都使用同一个通道(只要它保持打开状态)。这有利于严格的消息排序,而不需要作用域操作。为了避免内存泄漏,如果应用程序使用许多短命线程,则必须调用工厂的closeThreadChannel()来释放通道资源。从2.3.7版开始,一个线程可以将它的通道传输到另一个线程。有关更多信息,请参见多线程环境中的严格消息排序。

CachingConnectionFactory

提供的第三个实现是CachingConnectionFactory,默认情况下,它建立一个可由应用程序共享的连接代理。共享连接是可能的,因为使用AMQP进行消息传递的“工作单元”实际上是一个“通道”(在某些方面,这类似于JMS中的连接和会话之间的关系)。此连接实例提供一个createChannel方法。CachingConnectionFactory实现支持这些通道的缓存,并根据通道是否是事务性的,为它们维护单独的缓存。当创建CachingConnectionFactory实例时,您可以通过构造函数提供'hostname'。您还应该提供“用户名”和“密码”属性。要配置通道缓存的大小(默认为25),可以调用setChannelCacheSize()方法。

从1.3版开始,您可以配置CachingConnectionFactory来缓存连接和通道。在本例中,每次调用createConnection()都会创建一个新连接(或从缓存中检索一个空闲连接)。关闭连接将连接返回给缓存(如果还没有达到缓存的大小)。在这些连接上创建的通道也会被缓存。在某些环境中,使用单独的连接可能是有用的,例如在HA集群中使用负载平衡器连接不同的集群成员和其他成员。要缓存连接,将cacheMode设置为cacheMode . connection。

重要的是要理解缓存大小(默认情况下)不是一个限制,而仅仅是可以缓存的通道数量。在缓存大小为10的情况下,实际上可以使用任意数量的通道。如果超过10个通道正在被使用,并且它们都被返回到缓存,那么10个通道进入缓存。其余部分是物理封闭的。

从1.6版开始,默认通道缓存大小从1增加到25。在大容量、多线程环境中,小缓存意味着通道的创建和关闭速度很高。增加默认缓存大小可以避免这种开销。你应该通过RabbitMQ Admin UI监控正在使用的通道,如果你看到很多通道被创建和关闭,考虑进一步增加缓存大小。缓存只按需增长(以适应应用程序的并发性需求),因此此更改不会影响现有的低容量应用程序。

从1.4.2版本开始,CachingConnectionFactory有一个名为channelCheckoutTimeout的属性。当此属性大于零时,channelCacheSize将成为可以在连接上创建的通道数量的限制。如果达到限制,调用线程将阻塞,直到通道可用或达到此超时,在这种情况下会抛出AmqpTimeoutException。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值