如何编写Java守护进程

时间:2011-10-18 21:54:27

标签: java linux daemon

这将是一个网络应用程序,它将始终(或尽可能地管理)在给定端口上进行侦听。

我对Java很新,对非Web服务器端编程也很陌生,所以我想从社区获得有关我的假设和初步计划的反馈。

我已经阅读过有关jsvc(http://commons.apache.org/daemon/jsvc.html)的信息,目前我正在假设这是在java中为一个linux盒子编写一个守护进程的“最佳”方法(可能是运行的centOS)。

可以将nagios配置为监视我的守护程序是否正在运行,并在不执行时提醒我或系统管理员吗? (我假设是的,但我不是一个非常有才华的系统管理员类型)

这将是一个SMPP客户端应用程序(或我猜的ESME应用程序),这就是为什么我选择Java,因为它似乎是一个非常成熟的SMPP平台。但是,我知道在C / C ++中编写一个守护进程更“传统”。使用现代Java,执行相当简单的任务,我是否会遇到任何重大缺点?

管理新版本部署的最佳方法是什么?只需停止守护进程并尽快更换二进制文件并重新启动?

非常感谢任何其他输入。

2 个答案:

答案 0 :(得分:20)

  

如何编写具有24/7正常运行时间的Java守护程序......

我们在Linux服务器上运行了许多24/365应用程序,只需调用Java,如下所示:不需要任何C包装器:

nohup java -D... -X... -jar something.jar ... < /dev/null > output.log 2>&1 &

这将使jar在后台运行(nohup ... &)而没有输入(< /dev/null),输出(stdout和stderr)重定向到日志文件(> output.log 2>&1)。我们已经分布了日志记录基础结构,但仍然需要一些控制台输出(例如线程转储)。这些应用程序可以运行几个月,直到我们升级它们。

  

可以将nagios配置为监视我的守护程序是否正在运行,并在不执行时提醒我或系统管理员吗?

在监控方面,您可以做很多事情。 Nagios看起来有JMX plugin来测试jconsole显示的信息。那里还有许多原生JMX日志记录和监视实用程序。我们有内部绿色/黄色/红色指示灯,可以使用JMX上拉并轻松检查。我还从每个应用程序中导出simple JMX/HTTP service以提供状态信息,以便第三方监控工具轻松检测故障。

  

这将是一个SMPP客户端应用程序(或我猜的ESME应用程序),这就是为什么我选择Java,因为它似乎是一个非常成熟的SMPP平台。

我认为你的意思是SMPP?如果是这样,那么我认为Java没有理由不能做好。我们的应用程序实时执行各种HTTP,UDP,SMTP,JDBC,LDAP和其他协议。我们在批次中使用Jgroups来完成Java中完整的经过身份验证的加密网络堆栈。

  

管理新版本部署的最佳方法是什么?只需停止守护进程并尽快更换二进制文件并重新启动?

在动态替换正在运行的二进制文件方面,它更复杂。我们预先VIPs并在闲暇时更换二进制文件。我们的内部协议旨在实现故障转移。如果你没有VIP,那么要考虑的一件事就是有序的交接。你启动新的jar,当它准备好绑定到新端口时,它会与运行旧jar的应用程序进行通信。然后旧的应用程序解除绑定,然后新的应用程序立即绑定。这样的事情。

希望这有帮助。

答案 1 :(得分:7)

如果您真的想在* nix上不停地运行某些内容,我建议您查看daemontools

有一些关于如何执行此操作的示例herehere

基本上,svscan会生成一个从init监视你的java进程的进程,每次崩溃都会重新启动它。