2011-12-27 5 views
2

Я создал небольшой (единственный поток) сервер и поместил «рабочий» -код в Runnable. Это работоспособный затем выполняются в фоновой-нити с помощью Javas палача Framework:Как закрыть ожидающий сервер?

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

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

What I have found что-то вроде этого:

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() -метод, сервер будет по-прежнему ждать, пока последнее соединение было выполнено, а затем выключено.

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

+0

Я отвечал на подобный вопрос для сокета кода, написанного на C/C++ и получил большой ответ. Я подозреваю, что вам нужно использовать неблокирующие сокеты для достижения аналогичного эффекта. Вы пытались просто закрыть сокет из другого потока и поймать исключение, созданное socket.accept? На самом деле я не уверен, что это сработает. http://stackoverflow.com/questions/2486335/wake-up-thread-blocked-on-accept-call – selbie

+2

Аналогичный вопрос: http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a -serversocket-accept-method - кажется, что вам нужно закрыть сокет. –

+0

[подобный вопрос] [1]: - Похоже, вам нужно закрыть сокет [1]: http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a- serversocket-accept-method –

ответ

1

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

Другой, может быть, понятнее способ заключается в использовании «отравленная пилюля», который подробно описан здесь: How to interrupt a BlockingQueue which is blocking on take()?