如何关闭dropwizard应用程序?

时间:2014-09-12 16:30:05

标签: java dropwizard microservices

我正在尝试使用dropwizard来提供微服务。 该文档说明了如何启动应用程序,但没有说明优雅地终止它。例如,apache tomcat有启动关闭脚本。

除了按Ctrl+C的{​​{1}}之外,是否有人知道如何终止dropwizard应用程序?

6 个答案:

答案 0 :(得分:10)

Dropwizard Jetty有关闭钩子。所以kill -SIGINT <pid>效果非常好。

答案 1 :(得分:6)

受到普拉文纳格答案的启发,我挖掘了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)

我猜你可以用其他语言做同样的事情。

答案 2 :(得分:2)

我假设这不是您的开发环境的问题,而是您的部署。答案取决于您的部署策略。在过去,我们已经处理了部署,其中将drop wizard应用程序捆绑为可以启动的Java进程,并且正在记录pid并强制终止该进程。或者将java进程捆绑在upstart / init脚本中,以便正常启动和关闭系统。

另一方面,当你启动一个dropwizard应用程序时,它最终做的是启动一个jetty服务器。 http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command。这可以说明在启动dropwizard应用程序时如何将停止端口作为参数传递。

答案 3 :(得分:2)

这里的其他答案都很棒,但是如果你想进一步向上堆栈并轻松添加自定义日志记录/安全性/任意复杂的关闭逻辑,那么通过dropwizard admin 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

答案 4 :(得分:1)

通过编程,您还可以执行以下操作:

environment.getApplicationContext().getServer().stop();

这就是environment中的Application

@Override
public void run(ApplicationConfiguration configuration, Environment environment) throws Exception { ... }

答案 5 :(得分:-4)

在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"));
    }
});

制定自己的策略,如何关闭应用。