Java 實(shí)現(xiàn)程序運(yùn)行監(jiān)控狀態(tài)之我的思路(守護(hù)進(jìn)程)
問(wèn)題:寫出這個(gè)工具的意義在于我運(yùn)行一個(gè)需要長(zhǎng)時(shí)間執(zhí)行的程序,如單線程爬蟲(chóng)。在網(wǎng)絡(luò)出現(xiàn)中斷的或網(wǎng)站丟包情況下,程序會(huì)拋出socketexception 和sockettimeoutexception。程序會(huì)中斷。(再此只是提出一種假設(shè))
解決方案:
Java 并不能像C#一樣對(duì)windows的進(jìn)程進(jìn)行監(jiān)控(資料說(shuō)這是跨平臺(tái)原因)。因此沒(méi)有api 提供對(duì)其他進(jìn)程的監(jiān)控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過(guò)對(duì)文件的加鎖,來(lái)判斷程序是否在運(yùn)行。
一、判斷當(dāng)前程序是否正在運(yùn)行
在此我參考了:
java 對(duì)文件的加鎖。
http://www.examda.com/Java/jichu/20070411/140527453.html
(原文地址不知)
這里的思路是:
1、 在要監(jiān)視寫的程序中(這里假設(shè)為爬蟲(chóng))對(duì)一個(gè)用來(lái)判斷程序是否運(yùn)行的文件(自定義,無(wú)實(shí)際意義。只是一個(gè)空文件)對(duì)文件進(jìn)行加鎖。
2、 在守護(hù)程序中寫了簡(jiǎn)單的 循環(huán)來(lái)實(shí)現(xiàn)按時(shí)探測(cè)。這里面比如說(shuō)20秒。
3、 如果程序確實(shí)在運(yùn)行(即文件不能再被加鎖,因?yàn)橐驯绘i),那么證明程序確實(shí)在運(yùn)行,否則,如果程序出現(xiàn)了網(wǎng)絡(luò)異常而中斷,那么runtime重新調(diào)用該程序。
(演示代碼如下:注意不要忘了在爬蟲(chóng)程序中需要對(duì)文件進(jìn)行加鎖)。這樣才有效。
演示代碼:
bz提供的方案也挺好的,不過(guò)我覺(jué)得還可以這樣搞: 1.JNI方式:典型的開(kāi)源項(xiàng)目有:http://sourceforge.net/projects/jsysmonitor/ 2.以爬蟲(chóng)為例,守護(hù)程序與爬蟲(chóng)之間維持一個(gè)連接,使用某種具有連接屬性的協(xié)議,如socket TCP。當(dāng)連接異常斷開(kāi)則認(rèn)為爬蟲(chóng)出錯(cuò)需要重啟,好處是通過(guò)使用事件機(jī)制,可以實(shí)時(shí)監(jiān)控爬蟲(chóng)。當(dāng)然,前提是爬蟲(chóng)源代碼可見(jiàn),且可以修改。 典型實(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++來(lái)編寫,在各種平臺(tái)如Linux/Unix上都有豐富的API可以使用。 個(gè)人建議,僅供參考。 回復(fù) 更多評(píng)論
posted on 2011-05-09 13:42 scorpio小蝎 閱讀(12315) 評(píng)論(4) 編輯 收藏 所屬分類: java
如果您有改進(jìn)建議,或者更好方案,歡迎留言,再次表示感謝 回復(fù) 更多評(píng)論
If you’re still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you’ll know which is right for you. 回復(fù) 更多評(píng)論
bz提供的方案也挺好的,不過(guò)我覺(jué)得還可以這樣搞:1.JNI方式:典型的開(kāi)源項(xiàng)目有:http://sourceforge.net/projects/jsysmonitor/2.以爬蟲(chóng)為例,守護(hù)程序與爬蟲(chóng)之間維持一個(gè)連接,使用某種具有連接屬性的協(xié)議,如socket TCP。當(dāng)連接異常斷開(kāi)則認(rèn)為爬蟲(chóng)出錯(cuò)需要重啟,好處是通過(guò)使用事件機(jī)制,可以實(shí)時(shí)監(jiān)控爬蟲(chóng)。當(dāng)然,前提是爬蟲(chóng)源代碼可見(jiàn),且可以修改。典型實(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++來(lái)編寫,在各種平臺(tái)如Linux/Unix上都有豐富的API可以使用。個(gè)人建議,僅供參考。 回復(fù) 更多評(píng)論
@feenn非常感謝feenn 的方案 。這種方案非常成熟,有很多應(yīng)用,大家也可以參考方案 回復(fù) 更多評(píng)論
Powered by: BlogJava Copyright © scorpio小蝎