设为首页 收藏本站
查看: 427|回复: 0

[经验分享] 关于Apache Common Daemon 守护进程

[复制链接]

尚未签到

发表于 2017-1-5 09:43:42 | 显示全部楼层 |阅读模式
  转自 http://www.douban.com/note/128672313/
  Java语言自1994年出现至今,初期是作为客户端与网页Applet形式来发展的,后来慢慢进化为服务器端开发语言。但是因为Java的可移植性,它必须运行在JVM上,且以进程方式运行,所以对Java程序生命周期的管理较为麻烦。尤其当Java程序需要以守护进程形式,长期在后台运行时,更是如此。
试想对一个Java程序,根据不同的时间阶段(如生命周期的不同阶段),使其执行不同功能(如init,start,stop,destroy等);或者在一个Java程序退出前,执行一段代码,完成某些功能;又或者监控一个Java程序,在其Crashed后,立即重启该程序等等。以上这些情况都是比较棘手的。第一种情况——根据不同的时间阶段执行不同功能,这点可以通过Java程序开启TCP、UDP端口来监听控制信息而实现;第二种情况——在程序退出前执行特定代码,这点可以通过加载钩子函数完成;第三种情况——监控程序Crashed并重启,这点则需要额外的监控程序来完成了。以上种种不管如何实现,都说明了Java程序在后台长期运行时的一些需求与困难。Apache Common Daemon项目即是为解决这些情况,保证Java程序在后台长期运行而产生的。它源自Tomcat 4.0项目。
Apache Common Daemon分为两个部分:一部分是用C写的,与操作系统交互;另一部分是用Java写的,提供Daemon接口。
http://img3.douban.com/view/note/large/public/p128672313-1.jpg
 

其使用方法也很简单:将Apache Common Daemon下载后,编译安装;将Java程序写成一个实现org.apache.commons.daemon.Daemon接口的类;执行./jsvc -cp commons-daemon.jar:my.jar MyClass即可。(其中./jsvc是在Apache Common Daemon编译安装后的目录下;commons-daemon.jar是Apche Common Daemon的Java部分;my.jar是Java程序打成的Jar包;MyClass是实现了org.apache.commons.daemon.Daemon接口的类。)如果不想实现org.apache.commons.daemon.Daemon接口,则可以另一种执行方式:将Apache Common Daemon下载后,编译安装;将Java程序写成一个类,该类包含4个方法(void init(String[] arguments)、void start()、void stop()、void destroy());执行./jsvc -cp commons-daemon.jar:my.jar MyClass即可。其实void init(String[] arguments)、void start()、void stop()、void destroy()这4个方法的签名在org.apache.commons.daemon.Daemon接口已有定义,只是init方法的参数有所不同,感兴趣的同学可以深入再看下-_-|||...
Apache Common Daemon的Java部分较为简单,就不详细说了,这一段说下C的部分。上一段说的./jsvc其实就是运行C部分。Apache Common Daemon的C部分分成3个进程运行:一个Launcher Process;、一个Controller Process、一个Controlled Process。
http://img3.douban.com/view/note/large/public/p128672313-2.jpg
 

其中Controlled Process就是Java运行的进程。如果该进程Crashed了,则Controller Process会在下一分钟重新启动一个Controlled Process运行。整个C部分的入口是jsvc-unix.c文件的main函数,这也是Launcher Process的启动入口。在jsvc-unix.c文件的1017行,通过fork()函数生成Controller Process,然后Launcher Process即结束运行(也可等待,这里不详细描述了)。Controller Process在run_controller函数中,通过fork()(jsvc-unix.c文件的1060行)函数生成Controlled Process。Controlled Process调用child函数来完成Java程序的运行(jsvc-unix.c文件的1065行)。在child函数中,Controlled Process分别调用java.c文件中的java_init()、java_start()、java_stop()、java_destroy()等方法,实现对Java程序的控制。以上四个方法的实现中,主要逻辑类似如下代码(这里以java_stop()为例):

method = (*env)->GetStaticMethodID(env, cls, stop, stopparams);
if (method == NULL) {
    log_error("Cannot found Daemon Loader \"stop\" entry point");
    return false;
}

ret = (*env)->CallStaticBooleanMethod(env, cls, method);

这里*env是JNIEnv类型的变量,具体我还没有细看-_-|||...
以上就是对Apache Common Daemon的一个大概了解。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324094-1-1.html 上篇帖子: Apache与Tomcat负载均衡基础篇 下篇帖子: Apache与Tomcat负载均衡续
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表