Java asyncHttpClient每个连接的新线程

时间:2018-10-22 13:28:12

标签: java asynchttpclient

我正在用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);
    }

如果某个正在使用此lib的项目,即使它们将完成,我也将运行例如1000个请求,但最终会导致许多线程挂起。 达到要求后,我正在做

asyncHttpClient.close();

我可以定义一些要使用的线程池吗?

  

通常,如果您创建新客户,AHC通常会表现不佳   对于每个请求,因为它将创建新的线程和连接池   每个

这是我实际上在做的事。

2 个答案:

答案 0 :(得分:1)

初始化对象AsyncHttpClient

您可以执行此操作,可以通过AsyncHttpClientConfig配置连接池行为:

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

答案 1 :(得分:0)

您不需要定义线程池。 AHC负责并发执行。 只需创建一个AHC实例并在任何地方使用它。 例如,将其设置为类字段:

AsyncHttpClient asyncHttpClient = asyncHttpClient();

引擎盖下AHC有两种类型的线程:

  1. 用于I / O操作。 在您的屏幕上,它是AsyncHttpClient-x-x 线程。 AHC创建其中的 2 * core_number
  2. 超时。 在您的屏幕上,它是AsyncHttpClient-timer-1-1线程。应该 仅一个

任何不同的数字表示您正在创建多个客户端。对于您而言,这是多余的。