powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Jersey http client: не закрываются соединения
5 сообщений из 5, страница 1 из 1
Jersey http client: не закрываются соединения
    #39727541
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение обрабатывает примерно 60 запросов в секунду. Это прокси: принимает соединение, обращается к удаленному ресурсу и проксирует данные.
Со временем (через несколько дней) число исходящий соединений доходит до такого количества, что приложение начинает упираться в лимит на число открытых файлов.

Код: plaintext
1.
2.
netstat -anp | grep java | grep CLOSE_WAIT  -c
265
На следующий день их будет уже 1000 и так далее.
Копятся в CLOSE_WAIT именно исходящие соединения, которые порождает jersey client.

CLOSE_WAIT - если я правильно понимаю означает, что удаленный сервер закрыл соединение, а наше приложение еще нет.


HttpClient один на все приложение.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        final ClientConfig clientConfig = new ClientConfig();
        clientConfig.property(ClientProperties.CONNECT_TIMEOUT, config.getInt("http_client.connect_timeout"));
        clientConfig.property(ClientProperties.READ_TIMEOUT, config.getInt("http_client.read_timeout"));

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
        clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER_SHARED, true);

        ConnectorProvider connectorProvider = new ApacheConnectorProvider();
        clientConfig.connectorProvider(connectorProvider);

        connectionManager.setMaxTotal(config.getInt("http_client.max_total_connections"));
        connectionManager.setDefaultMaxPerRoute(config.getInt("http_client.default_max_per_route_connections"));

        client = ClientBuilder
                .newBuilder()
                .withConfig(clientConfig)
                .sslContext(SSLContextBuilder.createdTrustedAll())
                .hostnameVerifier((hostname, session) -> true)
                .build();


В мануале сказано тред-сейф.

Запрос делается так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public Response createRequest(String url, Client client) throws Exception {
        logger.debug("Download resource: " + url);
        WebTarget webTarget = client.target(url);
        Invocation.Builder invocationBuilder = webTarget.request();
        Response response = invocationBuilder.get();
        if (response.getStatusInfo().getStatusCode() != 200) {
            throw new Exception("Invalid response = " + url + " code = " +
                    response.getStatusInfo().getStatusCode());
        }
        return response;
    }





Используется в HttpHandler, закрывается так:
Код: java
1.
2.
3.
4.
5.
6.
7.
            try (Response response = resourceProvider.createRequest(url, httpClientProvider.get())) {
                httpExchange.sendResponseHeaders(200, response.getLength());
                InputStream is = response.readEntity(InputStream.class);
                IOUtils.copy(is, os);
            } catch (Exception e) {
                throw new Exception("Error download url " + url, e);
            }



Не догоняю почему со временем копятся соединения.
С учетом количества обрабатываемых запросов - проблемы далеко не со всеми, какие-то рандомные соединения иногда не закрываются.
...
Рейтинг: 0 / 0
Jersey http client: не закрываются соединения
    #39727543
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_total_connections - 5000
если поставить 500, то приложение зависнет меньше чем через 1 сутки.
...
Рейтинг: 0 / 0
Jersey http client: не закрываются соединения
    #39727545
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
READ_TIMEOUT - 5000 (милисекунд)
...
Рейтинг: 0 / 0
Jersey http client: не закрываются соединения
    #39727649
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел ответ здесь
https://jira.apache.org/jira/browse/HTTPCLIENT-1918

Код: java
1.
2.
        httpClientProvider.getConnectionManager().closeIdleConnections(1, TimeUnit.SECONDS);
        httpClientProvider.getConnectionManager().closeExpiredConnections();



как-то так...
...
Рейтинг: 0 / 0
Jersey http client: не закрываются соединения
    #39727712
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема была не в это, а в том месте где исключение кидается и в этом случае auto-close просто не мог выполниться.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Jersey http client: не закрываются соединения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]