我正在将Java REST服务从“传统”方式转换为 - 作为servlet兼容的.war部署到多租户应用服务器(Tomcat) - 转换为更简单的嵌入式设置,其中有一个简单的启动嵌入式http服务器(Grizzly + Jersey)的Java主类。缺少的一个是服务包装器。我可以通过'java -jar myservice.jar'手动运行服务,但我想实现一个合适的Linux后台服务。
通常,这是通过放在/etc/init.d中的简单Bash shell脚本完成的。我已经看到了一些超级简单的例子,但它们通过进程kill而不是正常关闭来实现shutdown。我也看过一些商业工具来处理这个问题,但这个任务似乎太简单了,无法使用商业工具。
我的第一个猜测是在第二个端口上添加一个单独的超级简单REST服务,该服务侦听关闭请求并使/etc/init.d.Bash shell脚本以这种方式发送关闭请求。
这个问题是否有更好或更标准的解决方案?
答案 0 :(得分:2)
kill是正常的(如果它不是kill -9),你应该只实现shutdown hook来优雅地停止任务
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
//TODO stop web server and close db connection if needed
}
}));
答案 1 :(得分:1)
使用控制套接字是处理需要不仅仅是信号的Unix服务(例如数据库)的正常关闭的标准方法。他们中的许多人使用的是Unix域套接字,但是在这种情况下使用HTTP变得越来越普遍。您可以考虑另一个具有受控访问权限的HTTP URL(通过绑定到不同的套接字或通过编写逻辑来控制可以调用它的人)或Java RMI。两者都没有压倒性的优势。
请注意,无论你做什么,可能都不会是“REST”,并不是真的需要;你将要进行远程过程调用。
答案 2 :(得分:0)
这个问题是否有更好或更标准的解决方案?
如果您不想侦听HTTP调用或编写自己使用套接字的代码,则可以使用Apache commons-daemon。请在此处查看答案:How to convert a java program to daemon with jsvc?