在擴(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è)黑匣子!