apache mina中寫的過程分析

2021-06-27 19:34:48 字數 4194 閱讀 3230

apache mina作為乙個網路應用框架,經常被用作訊息系統中,也就是說經常要去處理io,因此要實現高效的寫和讀。

最近又看了看寫的處理,始終發現不能完全的理解他的處理思路。

涉及的類

先看一下寫操作中涉及的類。

分析過程

從最底下的abstractpollingioprocessor.flush來分析

在mina的處理流程中,當processor接受到可以寫可以讀的sessions後,會將他們加入到flush佇列,而

abstractpollingioprocessor.flush就是flush的具體實現。

abstractpollingioprocessor.flush的大致流程如下:

do從flushsessions佇列中取出session

判斷

session

的狀態,如果是

opened

,那麼進行

flushnow

處理;如果是關閉狀態,那麼就跳過;

如果是開啟中,那麼就加入到

flushsessions

佇列中。

while(flushsessions佇列不為空)

上述流程中對於每個session的flush處理主要的過程是這樣:

flushnow:

final

boolean

hasfragmentation

=session

.gettransportmetadata

().hasfragmentation

();

final

writerequestqueue

writerequestqueue

=session

.getwriterequestqueue

();

// set limitation for the number of written bytes for read-write

// fairness. i used maxreadbuffersize * 3 / 2, which yields best

// performance in my experience while not breaking fairness much.

final

intmaxwrittenbytes

=session

.getconfig

().getmaxreadbuffersize

()+(

session

.getconfig

().getmaxreadbuffersize

()>>>

1);

intwrittenbytes =0

;

writerequest

req

=null

;

try

session

.setcurrentwriterequest

(req

);

}

intlocalwrittenbytes =0

;

object

message

=req

.getmessage

();//獲得寫請求中的訊息內容

if(

message

instanceof

iobuffer

)

}else

if

// 當前這次寫的資料量為0,說明是核心緩衝區滿了,這個時候也對這個session重新註冊寫興趣,然後讓select去處理。

if(

localwrittenbytes ==0

)

writtenbytes

+=localwrittenbytes

;

// 累加的寫出資料大於等於最大的寫上限

// 發生這種情況,是不是說明網路狀態好,有兩種情況出現:

// 1) 一次寫出的資料的長度就超過了最大寫出上限,此時,為了公平排程各個session的寫操作,不將繼續對當前session進行寫,而是將session加入到本次flush的session隊尾,在本次flush中繼續對當前session的寫請求佇列進行處理

// 2)通過多次迴圈的將session 的寫請求佇列中的多個訊息請求連續寫出,累計的寫出長度超過了最大寫出上限,此時,也是為了公平,不能繼續對當前的session進行處理,加入到佇列尾部。

if(

writtenbytes

>=

maxwrittenbytes

)

// 寫了一次只要在前面的三種情況下,沒有返回退出,說明當前的訊息內容處理完畢,可以釋放。

if(

message

instanceof

iobuffer

)

}while

(writtenbytes

<

maxwrittenbytes

);

}catch

(..)

flush:大致的思路如下(省略了session狀態的處理)

do

{

獲取session

的狀態

如果是opened

flushedall

=flushnow

(...)

如果flushedall

為true

,說明正在處理的

session

的writerequest

全部被處理完了,但是,可能在處理過程中又有

writerequeset

加入到這個

session

的寫請求佇列,這個時候,將這個

session

放到flushingsessions

佇列的末尾。繼續下乙個迴圈。

如果是closed

...

如果是opening

...while

(flushingsessions

不為空)

另外兩個函式writebuffer和write比較簡單,這裡不列出來了。

總結

flush函式是處理多個session的寫,主要是對處理過程中不同session狀態處理。

flushnow函式是處理單個session的寫可能出現的各種情況

writebuffer函式處理分片問題

write函式處理直接的寫

寫題過程中的debug總結

0 寫題之前 仔細讀題,要盡力理解透徹題意 確定資料範圍,如果資料達到1e9,就用long long 確定演算法 確定資料結構 1 樣例都沒過 檢查輸入 檢查變數型別 檢查是否正確輸入 仔細讀一遍程式 尤其注意迴圈變數,以及多組測試時初始化問題,除零,下標越界 仔細讀一遍題目,擯棄之前的觀念,避免思...

寫大白的過程中遇到的問題

寫大白的過程中遇到的問題,與解決方案 1,我想讓截圖與我寫的大白在一行上,但是把大白框擠到了下一行 效果如圖 原因 沒有明白行內元素與塊級元素的區別,沒有明白img是什麼元素,我開始以為是獨佔了一行,導致後面的框被擠到了下一行,後來才發現,是行內元素,不會將後面的擠到下一行,是後面的框是塊級元素,獨...

HDFS寫檔案的過程

1 副本及儲存策略 2 寫檔案的網路流量及磁碟空間 網路流量 磁碟空間 檔案size dfs.replication3 寫資料的流程 client將檔案file1劃分出blocks block1 block2 block3.client向nn發出寫block的請求 檔案file1的block1 nn...