我正在用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通常会表现不佳 对于每个请求,因为它将创建新的线程和连接池 每个
这是我实际上在做的事。
答案 0 :(得分:1)
初始化对象AsyncHttpClient
您可以执行此操作,可以通过AsyncHttpClientConfig配置连接池行为:
AsyncHttpClient http = asyncHttpClient(config()
.setMaxConnections(500)
.setMaxConnectionsPerHost(200)
.setPooledConnectionIdleTimeout(100)
.setConnectionTtl(500)
);
答案 1 :(得分:0)
您不需要定义线程池。 AHC负责并发执行。 只需创建一个AHC实例并在任何地方使用它。 例如,将其设置为类字段:
AsyncHttpClient asyncHttpClient = asyncHttpClient();
引擎盖下AHC有两种类型的线程:
任何不同的数字表示您正在创建多个客户端。对于您而言,这是多余的。