4

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

那么有谁知道除了按Ctrl+Cof之外如何终止 dropwizard 应用程序kill

4

6 回答 6

10

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

于 2014-10-06T07:09:01.813 回答
6

受到 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)

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

于 2014-10-15T08:30:08.127 回答
4

这里的其他答案很好,但是如果您想更深入地了解堆栈并轻松添加自定义日志记录/安全性/任意复杂的关闭逻辑,那么通过 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
于 2017-04-18T04:49:21.357 回答
2

我假设这不是您的开发环境的问题,而是您的部署问题。答案取决于您的部署策略。在过去,我们处理过部署,其中将放置向导应用程序捆绑为一个可以启动的 java 进程,并记录 pid 并强制终止该进程。或者将 java 进程捆绑在 upstart/init 脚本中,以优雅地启动和关闭系统。

另一方面,当您启动一个 dropwizard 应用程序时,它最终会启动一个码头服务器。http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command。这可能有助于了解如何在启动 dropwizard 应用程序时将停止端口作为参数传递。

于 2014-09-18T23:23:37.123 回答
1

以编程方式,您还可以执行以下操作:

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

这就是environment你得到的Application

@Override
public void run(ApplicationConfiguration configuration, Environment environment) throws Exception { ... }
于 2020-03-26T13:09:00.127 回答
-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"));
    }
});

建立你自己的策略,如何关闭你的应用程序。

于 2014-10-09T07:42:06.803 回答