天天看點

ZeroMQ(JAVA)中的資料流,SessionBase與SocketBase

前面的文章中已經比較的清楚了ZeroMQ(java)中如何在底層處理IO,

通過StreamEngine對象來維護SelectableChannel對象以及IO的事件回調,然後通過Poller對象來維護Selector對象,然後用IOObject對象來具體的管理SelectableChannel對象在Poller上面的注冊,以及事件回調,他們之間的關系可以用下面的圖形來簡單的描述一下:

ZeroMQ(JAVA)中的資料流,SessionBase與SocketBase

對于接收到的資料,首先由StreamEngine進行處理,其實它會調用内部的decoder将位元組資料轉化為Msg對象,然後再交給上層的對象,

其實這裡的上層對象也就是Session對象,每一個StreamEngine對象都有一個自己的Session對象,然後Session對象收到下面傳上來的資料之後,再會通過Pipe,将資料發送到其更上層的Socket對象,

然後接下來的資料處理就交由使用者的代碼來處理了。。。

對于剛剛提到的對象之間的層次,用下面的圖形來描述吧:

ZeroMQ(JAVA)中的資料流,SessionBase與SocketBase

這張圖應該還算刻畫的比較直接了吧,底層資料通信部分負責從channel接收資料和發送二進制的資料,然後又Decoder以及Encoder來負責位元組資料與Msg之間的轉化。。。。

我們在ZMQ中會看到很多種類的Socket,例如Req,Dealer,Router啥的,他們都繼承自SocketBase類型,每一種類型都有自己的Session,都繼承自SessionBase類型。。。

好了,那麼接下來先來看看SessionBase類型吧,每一個StreamEngine對象都有一個Session對象與之關聯,他們是一對一的關系,先來看看它的一些重要的屬性定義吧:

具體這些屬性的是幹嘛的,上面的注釋基本上都已經給出來的吧,這裡比較重要的屬性是:

pipe,它用于與上面的Socket進行通信,當下層有資料被解析出來以後,會通過pipe将msg發送給上層的socket,具體pipe的過程,前面的文章已經說過了。。。

IEngine,底層資料通信的StreamEngine對象的引用,這個重要性就不說了吧,。。。

IOThread對象,這個是目前Session對象将會依賴的IO線程,也就是發給session的指令都會被這個IO線程的mailbox接收到,進而在這個線程中執行指令,嗯。。。重要吧。。。

另外還有一些标志位什麼的。。。

好了,這裡就不細說,來看看一些重要的方法吧:

用于關聯pipe對象,這裡可以看到将pipe的事件回到設定成了目前session對象。。那麼來看看這些事件回調方法是怎麼處理的吧:

這裡先是pipe可以讀的時候的事件回調方法,這個處理很簡單吧,直接激活底層StreamEngine的channle在poller上注冊寫事件,那麼當底層channel可以寫資料的時候,就會從目前session的pipe裡去讀取資料,然後發送出去。。

第二個方法是當pipe可以寫的時候,這個其實就是直接注冊channel的讀取事件,那麼當channel就會去接收資料,最後這些他們都會通過pipe發送給上層的socket對象。。。到此上面那張圖的整個運作情況應該都很清楚了吧。。。

那麼Session的最為關鍵的地方也就差不多了。。。還有一些細節,以後有需要的話再介紹吧。。。

好了接下來來看看SocketBase這個類型吧,前面已經說到了ZMQ中所有的Socket類型多繼承自這個類型,可見他的重要性。。。先來看看它的一些重要的屬性定義吧:

這裡比較重要的有,:

enpoints,用于儲存所有的session與其連接配接位址的,

pipes,儲存所有與底層的session關聯的pipe,這裡Socket與Sesssion之間的關系是一對多的...

mailbox,socket也有自己的mailbox,不用依附于IOThread對象,不過這裡有個坑,Socket類型的對象有自己的mailbox,不用依附于IO線程,并不意味着它就有自己的線程,因為它直接依賴于使用者線程,依賴于使用者代碼...也就是說mailbox裡面的指令的執行都是在使用者線程中搞定的...呵呵,剛開始這個地方還糾結了很久...

來看看它的pipe的事件回調吧:

其實這裡沒有太多的内容,因為都是在具體的子類中完成的,不過到這裡整個ZeroMQ(java)中資料是怎麼進行流動的就算已經很清楚了...當然,有一些細節性的東西還沒有列出來..

好了,到現在為止,ZeroMQ(java)中就還剩下具體的socket類型的運作以及編碼方式兩個大的地方沒有分析了...

上一篇: pci dss toolkit
下一篇: 開源沙盒