为了账号安全,请及时绑定邮箱和手机立即绑定

每个连接的 Java asyncHttpClient 新线程

每个连接的 Java asyncHttpClient 新线程

慕仙森 2021-12-01 16:56:01
我在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)

);


查看完整回答
反对 回复 2021-12-01
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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

AsyncHttpClient asyncHttpClient = asyncHttpClient();

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

  1. 用于 I/O 操作。在您的屏幕上,它是 AsyncHttpClient-xx 线程。AHC 创建了其中的2*core_number

  2. 对于超时。在您的屏幕上,它是 AsyncHttpClient-timer-1-1 线程。应该只有一个

任何不同的数字都意味着您正在创建多个客户端。在你的情况下这是多余的。


查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信