天天看點

[三]RabbitMQ-用戶端源碼之ChannelManager

關于ChannelManager,官方注解:Manages a set of channels, indexed by channel number (1.. _channelMax)。

ChannelManager類的代碼量不是很多,主要用來管理Channel的,channelNumber=0的除外,應為channelNumber=0是留給Connection的特殊的channelNumber。

下面是ChannelManager的成員變量:

這上面的成員變量下面會有涉及。

對于ChannelManager的使用,是AMQConnection中的成員變量:

AMQConnection中start()的_channelManager中對其初始化:

再調用其構造函數:

這裡的ConsumerWorkService也在AMQConnection的start()方法中初始化——initializeConsumerWorkService():

再回到構造函數。

channelMax參數是在client接收到broker的Connection.Tune幀中的“Channel-Max”參數之後設定的,如果為0則表示沒有限制,這裡就會設定為預設的最大值:2的16次方-1。

threadFactory參數是指:Executors.defaultThreadFactory();

關于ConsumerWorkService請參考文章末尾處。

使用過RabbitMQ的同學知道要生産或者消費消息之前必須要初始化Channel,如下:

這個createChannel()是AMQConnection中的方法:

這裡就是調用了ChannelManager的createChannel方法。

下面是ChannelManager中關于建立Channel的代碼:

上面有兩個createChannel方法,一個是帶了channelNumber的,一個是自動分片channelNumber的,分别對應AMQConnection中的兩個方法。最後都調用addNewChannel方法。

注意兩個createChannel方法中都有這樣一句代碼:

這個是什麼呢?其實是調用ChannelN的open方法:

這樣就調用了AMQChannel的rpc方法,向broker發送了一個Channel.Open幀。

addNewChannel方法實際上是建立了一個ChannelN對象,然後置其于ChannelManager中的_channelMap中,友善管理。

channelNumberAllocator是channelNumber的配置設定器,其原理是采用BitSet來實作channelNumber的配置設定,有興趣的同學可以深究進去看看。

關于ChannelN類會有專門一篇博文來講述,其實整個RabbitMQ-client的代碼最關鍵的就是ChannelN這個類,需要着重講述。

細心的朋友可能會發現關于ConsumerWorkService這個,我并沒有做什麼闡述。這個主要牽涉到Channel層面的處理,涉及到的類有AMQConnection, ChannelN, ConsumerDispatcher等。ConsumerWorkService是在AMQConnection中初始化,在ChannelManager中引用。至于這裡怎麼了解,在ChannelN中這麼解釋:

service for managing this channel’s consumer callbacks。意思是管理消費回調的服務。

綜述,ChannelManager主要用來管理Channel, 包括channelNumber與Channel之間的映射關系。

<a href="http://blog.csdn.net/u013256816/article/details/70214929">[Conclusion]RabbitMQ-用戶端源碼之總結</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214708">[一]RabbitMQ-用戶端源碼之ConnectionFactory</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214730">[二]RabbitMQ-用戶端源碼之AMQConnection</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214754">[三]RabbitMQ-用戶端源碼之ChannelManager</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214776">[四]RabbitMQ-用戶端源碼之Frame</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214791">[五]RabbitMQ-用戶端源碼之AMQChannel</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214811">[六]RabbitMQ-用戶端源碼之AMQCommand</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214835">[七]RabbitMQ-用戶端源碼之AMQPImpl+Method</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214863">[八]RabbitMQ-用戶端源碼之ChannelN</a>

<a href="http://blog.csdn.net/u013256816/article/details/70214903">[九]RabbitMQ-用戶端源碼之Consumer</a>

繼續閱讀