Как отключить com.sun.net.httpserver.HttpServer? - PullRequest
4 голосов
/ 30 мая 2009

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

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

Ответы [ 4 ]

8 голосов
/ 27 мая 2010

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

    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();
0 голосов
/ 30 мая 2009
netstat -a

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

kill -9 $pid

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

0 голосов
/ 16 июня 2009

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

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

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

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

0 голосов
/ 30 мая 2009

Я никогда раньше не пользовался этим сервером и не могу найти хорошую документацию. Возможно, вам уже приходили в голову эти менее изящные решения, но я просто подумал, что упомяну их.

Похоже, com.sun.net.httpserver.HttpServer имеет класс реализации с именем HttpServerImpl. У него есть метод stop ().

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

Sean

...