Как отключить com.sun.net.httpserver.HttpServer?

Http-сервер, встроенный в JDK 6, очень помогает при разработке веб-сервисов, но у меня возникла ситуация, когда я опубликовал Endpoint, а затем код дал сбой и оставил сервер работающим.

Как отключить встроенный сервер, если вы потеряли ссылку на него (или опубликованную конечную точку)?

4 ответа

Я использую приведенный ниже код, чтобы запустить его

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

Или, возможно, вы можете найти поток, прослушивающий сокет сервера, и вызвать прерывание ().

Шон

Как насчет того, чтобы не потерять ссылку? Когда вы говорите, что ваш код дает сбой, я предполагаю, что вы где-то получили исключение. Где именно? Таким образом, кто-то, способный перехватить это исключение, очевидно, должен также иметь ссылку на HttpServer, который вам, возможно, придется передать вокруг себя.

Редактировать: Ох. В этом случае, если вы не хотите уничтожать всю JVM с помощью HttpServer, вам нужно будет предложить некоторую форму IPC для среды, например, командный канал через RMI, который может быть вызван из Java-программы (и отсюда и муравей).

Другое решение состоит в том, чтобы сервер прослушивал какой-то "секретный" запрос cookie, где вы, например, печатаете / сохраняете cookie при запуске, чтобы скрипт Ant мог получить cookie, и вы могли запустить запрос на ваш "секретный" URL. после чего сервер выйдет сам изящно.

Я бы пошел с быстрым решением RMI.

netstat -a

чтобы найти pid процесса, у которого открыт порт (при условии, что вы знаете порт), и

kill -9 $pid

убить процесс.

Другие вопросы по тегам