Как выключить ожидающий сервер? - PullRequest
2 голосов
/ 28 декабря 2011

Я создал маленький (однопоточный) сервер и поместил код "работы" в Runnable. Этот исполняемый файл затем выполняется в фоновом потоке с использованием Javas Executor Framework:

ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(runnable);

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

То, что я нашел , выглядит примерно так:

class LifecycleWebServer {
    private final ExecutorService exec = ...;

    public void start() throws IOException {
        ServerSocket socket = new ServerSocket(80);
        while (!exec.isShutdown()) {
            final Socket conn = socket.accept();
            // Do stuff with the connection...
        }
    }

    public void stop() { exec.shutdown(); }
}

Меня беспокоит то, что, если программа достигла строки 7 (socket.accept()) и я вызываю stop() -метод, Сервер все равно будет ждать, пока будет установлено одно последнее соединение, а затем завершит работу. 1014 *

Есть ли какой-нибудь предпочтительный способ справиться с этим?

1 Ответ

1 голос
/ 07 января 2012

Итак, кажется, что вызов close() в ожидании ServerSocket является одним из способов сделать это. В этом случае accept() -метод выдаст SocketException, который вам нужно поймать.

Другой, возможно, более понятный способ - использовать «Ядовитую пилюлю», которая подробно объясняется здесь: Как прервать BlockingQueue, блокирующую при take ()?

...