Java实现对程序运行状态的监控
2012-07-26 11:39
651 查看
问题:写出这个工具的意义在于我运行一个需要长时间执行的程序,如单线程爬虫。在网络出现中断的或网站丢包情况下, 程序会抛出socketexception 和sockettimeoutexception。程序会中断。 解决方案: Java 并不能像C#一样对windows的进程进行监控(资料说这是跨平台原因)。因此没有api 提供对其他进程的监控 (如果在此您有其他办法,希望您给出宝贵建议)。所以很多人都是通过对文件的加锁,来判断程序是否在运行。 一、判断当前程序是否正在运行 在此我参考了: java 对文件的加锁。 http://www.examda.com/Java/jichu/20070411/140527453.html | [align=center][/align] |
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(); } } }
相关文章推荐
- Java 实现程序运行状态监控 之我的思路(守护进程)
- 监控进程(二进制程序)运行状态的C语言实现与脚本实现
- C#实现软件监控外部程序运行状态的方法
- C#实现软件监控外部程序运行状态的方法
- spring通过annotation注解注册MBean到JMX实现监控java运行状态
- 使用JConsole监控java程序的运行状态总结
- spring通过annotation注解注册MBean到JMX实现监控java运行状态
- spring通过annotation注解注册MBean到JMX实现监控java运行状态
- java的内存管理,是靠GC即垃圾回收程序来实现的,GC其实也是一个程序,是怎么编译、运行的?
- Redhat+Weblogic 远程Jconsole监控java程序运行
- C#软件监控外部程序运行状态
- 使用JRockit Mission Control监控Java程序运行性能
- 实现Cacti监控nginx运行状态
- 我工作这几年(五)-- 在代码中加入一些关键统计信息来实时监控程序的运行状态
- 【Java程序运行超时后退出或进行其他操作的实现】
- 使用JRockit Mission Control监控Java程序运行性能
- 利用btrace在线监控java程序状态
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行
- JConsole分析JAVA程序运行状态
- 通过Annotation实现对程序的运行状态监听,简单实现