天天看點

[一]RabbitMQ-用戶端源碼之ConnectionFactory

首先看一段amqp-client發送端的示例代碼(展示出主要部分):

相信使用rabbitmq java用戶端的同學來說,這段代碼并不陌生,主要的作用是發送一條消息至broker然後關閉。通過wireshark抓包工具可以看到整個AMQP協定的流程,如下圖:

(10.101.48.240是client的ip,10.198.197.73是broker的ip)

[一]RabbitMQ-用戶端源碼之ConnectionFactory

下面通過源碼來分析下Connection有關的整個流程,對于上面AMQP流程中的Protocol-Header到Connection.Open-Ok的部分。

首先是ConnectionFactory類(文章開篇的demo中),這裡主要包含一些與broker連接配接的配置參數等,比如:username, password, virtualHost, host,port, requestedChannelMax, requestedFrameMax, requestedHeartbeat, connectionTimeout, shutdownTimeout(隻列出部分)。

這個類中其餘都是些Getter和Setter方法,但是有個newConnection方法是關鍵,文中開篇的demo代碼下面列出詳細内容:

方法中首先是FrameHandlerFactory fhFactory = createFrameHandlerFactory();這個是用來處理client與broker之間的通信幀(Frame)的,包括建立通信鍊路(java的原生socket,注意這裡沒有NIO也沒有netty)。

調用createFrameHandlerFactory()方法得到FrameHandlerFactory對象之後再:“ FrameHandler handler = fhFactory.create(addr);”傳回的是SocketFrameHandler對象,這個對象是對Socket的一個封裝,完全可以看成是一個Socket對象。

注意這裡的Socket的TCP_NODELAY參數預設設定為true,而不是預設的false。當然你也可以調用ConnectionFactory的setSocketConfigurator自行設定。

有關Socket的TCP_NODELAY參數:預設情況下發送資料是采用Negale算法。Negale算法是指發送方資料不會立刻發送出去,而是先放在緩沖區内,等待緩沖區滿了,在發出去。Negale算法适用于需要發送大量資料的應用場景。這種算法減少傳輸的次數增加性能。但是如果對于需要即使響應的,小批量資料的應用場景,例如網絡遊戲就不能采用Negale算法了。預設是false,表示采用Negale算法。

ConnectionParams 主要用來配置與broker連接配接相關的參數,比如username,password,vhost等。這個與前面Socket的參數不同,需要注意區分。

之後if(isAutomaticRecoveryEnabled()){}之内的方法是建立可自動恢複連接配接的,這個可以忽略,直接看else裡面的代碼,因為if和else大體功能上一緻,else裡的更通用一些,也是預設的。上面提到 FrameHandler handler = fhFactory.create(addr);這段代碼傳回的是SocketFrameHandler對象,之後: AMQConnection conn = new AMQConnection(params, handler);這句通過參數和Socket與broker建立連接配接。之後初始化:conn.start();完成之後用戶端就已經和broker建立了正常的連接配接了.

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

繼續閱讀