TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
问题:写出这个工具的意义在于我运行一个需要长时间执行的程序,如单线程爬虫。在网络出现中断的或网站丢包情况下,
程序会抛出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();
- }
- }
- }
复制代码
|
|