天天看點

[五]RabbitMQ-用戶端源碼之AMQChannel

AMQChannel是一個抽象類,是ChannelN的父類。其中包含唯一的抽象方法:

首先來說下AMQChannel的成員變量:

_channelMutex這個是内部用來當對象鎖的,沒有實際的意義,可忽略

_connection是指AMQConnection這個對象。

_channelNumber是指channel number, 這個應該不用多解釋了吧。通道編号為0的代表全局連接配接中的所有幀,1-65535代表特定通道的幀.

_command是内部處理使用的對象,調用AMQCommand的方法來處理一些東西。

_activeRpc是指目前未處理完的rpc請求(the current outstanding rpc request)。

_blockContent 是在Channel.Flow裡用到的,其餘情況都是false

在AMQChannel的構造函數中,隻有兩個參數:AMQConnection connection以及int channelNumber.

AMQChannel中有個handleFrame方法:

AMQChannel中有很多方法帶有rpc的字樣,這來做一個整理。

首先是:

這個方法在AMQConnection.start()方法中有過使用:_channel0.enqueueRpc(conStartBroker)。這個方法就是将參數付給成員變量_activeRpc,至于這個RpcContinuation到底是個什麼gui,我們下面再講。

繼續下一個方法:

這個方法是判斷一下目前的_activeRpc是否為null,為null則為false,否則為true。看方法的名字應該猜出大半。

下面一個方法:

方法将目前的_activeRpc傳回,并置AQMChannel的_activeRpc為null。

接下來幾個方法聯系性很強:

主要是看最後一個方法——quiescingRpc.這個方法說白就兩行代碼:

enqueueRpc(k);是将由privateRpc等方法内部建立的SimpleBlockingRpcContinuation對象附給目前的AQMChannel對象的成員變量_activeRpc

關于quiescingTransmit(m)就要接下去看了:

上面代碼隻需要看: c.transmit(this);這一句,其餘的都是擺設。看到這裡,就調用了AMQCommand的transmit方法,這個transmit方法就是講AMQChannel中封裝的内容發給broker,然後等待broker傳回,進而通過之前附值的_activeRpc來處理回傳的幀。

在AMQConnection中有這麼一段代碼:

用戶端将Method封裝成Connection.StartOk幀之後等待broker傳回Connection.Tune幀。

此時調用了AMQChannel的rpc(Method m, int timeout)方法,其間接調用了AMQChannel的privateRpc(Method, int timeout)方法。代碼詳情上面已經羅列出來。

注意privateRpc(Method, int timeout)方法的最有一句傳回:return k.getReply(timeout);這句代碼的意思是SimpleBlockingRpcContinuation對象在等待broker的傳回,确切的來說是MainLoop線程處理之後傳回,即AMQChannel類中handleCompleteInboundCommand方法的nextOutstandingRpc().handleCommand(command)這行代碼。

AQMChannel還有些其他的内容,都是邊緣性的東西,這裡還剩下個RpcContinuation要着重闡述下的:

RPCContinuation隻是一個接口,而BlockingRpcContinuation這個抽象類缺似乎略有門道。而SimpleBlockingRpcContinuation隻是将BlockingRpcContinuation中的handleCommand方法便成為:

BlockingRpcContinuation類主要操縱了BlockingValueOrException _blocker這個成員變量。再接下深究BlockingValueOrException其實是繼承了BlockingCell,對其做了一下簡單的封裝。最後來看下BlockingCell是個什麼鬼, 截取部分代碼如下:

其實這個就是capacity為1的BlockingQueue,顧美其名曰BlockingCell,繞了大半圈,原來AMQChannel中的_activeRpc就是個這麼玩意兒~

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

繼續閱讀