Javaはプログラムの運行状態の監視を実現する


質問:このツールを書く意味は、単一スレッド爬虫類のような長時間実行するプログラムを実行することです.ネットワークが中断されたり、Webサイトがパケットを失ったりした場合、プログラムは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 {
                       
            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();
        }
    }
}