嵌入在 JDK 6 中的 Http Server 对开发 Web 服务有很大帮助,但是我遇到了一种情况,即我发布了一个 Endpoint,然后代码崩溃并让服务器继续运行。
一旦失去对嵌入式服务器的引用(或已发布的端点),如何关闭嵌入式服务器?
嵌入在 JDK 6 中的 Http Server 对开发 Web 服务有很大帮助,但是我遇到了一种情况,即我发布了一个 Endpoint,然后代码崩溃并让服务器继续运行。
一旦失去对嵌入式服务器的引用(或已发布的端点),如何关闭嵌入式服务器?
我使用下面的代码来启动它
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();
我以前从未使用过此服务器,也找不到任何好的文档。也许您已经想到了这些不太优雅的解决方案,但我只是想我会提到它们。
似乎 com.sun.net.httpserver.HttpServer 有一个名为 HttpServerImpl 的实现类。它有一个名为 stop() 的方法。
或者你可以在服务器套接字上找到正在监听的线程并调用interrupt()。
肖恩
那么,不丢失参考怎么样?当你说你的代码崩溃时,我假设你在某个地方遇到了异常。具体在哪里?因此,能够拦截此异常的人显然还需要对 HttpServer 的引用,您可能必须自己传递它。
编辑:哦。在这种情况下,如果您不想杀死包含 HttpServer 的整个 JVM,那么您将需要为环境提供某种形式的 IPC,例如可以从 Java 程序调用的通过 RMI 的命令通道(以及因此蚂蚁)。
另一种解决方案是让服务器侦听一些“秘密”cookie 查询,例如在启动时打印/保存 cookie,以便 Ant 脚本可以检索 cookie,并且您可以触发对“秘密”URL 的查询服务器将在其上优雅地退出。
我会选择一个快速的 RMI 解决方案。
netstat -a
查找打开端口的进程的 pid(假设您知道端口),以及
kill -9 $pid
杀死进程。