Search code examples
javaapache-httpcomponents

Proper way to shutdown Apache httpcomponents blocking HTTP server


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.


Solution

  • 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.