原文(http://www.aygfsteel.com/roymoro/archive/2011/05/09/349833.html)
問題:寫出這個(gè)工具的意義在于我運(yùn)行一個(gè)需要長(zhǎng)時(shí)間執(zhí)行的程序,如單線程爬蟲。在網(wǎng)絡(luò)出現(xiàn)中斷的或網(wǎng)站丟包情況下,程序會(huì)拋出socketexception 和sockettimeoutexception。程序會(huì)中斷。(再此只是提出一種假設(shè))
解決方案:
Java 并不能像C#一樣對(duì)windows的進(jìn)程進(jìn)行監(jiān)控(資料說這是跨平臺(tái)原因)。因此沒有api 提供對(duì)其他進(jìn)程的監(jiān)控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過對(duì)文件的加鎖,來判斷程序是否在運(yùn)行。
一、判斷當(dāng)前程序是否正在運(yùn)行
在此我參考了:
java 對(duì)文件的加鎖。
http://www.examda.com/Java/jichu/20070411/140527453.html
(原文地址不知)
這里的思路是:
1、 在要監(jiān)視寫的程序中(這里假設(shè)為爬蟲)對(duì)一個(gè)用來判斷程序是否運(yùn)行的文件(自定義,無實(shí)際意義。只是一個(gè)空文件)對(duì)文件進(jìn)行加鎖。
2、 在守護(hù)程序中寫了簡(jiǎn)單的 循環(huán)來實(shí)現(xiàn)按時(shí)探測(cè)。這里面比如說20秒。
3、 如果程序確實(shí)在運(yùn)行(即文件不能再被加鎖,因?yàn)橐驯绘i),那么證明程序確實(shí)在運(yùn)行,否則,如果程序出現(xiàn)了網(wǎng)絡(luò)異常而中斷,那么runtime重新調(diào)用該程序。
(演示代碼如下:注意不要忘了在爬蟲程序中需要對(duì)文件進(jìn)行加鎖)。這樣才有效。
演示代碼:








































RandomAccessFile fis = new RandomAccessFile(fileLockPath,"rw");
FileChannel lockfc = fis.getChannel();
FileLock flock = lockfc.tryLock();
























































如果您有更好解決方案,希望您聯(lián)系我。 歡迎留言,提供您寶貴的意見。代碼不規(guī)范,僅供參考。
# re: Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程) [未登錄] 2011-05-09 15:36 feenn
bz提供的方案也挺好的,不過我覺得還可以這樣搞:
1.JNI方式:典型的開源項(xiàng)目有:http://sourceforge.net/projects/jsysmonitor/
2.以爬蟲為例,守護(hù)程序與爬蟲之間維持一個(gè)連接,使用某種具有連接屬性的協(xié)議,如socket TCP。當(dāng)連接異常斷開則認(rèn)為爬蟲出錯(cuò)需要重啟,好處是通過使用事件機(jī)制,可以實(shí)時(shí)監(jiān)控爬蟲。當(dāng)然,前提是爬蟲源代碼可見,且可以修改。
典型實(shí)現(xiàn):某些大型分布式系統(tǒng)
3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當(dāng)然前提是程序都在JVM中運(yùn)行。
當(dāng)然,守護(hù)進(jìn)程最高效、最完美的做法是使用C/C++來編寫,在各種平臺(tái)如Linux/Unix上都有豐富的API可以使用。
個(gè)人建議,僅供參考。 回復(fù) 更多評(píng)論