У меня есть приложение с синхронным сервером Apache HttpComponents 4.4.1, которое запускает несколько HTTP-сервисов, для каждого из них я запускаю HTTP-сервер на другом порту. Когда пользователь решает остановить службу, я отключаю HTTP-сервер, работающий на этом порту, с помощью этого кода:
org.apache.http.impl.bootstrap.HttpServer server;
....
public void stopServer(){
server.shutdown(42, TimeUnit.MICROSECONDS);
}
У меня следующая проблема в Linux: Если открыты соединения Keep-alive (нет обработки запросов), эти сокеты не закрываются. Только ServerSocket закрыт:
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
При попытке снова запустить HTTP-сервер на том же порту выдается исключение BindingException:
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)
В Windows поведение такое же, однако BindingException отсутствует, и сервер без проблем запускает обработку запросов.