Java asyncHttpClient новый поток для каждого соединения - PullRequest
0 голосов
/ 22 октября 2018

Я делаю библиотеку в Java, библиотека для вызова внешнего сервиса API.Для этого я использую AsyncHttpClient

Некоторая часть кода:

 public CompletableFuture<Optional<TokensResponse>> clientCredentialsGrant(String clientId, String clientSecret, String deviceId, Optional<String> scope) {
        AsyncHttpClient asyncHttpClient = asyncHttpClient();
        BoundRequestBuilder requestBuilder = asyncHttpClient
                .preparePost(host + "/oauth2/token")
                .addFormParam("grant_type", "client_credentials")
                .addFormParam("device_id", deviceId)
                .addFormParam("client_id", clientId)
                .addFormParam("client_secret", clientSecret);

        if (scope.isPresent()) {
            requestBuilder.addFormParam("scope", scope.get());
        }

        return runRequestWithTokenResponse(requestBuilder, asyncHttpClient);
    }

, и если какой-то проект, который использует эту библиотеку, я запусту, например, 1000 запросов, даже еслиони закончатся, я закончу с множеством повешенных нитей.После достижения запроса я делаю:

asyncHttpClient.close();

Могу ли я определить какой-нибудь пул потоков для использования?

Как правило, AHC, как правило, работает хуже, если вы создаете новый клиент для каждого запроса, так как он создает новые потоки и пулы соединений для каждого

Это то, чем я являюсьна самом деле делает ..

Ответы [ 2 ]

0 голосов
/ 09 августа 2019

Вам не нужно определять пул потоков.AHC заботится о параллельном исполнении.Просто создайте один экземпляр AHC и используйте его везде.Например, сделайте это поле класса:

AsyncHttpClient asyncHttpClient = asyncHttpClient();

Под колпаком AHC имеет два типа потоков:

  1. Для операций ввода / вывода.На вашем экране это потоки AsyncHttpClient-xx.AHC создает 2 * core_number из них.
  2. Для таймаутов.На вашем экране это поток AsyncHttpClient-timer-1-1.Должно быть только one .

Любой другой номер означает, что вы создаете несколько клиентов.Это избыточно в вашем случае.

0 голосов
/ 22 октября 2018

при инициализации объекта AsyncHttpClient

вы можете сделать это, поведение пула соединений можно настроить через AsyncHttpClientConfig:

AsyncHttpClient http = asyncHttpClient(config()
    .setMaxConnections(500)
    .setMaxConnectionsPerHost(200)
    .setPooledConnectionIdleTimeout(100)
    .setConnectionTtl(500)
);
...