Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何关闭com.sun.net.httpserver.httpserver?_Java_Jdk1.6_Com.sun.net.httpserver - Fatal编程技术网

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

Java 如何关闭com.sun.net.httpserver.httpserver?,java,jdk1.6,com.sun.net.httpserver,Java,Jdk1.6,Com.sun.net.httpserver,JDK 6中嵌入的Http服务器对开发web服务有很大帮助,但我发布了一个端点,然后代码崩溃,服务器继续运行 一旦丢失了对嵌入式服务器(或已发布的端点)的引用,如何关闭该服务器?我以前从未使用过该服务器,并且找不到任何好的文档。也许你已经想到了这些不那么优雅的解决方案,但我只是想提一下 似乎com.sun.net.httpserver.httpserver有一个名为HttpServerImpl的实现类。它有一个名为stop()的方法 或者,您可以找到正在服务器套接字上侦听的线程并调用interr

JDK 6中嵌入的Http服务器对开发web服务有很大帮助,但我发布了一个端点,然后代码崩溃,服务器继续运行


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

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

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

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

肖恩

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


终止进程。

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

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

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


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

我使用下面的代码启动它

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

如果我有HttpServerImpl的句柄,我可以对其调用stop(),但我有一个进程创建HttpServer,并希望用另一个进程对其调用stop。呃,它是类上的公共抽象void stop(…),那么问题出在哪里?请看:我应该提供更多的细节。我在一个JVM中发布端点,如果端点上的操作崩溃,我需要在另一个JVM中关闭服务器。我需要调用服务器的管理端口,但我没有看到嵌入式服务器的管理套接字。我猜服务器在JVM中作为线程运行,所以你建议用重拳击倒整个JVM@Dean:我认为您正在寻找一种更干净的解决方案,它不需要重新启动JVM?它是示例客户端中发布端点并执行示例的main()方法。如果它崩溃了,我需要能够通过Ant关闭服务器。publish()和stop()将在不同的JVM中完成;httpThreadPool.shutdown();尝试{httpThreadPool.awaitTerminator(2,TimeUnit.HOURS)}捕获(异常e){…尖叫!…}
    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();