【问题标题】:Programmatic Jetty shutdown程序化 Jetty 关闭
【发布时间】:2011-04-19 15:53:52
【问题描述】:

如何以编程方式关闭嵌入式码头服务器?

我这样启动码头服务器:

Server server = new Server(8090);
...
server.start();
server.join();

现在,我想从一个请求中关闭它,例如http://127.0.0.1:8090/shutdown 我如何干净地做到这一点?

通常建议的解决方案是创建一个线程并从该线程调用 server.stop()。 但我可能需要调用 Thread.sleep() 以确保 servlet 已完成对关闭请求的处理。

【问题讨论】:

  • 具有讽刺意味的是,第一个谷歌结果是这个网站上回答你问题的问题:stackoverflow.com/questions/4650713/…
  • 它是如何开始的?请提供更多有关环境的信息,您会得到更好的答案
  • 讽刺的是,是的。但这不是一个干净的解决方案。使用此解决方案,我需要在调用 server.stop() 之前找到正确的睡眠时间。
  • 讽刺的是,this 问题现在是 ?q=programmatically+stop+jetty+server 的第一个谷歌搜索结果

标签: java jetty embedded-jetty


【解决方案1】:

我找到了一个非常干净整洁的方法here

神奇的代码sn-p是:-

        server.setStopTimeout(10000L);;
        try {
            new Thread() {
                @Override
                public void run() {
                    try {
                        context.stop();
                        server.stop();
                    } catch (Exception ex) {
                        System.out.println("Failed to stop Jetty");
                    }
                }
            }.start();

因为关闭是从一个单独的线程运行的,所以它不会自行跳闸。

【讨论】:

    【解决方案2】:

    试试server.setGracefulShutdown(stands_for_milliseconds);

    我认为它类似于thread.join(stands_for_milliseconds);

    【讨论】:

      【解决方案3】:

      不建议通过 HTTP 请求远程关闭 Jetty 服务器,因为它会带来潜在的安全威胁。在大多数情况下,通过 SSH 连接到托管服务器并在那里运行适当的命令来关闭 Jetty 服务器的相应实例就足够了。

      基本思想是启动一个单独的线程作为 Jetty 启动代码的一部分(因此无需像评论答案中提到的那样休眠),它将作为服务线程来处理关闭请求。在这个线程中,ServerSocket 可以绑定到 localhost 和指定端口,当收到预期的消息时,它会调用 server.stop()

      This 博客文章提供了使用上述方法的详细讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 2010-09-05
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 2016-08-07
        相关资源
        最近更新 更多