У меня есть приложение с Apache HttpComponents 4.4.1 синхронный сервер, который выполняет несколько HTTP-сервисов, для каждого из них я запускаю HTTP-сервер на другом порту. Когда пользователь решает остановить службу, я выключаю HTTP-сервер работает на этом порту с этим кодом:Правильный способ отключения Apache httpcomponents, блокирующий 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 и тому сервер без проблем запускает запросы процесса.
Не могли бы вы собрать тестовый пример, воспроизводящий проблему, и поднять JIRA по адресу https://issues.apache.org/jira/? – oleg