Mina NIO通信相關bug整理

1倔韭、java.lang.NegativeArraySizeException
發(fā)生在用負數(shù)長度創(chuàng)建數(shù)組時,原因是應用層報文設計數(shù)據(jù)最大長度為short绣版,當數(shù)據(jù)超過short強制轉換回丟失數(shù)據(jù)導致數(shù)值變負數(shù)篷牌。
所以在設計應用層報文時一定要注意數(shù)據(jù)的長度小于上限。本例中可以用int代替short讓數(shù)據(jù)有2^32-1的長度涩金。

2、濫用ExecutorFilter
Mina是基于REACTOR模型的暇仲,當連接建立對方發(fā)來消息首先由Processor線程池派出一個線程執(zhí)行讀取事件步做,經過粘包/缺包處理器處理,然后就完整的字節(jié)報文轉換成上層應用報文奈附。

假設解碼器的代碼為:
connector.getFilterChain().addLast("BaseFilter", new ProtocolCodecFilter(new BaseCodecFactory()));

如果在FilterChain之前加入代碼:
connector.getFilterChain().addLast("threadpool",
new ExecutorFilter(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)));

意思是解碼器將不會在Processor線程池執(zhí)行全度,而是由新創(chuàng)建的ExecutorFilter中的線程池執(zhí)行。
這就導致了一個問題斥滤,假設數(shù)據(jù)長度8K将鸵,網絡速度16K/S, 本地寫入速度4K/S,明顯網絡速度大于本地IO速度佑颇,所以可能ExecutorFilter中的線程還沒處理完一個完整應用層報文顶掉,Processor已經開始了下一個網絡流的讀取,從而導致數(shù)據(jù)錯位挑胸。

本例中如果網絡速度小于IO速度不會出現(xiàn)此問題一喘,但是因為本地IO速度是動態(tài)的,當連接數(shù)增大IO遇到瓶頸很可能觸發(fā)此問題嗜暴。所以在FilterChain層加入線程池至少應該放在解碼層后面凸克,避免不同步處理數(shù)據(jù)的異常。

3闷沥、不同步發(fā)送文件分段導致文件寫入不同步
雖然Reactor模型的SelectionKey.OP_READ 事件是按順序讀取SocketChannel的萎战,但是如果在mina解碼后配置:
connector.getFilterChain().addLast("threadpool",
new ExecutorFilter(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)));
會導致處理上層報文的無序。

如果傳輸文件使用無序寫入舆逃,就不能用FileOutputStream的追加模式:
FileOutputStream fos = new FileOutputStream(fileTask.zippedFilePath, true);
fos.write(filePart.data);
fos.flush();
fos.close();
因為寫入是并發(fā)的蚂维,并不能保證其有序。

在并發(fā)環(huán)境下寫入文件可以使用RandomAccessFile,支持在文件的指定位置寫入:
RandomAccessFile randomAccessFile = new RandomAccessFile(fileTask.zippedFilePath, "rw");
long beginIndex = fileTask.fileSegmentSize*filePart.partId;
randomAccessFile.seek(beginIndex);
System.out.println("file length = "+randomAccessFile.length()+" , beginIndex = "+beginIndex);
randomAccessFile.write(filePart.data);
randomAccessFile.close();

因為文件處理是并行的路狮,最后一段數(shù)據(jù)可能并不是最后處理完成的虫啥,所以怎么判斷寫入文件執(zhí)行完畢?
發(fā)送文件分段時會傳入當前文件分段的partId奄妨,在接收文件處理中使用AtomicInteger為partId計數(shù)涂籽,算出總計有多少個分段,再判斷當前完成的分段數(shù)是否達到總數(shù)砸抛,就能夠判斷文件是否完全寫入:

//每個線程執(zhí)行完分段的寫入將partId加1
int partId = fileTask.partId.incrementAndGet();

//算出總計有多少分段评雌,用文件總大小除以分段的大小,如果有小數(shù)則加1取整
//最大傳輸4G的文件(2^32-1字節(jié))直焙,超過則程序異常
int totalPart = (int) Math.ceil((double)fileTask.zippedFileSize/fileTask.fileSegmentSize);

if (partId==totalPart) {
//文件接收完畢
//md5驗證
//通知對方
}

4景东、Processor線程池內的線程是固定的,要保證每個線程在運行期間不發(fā)生異常終止奔誓,否則Processor線程池不會重新創(chuàng)建線程斤吐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厨喂,隨后出現(xiàn)的幾起案子和措,更是在濱河造成了極大的恐慌,老刑警劉巖杯聚,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼婆,死亡現(xiàn)場離奇詭異,居然都是意外死亡幌绍,警方通過查閱死者的電腦和手機颁褂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傀广,“玉大人颁独,你說我怎么就攤上這事∥北” “怎么了誓酒?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我靠柑,道長寨辩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任歼冰,我火速辦了婚禮靡狞,結果婚禮上,老公的妹妹穿的比我還像新娘隔嫡。我一直安慰自己甸怕,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布腮恩。 她就那樣靜靜地躺著梢杭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秸滴。 梳的紋絲不亂的頭發(fā)上武契,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音缸榛,去河邊找鬼吝羞。 笑死,一個胖子當著我的面吹牛内颗,可吹牛的內容都是我干的钧排。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼均澳,長吁一口氣:“原來是場噩夢啊……” “哼恨溜!你這毒婦竟也來了?” 一聲冷哼從身側響起找前,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤糟袁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后躺盛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项戴,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年槽惫,在試婚紗的時候發(fā)現(xiàn)自己被綠了周叮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡界斜,死狀恐怖仿耽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情各薇,我是刑警寧澤项贺,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響开缎,放射性物質發(fā)生泄漏棕叫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一啥箭、第九天 我趴在偏房一處隱蔽的房頂上張望谍珊。 院中可真熱鬧,春花似錦急侥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绊茧,卻和暖如春铝宵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背华畏。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工鹏秋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡笑。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓侣夷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仑乌。 傳聞我的和親對象是個殘疾皇子百拓,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)晰甚,斷路器衙传,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 前言 使用Mina大概也有半年了,一直忙于開發(fā)而忘了總結厕九,項目里的業(yè)務系統(tǒng)只需要發(fā)送文字消息蓖捶,而TCP底層是不區(qū)分...
    Mars_M閱讀 3,771評論 3 7
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法扁远,內部類的語法俊鱼,繼承相關的語法,異常的語法穿香,線程的語...
    子非魚_t_閱讀 31,657評論 18 399
  • 從三月份找實習到現(xiàn)在亭引,面了一些公司,掛了不少皮获,但最終還是拿到小米焙蚓、百度、阿里、京東购公、新浪萌京、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,271評論 11 349
  • 標題興許的確是很熟悉宏浩,是的知残,蔡健雅有首“被馴服的象”的歌突然流行起來,歌詞里句句都深入人心比庄, 很像C小姐現(xiàn)在的...
    warm小歪閱讀 742評論 0 0