Java 實現程序運行狀態監控 之我的思路(守護進程)

           

          Java 實現程序運行監控狀態之我的思路(守護進程)

          問題:寫出這個工具的意義在于我運行一個需要長時間執行的程序,如單線程爬蟲。在網絡出現中斷的或網站丟包情況下,程序會拋出socketexception sockettimeoutexception程序會中斷。(再此只是提出一種假設)

          解決方案:

          Java 并不能像C#一樣對windows的進程進行監控(資料說這是跨平臺原因)。因此沒有api 提供對其他進程的監控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過對文件的加鎖,來判斷程序是否在運行。

          一、判斷當前程序是否正在運行

          在此我參考了:

          java 對文件的加鎖。

          http://www.examda.com/Java/jichu/20070411/140527453.html

          (原文地址不知)

          這里的思路是:

          1、 在要監視寫的程序中(這里假設為爬蟲)對一個用來判斷程序是否運行的文件(自定義,無實際意義。只是一個空文件)對文件進行加鎖。

          2、 在守護程序中寫了簡單的 循環來實現按時探測。這里面比如說20秒。

          3、  如果程序確實在運行(即文件不能再被加鎖,因為已被鎖),那么證明程序確實在運行,否則,如果程序出現了網絡異常而中斷,那么runtime重新調用該程序。

          (演示代碼如下:注意不要忘了在爬蟲程序中需要對文件進行加鎖)。這樣才有效。

          演示代碼:





          import java.io.File;
          import java.io.FileNotFoundException;
          import java.io.IOException;
          import java.io.RandomAccessFile;
          import java.nio.channels.FileChannel;
          import java.nio.channels.FileLock;

          import data.BaseDataofConfiguration;

          public class ThreadKeepTools {
              
          /**
              * 通過文件鎖來判斷程序是否正在運行
              * 
          @return 如果正在運行返回true,否則返回false
              
          */

              
          private static boolean isRunning(String fileLockPath)
              
          {
                  
          boolean rv=false;
                  
          try {
                      
          //
                      String os_name=System.getProperty("os.name");
                      
          //指定文件鎖路徑
                      String path=null;
                      
          if(os_name.indexOf("Windows")>-1)
                      
          {
                          
          //如果是Windows操作系統
                          path=System.getProperty("user.home")+System.getProperty("file.separator");
                      }

                      
          else
                      
          {
                          path
          ="/usr/temp/";
                      }

                      File dir
          =new File(path);
                      
          if(!dir.exists())
                      
          {
                          dir.mkdirs();
                      }

                      
          //程序名稱
                      String applicationName="run.bat";
                      RandomAccessFile fis 
          = new RandomAccessFile(fileLockPath,"rw");
                      FileChannel lockfc 
          = fis.getChannel();
                      FileLock flock 
          = lockfc.tryLock();
                      
          if(flock == null{
                          System.out.println(
          "程序正在運行.");
                          rv
          =true;
                          
                      }
          else {
                          flock.release();
                      }

                      
                   
                  }
           catch (FileNotFoundException e1) {
                      e1.printStackTrace();
                  }

                  
          catch (IOException e) {
                      e.printStackTrace();
                  }

                  
          return rv;
              }

              
              
          public static void ExcuteThread() throws InterruptedException{
                  String strFilePath
          =BaseDataofConfiguration.baseUrlOfPro+"testThread.txt";
                  String strBatPath
          =BaseDataofConfiguration.baseUrlOfPro+"run.bat";
                  strBatPath
          =strBatPath.replaceFirst("/""");
                  
          while(true){
                      System.out.println(
          "strFilePath:"+strFilePath);
                  
          boolean RunOrNOT=isRunning(strFilePath);
                  System.out.println(
          "RunOrNot:"+RunOrNOT);
                  
                  
          if(!RunOrNOT){
                      
          try {
                          System.out.println(
          "開始執行程序!");
                      
                          Runtime.getRuntime().exec(
          "cmd /k start "+strBatPath);
                          System.out.println(
          "strbatpath:"+strBatPath);
                      }
           catch (IOException e) {
                          
          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
           
                      
                  }
          else {
                      Thread.sleep(
          6000);
                  }

                  Thread.sleep(
          10000);
                  
                  }

              }

              
          public static void main(String[] args) {
                  
          try {
                      ExcuteThread();
                  }
           catch (InterruptedException e) {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }

              }

          }




          如果您有更好解決方案,希望您聯系我。 歡迎留言,提供您寶貴的意見。代碼不規范,僅供參考。

          # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:36 feenn

          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小蝎 閱讀(12320) 評論(4)  編輯  收藏 所屬分類: java

          評論

          # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:11 scorpio小蝎

          如果您有改進建議,或者更好方案,歡迎留言,再次表示感謝  回復  更多評論   

          #  kjdwbt.keb kh 2011-05-09 15:16 christian louboutin

          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.
            回復  更多評論   

          # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:36 feenn

          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可以使用。
          個人建議,僅供參考。  回復  更多評論   

          # re: Java 實現程序運行狀態監控 之我的思路(守護進程) 2011-05-09 15:43 scorpio小蝎小蝎

          @feenn
          非常感謝feenn 的方案 。這種方案非常成熟,有很多應用,大家也可以參考方案  回復  更多評論   

          <2011年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贡觉县| 清苑县| 安新县| 微山县| 泸水县| 孙吴县| 名山县| 龙陵县| 济南市| 石泉县| 怀远县| 阆中市| 调兵山市| 织金县| 饶河县| 涞源县| 湖口县| 天等县| 西青区| 石嘴山市| 淮安市| 长海县| 离岛区| 武安市| 邯郸市| 轮台县| 柳州市| 黄平县| 万安县| 屏东县| 遵义市| 德保县| 封丘县| 新平| 渝北区| 阿克| 闽清县| 林周县| 金平| 铁力市| 夏邑县|