I have application with Apache HttpComponents 4.4.1 synchronous server, which runs several HTTP "services", for each of them I start HTTP server on different port. When the user decides to stop the service, I shut down HTTP server running on this port with this code:
org.apache.http.impl.bootstrap.HttpServer server;
....
public void stopServer(){
server.shutdown(42, TimeUnit.MICROSECONDS);
}
I have the following problem on Linux: If there are Keep-alive connections opened (there is no request processing), these sockets are not closed. Only ServerSocket is closed:
netstat -aon | grep 58276
TCP 127.0.0.1:50658 127.0.0.1:58276 ESTABLISHED 18012
TCP 127.0.0.1:58276 127.0.0.1:50658 ESTABLISHED 18012
In attempt to start again HTTP server on the same port a BindingException is thrown:
Caused by: java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:521)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:414)
at java.net.ServerSocket.bind(ServerSocket.java:326)
at java.net.ServerSocket.<init>(ServerSocket.java:192)
at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:170)
at org.apache.http.impl.bootstrap.HttpServer.start(HttpServer.java:116)
On Windows the behavior is the same , however there is no BindingException and the server starts process requests without any problems.
Turns out to be a bug: https://issues.apache.org/jira/browse/HTTPCORE-420 oleg has already proposed a fix. I will update this when it is released officially.