關于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>