当前位置:编程学习 > JAVA >>

Java 实现程序运行监控状态之我的思路(守护进程)

问题:写出这个工具的意义在于我运行一个需要长时间执行的程序,如单线程爬虫。在网络出现中断的或网站丢包情况下,程序会抛出socketexception 和sockettimeoutexception。程序会中断。(再此只是提出一种假设)

解决方案:

Java 并不能像C#一样对windows的进程进行监控(资料说这是跨平台原因)。因此没有api 提供对其他进程的监控(如果在此您有其他办法,希望您给出宝贵建议)。所以很多人都是通过对文件的加锁,来判断程序是否在运行。

一、判断当前程序是否正在运行

在此我参考了:

java 对文件的加锁。

html">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 (Interru

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,