【问题标题】:How to shutdown dropwizard application?如何关闭 dropwizard 应用程序?
【发布时间】:2014-11-06 21:36:09
【问题描述】:

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

除了按Ctrl+Ckill 之外,有谁知道如何终止dropwizard 应用程序?

【问题讨论】:

  • ^c 有什么问题?
  • @BoristheSpider AFAIK,如果我这样做^C,则不能保证码头服务器在处理完所有接受的请求后终止。或者是吗?如果是这样,您能否指点我相应的文档?

标签: java dropwizard microservices


【解决方案1】:

Dropwizard Jetty 具有关闭挂钩。所以kill -SIGINT <pid> 效果很好。

【讨论】:

  • 注明。这可以合并到我的下拉向导服务的“init.d”脚本中
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        以编程方式,您也可以这样做:

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

        这是您在Application 中获得的environment

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

        【讨论】:

        • environment.getApplicationContext().getServer() 返回 null
        • @ArtemYakovlev 我不确定,但也许你调用它太早了,所以服务器还没有准备好/可用?
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-15
          相关资源
          最近更新 更多