Reputation: 25755
I created a little (single thread) server and put the "work"-code in a Runnable
. This runnable is then executed in a background-thread using Javas Executor Framework:
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(runnable);
So now, I'm searching for a good way to shut this server down. I want to add the possibility to restart the Server without restarting the program, so terminating the whole process is not an option.
What I have found is something like this:
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(); }
}
The thing that bothers me is, that if the program has reached line 7 (socket.accept()
), and I call the stop()
-method, the Server will still wait until one last connection was made and then shutdown.
Is there any preferred way to deal with this?
Upvotes: 3
Views: 3819
Reputation: 25755
So, it seams that calling close()
on the waiting ServerSocket
is one way to do this. In that case, the accept()
-method will throw a SocketException
, which you'll need to catch.
Another, maybe clearer way is to use a "Poison Pill", which is explained in detail here: How to interrupt a BlockingQueue which is blocking on take()?
Upvotes: 1