【问题标题】:How to shutdown com.sun.net.httpserver.HttpServer?如何关闭 com.sun.net.httpserver.HttpServer?
【发布时间】:2009-05-29 21:21:37
【问题描述】:

嵌入在 JDK 6 中的 Http Server 对开发 Web 服务有很大帮助,但是我遇到了一种情况,我发布了一个 Endpoint,然后代码崩溃并让服务器继续运行。

一旦丢失对嵌入式服务器的引用(或已发布的端点),如何关闭嵌入式服务器?

【问题讨论】:

    标签: java jdk1.6 com.sun.net.httpserver


    【解决方案1】:

    我使用下面的代码来启动它

        this.httpServer = HttpServer.create(addr, 0);
        HttpContext context = this.httpServer.createContext("/", new DocumentProcessHandler());
        this.httpThreadPool = Executors.newFixedThreadPool(this.noOfThreads);
        this.httpServer.setExecutor(this.httpThreadPool);
        this.httpServer.start();
    

    下面的代码来阻止它

            this.httpServer.stop(1);
            this.httpThreadPool.shutdownNow();
    

    【讨论】:

    • 要正常关闭,请执行以下操作:httpServer.stop(0); httpThreadPool.shutdown();尝试 { httpThreadPool.awaitTerminator(2, TimeUnit.HOURS); } catch (Exception e) {...shrieeeeek!...}
    【解决方案2】:

    我以前从未使用过此服务器,也找不到任何好的文档。也许您已经想到了这些不太优雅的解决方案,但我只是想我会提到它们。

    好像 com.sun.net.httpserver.HttpServer 有一个实现类,叫做 HttpServerImpl。它有一个叫做 stop() 的方法。

    或者你可以找到监听服务器套接字的线程并调用interrupt()。

    肖恩

    【讨论】:

    • 如果我有 HttpServerImpl 的句柄,我可以在它上面调用 stop(),但是我有一个进程正在创建 HttpServer,并且想用另一个进程在它上面调用 stop。
    • Err,直接在类上是public abstract void stop(...),那么问题出在哪里呢?见:java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/…
    • 我应该提供更多细节。我在一个 JVM 中发布一个端点,如果端点上的操作崩溃,我需要关闭另一个 JVM 中的服务器。我需要调用服务器的管理端口,但我没有看到嵌入式服务器的管理套接字之类的东西。
    【解决方案3】:

    那么,不丢失参考怎么样?当你说你的代码崩溃时,我假设你在某个地方遇到了异常。具体在哪里?因此,能够拦截此异常的人显然还需要对 HttpServer 的引用,您可能必须自己传递。

    编辑:哦。在这种情况下,如果您不想杀死包含 HttpServer 的整个 JVM,那么您将需要为环境提供某种形式的 IPC,例如通过 RMI 的命令通道,可以从 Java 程序(以及 Ant)中调用。

    另一种解决方案是让服务器侦听一些“秘密”cookie 查询,例如,在启动时打印/保存 cookie,以便 Ant 脚本可以检索 cookie,并且您可以向您的“秘密” URL 发起查询,服务器将在该 URL 上优雅地退出。

    我会采用快速 RMI 解决方案。

    【讨论】:

    • 这是发布端点并执行示例的示例客户端中的 main() 方法。如果它崩溃了,我需要能够通过 Ant 关闭服务器。 publish() 和 stop() 将在不同的 JVM 中完成。
    【解决方案4】:
    netstat -a
    

    查找打开端口的进程的 pid(假设您知道端口),并且

    kill -9 $pid
    

    杀死进程。

    【讨论】:

    • 我猜服务器是作为 JVM 中的线程运行的,所以您建议严厉打击整个 JVM。 @Dean:我认为您正在寻找一种不需要重新启动 JVM 的更清洁的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多