Программное отключение Jetty

Как программно отключить встроенный сервер причала?

Я запускаю сервер Jetty следующим образом:

Server server = new Server(8090);
...
server.start();
server.join();

Теперь я хочу отключить его по запросу, например http://127.0.0.1:8090/shutdown Как мне сделать это чисто?

Обычно предлагаемое решение состоит в том, чтобы создать поток и вызвать server.stop() из этого потока. Но мне, возможно, нужен вызов Thread.sleep(), чтобы убедиться, что сервлет завершил обработку запроса на отключение.


person Anton Kazennikov    schedule 19.04.2011    source источник
comment
Как иронично, что первым результатом Google является вопрос на этом сайте, который отвечает на ваш вопрос: -be-stopped" title="остановка причала программно приводит к тому, что 1 поток не может быть остановлен"> stackoverflow.com/questions/4650713/   -  person Jeff Swensen    schedule 19.04.2011
comment
Как это запускается? Пожалуйста, предоставьте немного больше информации об окружающей среде, и вы получите более точные ответы.   -  person Kennet    schedule 19.04.2011
comment
Иронично, да. Но это не чистое решение. Используя это решение, мне нужно найти правильное время ожидания перед вызовом server.stop().   -  person Anton Kazennikov    schedule 19.04.2011
comment
Какая ирония в том, что этот вопрос теперь является первым результатом поиска Google для ?q=programmatically+stop+jetty+server   -  person Dexygen    schedule 11.06.2013


Ответы (3)


Я нашел очень чистый и аккуратный метод здесь

Фрагмент волшебного кода: -

        server.setStopTimeout(10000L);;
        try {
            new Thread() {
                @Override
                public void run() {
                    try {
                        context.stop();
                        server.stop();
                    } catch (Exception ex) {
                        System.out.println("Failed to stop Jetty");
                    }
                }
            }.start();

Поскольку отключение выполняется из отдельного потока, оно не спотыкается о себя.

person James Anderson    schedule 05.09.2013

Попробуйте server.setGracefulShutdown(stands_for_milliseconds);.

Я думаю, что это похоже на thread.join(stands_for_milliseconds);.

person Sven    schedule 16.06.2011

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

Основная идея состоит в том, чтобы запустить отдельный поток как часть кода запуска Jetty (так что нет необходимости спать, как требуется в одном из ответов, упомянутых в комментариях), который будет служить служебным потоком для обработки запросов на завершение работы. В этом потоке ServerSocket может быть привязан к локальному хосту и указанному порту, и когда будет получено ожидаемое сообщение, он вызовет server.stop().

Этот пост в блоге содержит подробное обсуждение с использованием описанного выше подхода.

person 01es    schedule 14.03.2012