如何关闭com.sun.net.httpserver.HttpServer?

时间:2009-05-29 21:21:37

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

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

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

4 个答案:

答案 0 :(得分:8)

我使用以下代码启动它

    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();

答案 1 :(得分:0)

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

似乎像com.sun.net.httpserver.HttpServer有一个名为HttpServerImpl的实现类。它有一个名为stop()的方法。

或许您可以在服务器套接字上找到线程侦听并调用interrupt()。

肖恩

答案 2 :(得分:0)

那么,如何不丢失参考?当你说你的代码崩溃时,我认为你在某处得到了一个例外。到底在哪里?因此,有能力拦截此异常的人显然也需要引用HttpServer,您可能需要自己传递。

修改:哦。在这种情况下,如果您不想使用其中的HttpServer终止整个JVM,那么您将需要向环境提供某种形式的IPC,例如通过RMI的命令通道,可以从Java程序(以及因此Ant)调用。

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

我会选择快速的RMI解决方案。

答案 3 :(得分:-1)

netstat -a

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

kill -9 $pid

杀死这个过程。