猿问

每个连接的 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);

    }

如果某个项目正在使用这个库,我将运行例如 1000 个请求,即使它们会完成,我最终会挂起很多线程。到达请求后,我正在做:


asyncHttpClient.close();

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


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


这就是我实际上在做什么..


慕仙森
浏览 244回答 2
2回答

眼眸繁星

初始化对象 AsyncHttpClient 时你可以这样做,连接池行为可以通过 AsyncHttpClientConfig 配置:AsyncHttpClient http = asyncHttpClient(config()&nbsp; &nbsp; .setMaxConnections(500)&nbsp; &nbsp; .setMaxConnectionsPerHost(200)&nbsp; &nbsp; .setPooledConnectionIdleTimeout(100)&nbsp; &nbsp; .setConnectionTtl(500));

一只斗牛犬

您不需要定义线程池。AHC 负责并发执行。只需创建一个 AHC 实例并在任何地方使用它。例如,将其设为类字段:AsyncHttpClient asyncHttpClient = asyncHttpClient();在引擎盖下 AHC 有两种类型的线程:用于 I/O 操作。在您的屏幕上,它是 AsyncHttpClient-xx 线程。AHC 创建了其中的2*core_number。对于超时。在您的屏幕上,它是 AsyncHttpClient-timer-1-1 线程。应该只有一个。任何不同的数字都意味着您正在创建多个客户端。在你的情况下这是多余的。
随时随地看视频慕课网APP

相关分类

Java
我要回答