隨筆-22  評(píng)論-8  文章-0  trackbacks-0

            原文(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)行加鎖)。這樣才有效。

          演示代碼:





          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 {
              
          /**
              * 通過文件鎖來判斷程序是否正在運(yùn)行
              * 
          @return 如果正在運(yùn)行返回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操作系統(tǒng)
                          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(
          "程序正在運(yùn)行.");
                          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(
          "開始執(zhí)行程序!");
                      
                          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();
                  }

              }

          }




          如果您有更好解決方案,希望您聯(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)論   

          posted on 2011-05-30 10:34 Hukin 閱讀(464) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青海省| 宁夏| 永寿县| 建阳市| 建瓯市| 屏南县| 盐池县| 墨玉县| 五莲县| 开江县| 合作市| 汉中市| 左权县| 昔阳县| 鸡西市| 绥棱县| 大兴区| 昌平区| 酒泉市| 呈贡县| 昌乐县| 江山市| 徐州市| 洛川县| 安庆市| 灵石县| 罗江县| 佳木斯市| 重庆市| 莲花县| 曲靖市| 土默特右旗| 晋州市| 恩施市| 永登县| 静海县| 广德县| 青岛市| 来凤县| 罗定市| 平昌县|