Java NIO WatchService奇遇記

在擴(kuò)展Apache Flume的Taildir Source的過(guò)程中圣蝎,由于感覺(jué)其采用IO輪詢的方式,而不是Java NIO溜哮,會(huì)有性能問(wèn)題徽职,于是就打算通過(guò)Java NIO將相關(guān)的部分重寫(xiě)一遍.

我們的想法是這樣的偎箫,先監(jiān)控某個(gè)目錄,然后當(dāng)有文件修改事件觸發(fā)時(shí),判斷一下被修改的文件是否是某些特定的文件,如果是堵第,則讀取其新增的內(nèi)容,并發(fā)送給Channel.

通過(guò)Google,我們找到了WatchService這個(gè)東西隧出,然后參考官方的源代碼實(shí)現(xiàn)了一遍.

開(kāi)始沒(méi)有什么問(wèn)題.實(shí)際上是有問(wèn)題踏志,但是我沒(méi)有注意到.

用WatchService實(shí)現(xiàn)的代碼如下:

我們可以看到,其中有一個(gè)死循環(huán)胀瞪,不斷地讀取新的事件针余,判斷是否是我們要監(jiān)控的文件,如果是凄诞,則讀取新的內(nèi)容并發(fā)送給Channel.

問(wèn)題是圆雁,它是死循環(huán)啊!!!

昨天下午在系統(tǒng)的其他部分時(shí),由于擴(kuò)展后的Flume也是其中的一個(gè)必須的組件帆谍,所以就一直開(kāi)著Flume.期間伪朽,我就納悶,怎么電量這么不耐用呢?之前都是能夠撐兩個(gè)小時(shí)的汛蝙,怎么這次只用不到一個(gè)小時(shí)就沒(méi)電了?

用top命令查看了一下烈涮,發(fā)現(xiàn)一個(gè)Java應(yīng)用的CPU利用率一直都是100%+.

用ps命令查看了一下對(duì)應(yīng)的進(jìn)程,發(fā)現(xiàn)就是我們的Flume進(jìn)程.

此時(shí)患雇,我恍然大悟.想到了可能是死循環(huán)導(dǎo)致的CPU利用率太高.

這時(shí),想起了自己在改寫(xiě)這部分時(shí)的初衷宇挫,是希望能夠有這么一個(gè)接口苛吱,我們可以傳入要監(jiān)聽(tīng)的事件,然后傳入一個(gè)回調(diào)函數(shù).當(dāng)觸發(fā)相應(yīng)的事件時(shí)器瘪,就調(diào)用回調(diào)函數(shù).

而WatchService顯然不是我需要的.

再次Google了一下之后翠储,發(fā)現(xiàn)有人推薦用一款叫JNotifier的庫(kù).從StackOverflow上得知,這個(gè)庫(kù)需要調(diào)用一個(gè)本地庫(kù)橡疼,而這個(gè)本地庫(kù)是封裝了Linux上的某個(gè)調(diào)用援所,用C語(yǔ)言封裝的,打包成了一個(gè)so文件.

所以欣除,我們想用的話住拭,就得先將這個(gè)so文件下載下來(lái),然后加入java.native.path中.開(kāi)始我是拒絕的,但是看到它的API那么簡(jiǎn)單滔岳,楚楚動(dòng)人杠娱,我就忍不住想要嘗試一下.然而,官網(wǎng)上并沒(méi)有明確說(shuō)明我們要如何來(lái)做.

結(jié)合出現(xiàn)的問(wèn)題谱煤,StackOverflow了好長(zhǎng)時(shí)間摊求,用他們提供的方法都沒(méi)有解決.直到發(fā)現(xiàn)有一個(gè)人提問(wèn)說(shuō)他在Java 1.7和Java 1.8下都嘗試過(guò),但是都出現(xiàn)那個(gè)錯(cuò)誤刘离,底下有人回答說(shuō)室叉,Java 1.8就不行.看到這,我終于失去了耐心硫惕!我用的就是Java 1.8.

最終茧痕,我刪除了一切跟JNotify相關(guān)的內(nèi)容,然后重新踏上了尋找之路.

后來(lái)疲憋,我發(fā)現(xiàn)了一個(gè)庫(kù)凿渊,叫Apache Commons VFS.畢竟是Apache的產(chǎn)品,用起來(lái)更放心一些.使用起來(lái)缚柳,發(fā)現(xiàn)它的API甚至更加簡(jiǎn)單埃脏,最終實(shí)現(xiàn)的代碼如下:

現(xiàn)在,F(xiàn)lume的CPU利用率就保持正常了.

但是秋忙,Apache Commons VFS的具體實(shí)現(xiàn)彩掐,我并沒(méi)有查看.我不知道它到底是如何實(shí)現(xiàn)的,內(nèi)部是否還是通過(guò)輪詢的方式實(shí)現(xiàn)的.雖然它現(xiàn)在能正常工作灰追,但是我們并沒(méi)有對(duì)它進(jìn)行過(guò)深度測(cè)試堵幽,所以,實(shí)際上弹澎,我們是不能信任它的.我們并不能認(rèn)為它就完美無(wú)暇.因?yàn)樗F(xiàn)在對(duì)我們就是一個(gè)黑匣子!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朴下,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苦蒿,更是在濱河造成了極大的恐慌殴胧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩迟,死亡現(xiàn)場(chǎng)離奇詭異团滥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)报强,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灸姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秉溉,你說(shuō)我怎么就攤上這事力惯⊥胗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵夯膀,是天一觀的道長(zhǎng)诗充。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诱建,這世上最難降的妖魔是什么蝴蜓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俺猿,結(jié)果婚禮上茎匠,老公的妹妹穿的比我還像新娘。我一直安慰自己押袍,他們只是感情好诵冒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谊惭,像睡著了一般汽馋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圈盔,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天豹芯,我揣著相機(jī)與錄音,去河邊找鬼驱敲。 笑死铁蹈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的众眨。 我是一名探鬼主播握牧,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娩梨!你這毒婦竟也來(lái)了沿腰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狈定,失蹤者是張志新(化名)和其女友劉穎颂龙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掸冤,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厘托,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年友雳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稿湿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡押赊,死狀恐怖饺藤,靈堂內(nèi)的尸體忽然破棺而出包斑,到底是詐尸還是另有隱情,我是刑警寧澤涕俗,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布罗丰,位于F島的核電站,受9級(jí)特大地震影響再姑,放射性物質(zhì)發(fā)生泄漏萌抵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一元镀、第九天 我趴在偏房一處隱蔽的房頂上張望绍填。 院中可真熱鬧,春花似錦栖疑、人聲如沸讨永。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卿闹。三九已至,卻和暖如春萝快,著一層夾襖步出監(jiān)牢的瞬間锻霎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工杠巡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留量窘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓氢拥,卻偏偏與公主長(zhǎng)得像蚌铜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫩海,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容