Java 实现程序运行监控状态之我的思路(守护进程)
问题:写出这个工具的意义在于我运行一个需要长时间执行的程序,如单线程爬虫。在网络出现中断的或网站丢包情况下,程序会抛出socketexception 和sockettimeoutexception。程序会中断。(再此只是提出一种假设)
解决方案:
Java 并不能像C#一样对windows的进程进行监控(资料说这是跨平台原因)。因此没有api 提供对其他进程的监控(如果在此您有其他办法,希望您给出宝贵建议)。所以很多人都是通过对文件的加锁,来判断程序是否在运行。
一、判断当前程序是否正在运行
在此我参考了:
java 对文件的加锁。
http://www.examda.com/Java/jichu/20070411/140527453.html
(原文地址不知)
这里的思路是:
1、 在要监视写的程序中(这里假设为爬虫)对一个用来判断程序是否运行的文件(自定义,无实际意义。只是一个空文件)对文件进行加锁。
2、 在守护程序中写了简单的 循环来实现按时探测。这里面比如说20秒。
3、 如果程序确实在运行(即文件不能再被加锁,因为已被锁),那么证明程序确实在运行,否则,如果程序出现了网络异常而中断,那么runtime重新调用该程序。
(演示代码如下:注意不要忘了在爬虫程序中需要对文件进行加锁)。这样才有效。
演示代码:
bz提供的方案也挺好的,不过我觉得还可以这样搞: 1.JNI方式:典型的开源项目有:http://sourceforge.net/projects/jsysmonitor/ 2.以爬虫为例,守护程序与爬虫之间维持一个连接,使用某种具有连接属性的协议,如socket TCP。当连接异常断开则认为爬虫出错需要重启,好处是通过使用事件机制,可以实时监控爬虫。当然,前提是爬虫源代码可见,且可以修改。 典型实现:某些大型分布式系统 3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,当然前提是程序都在JVM中运行。 当然,守护进程最高效、最完美的做法是使用C/C++来编写,在各种平台如Linux/Unix上都有丰富的API可以使用。 个人建议,仅供参考。 回复 更多评论
posted on 2011-05-09 13:42 scorpio小蝎 阅读(12306) 评论(4) 编辑 收藏 所属分类: java
如果您有改进建议,或者更好方案,欢迎留言,再次表示感谢 回复 更多评论
If you’re still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you’ll know which is right for you. 回复 更多评论
bz提供的方案也挺好的,不过我觉得还可以这样搞:1.JNI方式:典型的开源项目有:http://sourceforge.net/projects/jsysmonitor/2.以爬虫为例,守护程序与爬虫之间维持一个连接,使用某种具有连接属性的协议,如socket TCP。当连接异常断开则认为爬虫出错需要重启,好处是通过使用事件机制,可以实时监控爬虫。当然,前提是爬虫源代码可见,且可以修改。典型实现:某些大型分布式系统3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,当然前提是程序都在JVM中运行。当然,守护进程最高效、最完美的做法是使用C/C++来编写,在各种平台如Linux/Unix上都有丰富的API可以使用。个人建议,仅供参考。 回复 更多评论
@feenn非常感谢feenn 的方案 。这种方案非常成熟,有很多应用,大家也可以参考方案 回复 更多评论
Powered by: BlogJava Copyright © scorpio小蝎