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();
}
}
}
本文介绍了一种使用Java实现的守护进程方法,通过文件锁监测主程序的状态,在遇到网络异常导致程序中断时,能够自动重启程序,确保长时间运行任务的连续性。
1998

被折叠的 条评论
为什么被折叠?



