Java 實現程序運行監控狀態之我的思路(守護進程)
問題:寫出這個工具的意義在于我運行一個需要長時間執行的程序,如單線程爬蟲。在網絡出現中斷的或網站丟包情況下,程序會拋出socketexception 和sockettimeoutexception。程序會中斷。(再此只是提出一種假設)
解決方案:
Java 并不能像C#一樣對windows的進程進行監控(資料說這是跨平臺原因)。因此沒有api 提供對其他進程的監控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過對文件的加鎖,來判斷程序是否在運行。
一、判斷當前程序是否正在運行
在此我參考了:
java 對文件的加鎖。
http://www.examda.com/Java/jichu/20070411/140527453.html
(原文地址不知)
這里的思路是:
1、 在要監視寫的程序中(這里假設為爬蟲)對一個用來判斷程序是否運行的文件(自定義,無實際意義。只是一個空文件)對文件進行加鎖。
2、 在守護程序中寫了簡單的 循環來實現按時探測。這里面比如說20秒。
3、 如果程序確實在運行(即文件不能再被加鎖,因為已被鎖),那么證明程序確實在運行,否則,如果程序出現了網絡異常而中斷,那么runtime重新調用該程序。
(演示代碼如下:注意不要忘了在爬蟲程序中需要對文件進行加鎖)。這樣才有效。
演示代碼:
bz提供的方案也挺好的,不過我覺得還可以這樣搞: 1.JNI方式:典型的開源項目有:http://sourceforge.net/projects/jsysmonitor/ 2.以爬蟲為例,守護程序與爬蟲之間維持一個連接,使用某種具有連接屬性的協議,如socket TCP。當連接異常斷開則認為爬蟲出錯需要重啟,好處是通過使用事件機制,可以實時監控爬蟲。當然,前提是爬蟲源代碼可見,且可以修改。 典型實現:某些大型分布式系統 3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當然前提是程序都在JVM中運行。 當然,守護進程最高效、最完美的做法是使用C/C++來編寫,在各種平臺如Linux/Unix上都有豐富的API可以使用。 個人建議,僅供參考。 回復 更多評論
posted on 2011-05-09 13:42 scorpio小蝎 閱讀(12316) 評論(4) 編輯 收藏 所屬分類: java
如果您有改進建議,或者更好方案,歡迎留言,再次表示感謝 回復 更多評論
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. 回復 更多評論
bz提供的方案也挺好的,不過我覺得還可以這樣搞:1.JNI方式:典型的開源項目有:http://sourceforge.net/projects/jsysmonitor/2.以爬蟲為例,守護程序與爬蟲之間維持一個連接,使用某種具有連接屬性的協議,如socket TCP。當連接異常斷開則認為爬蟲出錯需要重啟,好處是通過使用事件機制,可以實時監控爬蟲。當然,前提是爬蟲源代碼可見,且可以修改。典型實現:某些大型分布式系統3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當然前提是程序都在JVM中運行。當然,守護進程最高效、最完美的做法是使用C/C++來編寫,在各種平臺如Linux/Unix上都有豐富的API可以使用。個人建議,僅供參考。 回復 更多評論
@feenn非常感謝feenn 的方案 。這種方案非常成熟,有很多應用,大家也可以參考方案 回復 更多評論
Powered by: BlogJava Copyright © scorpio小蝎