Я не смог воспроизвести ту же ошибку, что и у вас. В любом случае, когда я запускал ваш пример в одном потоке, я получаю NoRouteToHostException.
13:37:57.917 [main] DEBUG org.apache.http.impl.conn.BasicClientConnectionManager - Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@2c7ceffa
Iterations: 16329
java.net.NoRouteToHostException: Can't assign requested address (Address not available)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
at java.base/java.net.Socket.connect(Socket.java:591)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:605)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:440)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at com.demo.DemoApplication.main(DemoApplication.java:25)
Вы открываете соединения быстрее, чем требуется для закрытия соединения - закрытие сокета удерживается в состоянии TIME_WAIT до того, как они будут выпущены быть доступным для новых подключений.
Только для целей тестирования вы можете установить tcp_tw_reuse , чтобы разрешить повторное использование сокетов TIME_WAIT.
На моем OSX я мог изменить максимальное время жизни сегмента для тестирования и ошибки исчезнувший.
sudo sysctl -w net. inet .tcp.msl = 1000
net. inet .tcp.msl: 15000 -> 1000
DefaultHttpClient
поддерживается BasicClientConnectionManager
, которые создают и управляют одним соединением и поддерживают только одно активное соединение за раз для любого маршрута.
Когда соединение возвращается обратно в диспетчер соединений, оно остается активным для повторного использования и помечается как пригодное для повторного использования.
Если я кэширую DefaultHttpClient, ошибка не возникает.
Это именно решение. Я считаю правильным использовать один http-клиент и позволить менеджерам соединений выполнять свою работу.
Все управление подключениями объясняется в apache документации
4.2 .5 довольно старый (апрель 2013 г.). Если вы начинаете новый проект, имеет смысл обновить его до последней версии (4.5.12) на момент написания.
Ссылки:
https://cwiki.apache.org/confluence/display/HTTPCOMPONENTS/FrequentlyAskedConnectionManagementQuestions
https://raby.sh/osx-where-are-my-time_wait.html