我在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 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
初始化对象 AsyncHttpClient 时
你可以这样做,连接池行为可以通过 AsyncHttpClientConfig 配置:
AsyncHttpClient http = asyncHttpClient(config()
.setMaxConnections(500)
.setMaxConnectionsPerHost(200)
.setPooledConnectionIdleTimeout(100)
.setConnectionTtl(500)
);
一只斗牛犬
TA贡献1784条经验 获得超2个赞
您不需要定义线程池。AHC 负责并发执行。只需创建一个 AHC 实例并在任何地方使用它。例如,将其设为类字段:
AsyncHttpClient asyncHttpClient = asyncHttpClient();
在引擎盖下 AHC 有两种类型的线程:
用于 I/O 操作。在您的屏幕上,它是 AsyncHttpClient-xx 线程。AHC 创建了其中的2*core_number。
对于超时。在您的屏幕上,它是 AsyncHttpClient-timer-1-1 线程。应该只有一个。
任何不同的数字都意味着您正在创建多个客户端。在你的情况下这是多余的。
添加回答
举报
0/150
提交
取消