2009-05-29 42 views
5

嵌入在JDK 6中的Http服务器对开发Web服务有很大的帮助,但是我已经有了发布Endpoint然后代码崩溃并使服务器运行的情况。如何关闭com.sun.net.httpserver.HttpServer?

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

+0

什么操作系统? – skaffman 2009-06-16 09:01:00

+0

操作系统是Windows。 – 2009-06-16 13:57:10

回答

0

我从来没有使用过这台服务器,我找不到任何好的文档。也许这些不那么优雅的解决方案已经发生在你身上,但我只是想我会提及它们。

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

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

肖恩

+0

如果我有一个HttpServerImpl的句柄,我可以在它上面调用stop(),但是我有一个创建HttpServer的进程,并且希望在另一个进程上调用stop。 – 2009-05-30 15:56:48

+0

Err,它是直接在类上公共抽象void stop(...),所以问题在哪里?请参阅:http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi 2009-06-16 09:05:05

+0

我应该提供更多详情。我在一个JVM中发布端点,并且如果端点上的操作崩溃了,我需要在不同的JVM中关闭服务器。我需要调用服务器的管理端口,但我没有看到像嵌入式服务器的管理套接字。 – 2009-06-16 14:14:24

-1
netstat -a 

发现有打开的端口(假设你知道的端口)的进程的PID,以及

kill -9 $pid 

杀死进程。

0

如何不放弃参考,然后呢?当你说你的代码崩溃时,我假设你在某处发生异常。究竟在哪里?因此,能够拦截此异常的人显然还需要引用HttpServer,您可能必须传递自己。

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

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

我会用一个快速的RMI解决方案。

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