Как отключить 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
убить процесс.