JDK 6中嵌入的Http Server对于开发Web服务是一个很大的帮助,但我遇到的情况是我发布了一个Endpoint,然后代码崩溃并使服务器继续运行。
如果您丢失对它的引用(或已发布的端点),如何关闭嵌入式服务器?
答案 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
杀死这个过程。