我试图用dropwizard提出一个微服务。该文档说明了如何启动应用程序,但没有说明优雅地终止它。例如,apache tomcat有启动和关闭脚本。
那么有谁知道如何终止dropwizard应用程序,而不是按Ctrl+C
的kill
?
Dropwizard Jetty有关闭钩子。所以kill -SIGINT <pid>
工作得非常好。
受到praveenag答案的启发,我挖掘了Jetty的代码。
如果您启动DropWizard提供:
-DSTOP.PORT=xxxx -DSTOP.KEY=my_secret_key
作为Java选项,
它告诉Jetty在该端口上侦听停止请求。
然后,您可以写入该套接字以告知Jetty关闭。我是这样做的R:
socket = make.socket("localhost", 8082)
write.socket(socket, "my_secret_key\r\n")
write.socket(socket, "stop\r\n")
close.socket(socket)
我猜你可以用任何其他语言做同样的事情。
我假设这不是您的开发环境的问题,而是您的部署。答案取决于您的部署策略。在过去,我们已经处理了部署,其中将drop wizard应用程序捆绑为可以启动的Java进程,并且正在记录pid并强制终止该进程。或者在upstart / init脚本中捆绑java进程以正常启动和关闭系统。
另一方面,当你启动一个dropwizard应用程序时,它最终做的是启动一个jetty服务器。 http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command。这可以说明当你启动dropwizard应用程序时如何将停止端口作为参数传递。
这里的其他答案都很棒,但是如果你想进一步向上堆栈并轻松添加自定义日志记录/安全性/任意复杂的关闭逻辑,那么通过dropwizard管理Task添加一个关闭钩子是一个很好的模式。
使用您喜欢的任何逻辑创建关闭任务
import io.dropwizard.servlets.tasks.Task;
public class ShutdownTask extends Task {
public ShutdownTask() {
super("shutdown"); // the task name, used in the endpoint to execute it
}
public void execute(
ImmutableMultimap<String, String> immutableMultimap,
PrintWriter printWriter
) throws Exception {
// kill the process asynchronously with some nominal delay
// to allow the task http response to be sent
new Timer().schedule(new TimerTask() {
public void run() {
// any custom logging / logic here prior to shutdown
System.exit(0);
}
}, 5000);
}
}
在Application.run()
注册任务
environment.admin().addTask(new ShutdownTask());
然后通过POST将其执行到管理端口上的以下端点
http://localhost:<ADMIN PORT>/tasks/shutdown
在Java中:
// In case vm shutdown
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run()
{
// what should be closed if forced shudown
// ....
LOG.info(String.format("--- End of ShutDownHook (%s) ---", "APPLICATION_NAME"));
}
});
制定自己的战略,如何关闭您的应用程序。