1

我正在使用适用于 Java 2.0 的 AWS 开发工具包以及 Netty HTTP 客户端,我注意到有两个不同的线程池可以有效地处理响应。第一个是 ThreadPoolExecutor,可以像这样作为服务客户端本身的一部分被覆盖

DynamoDbAsyncClient dynamoClient = DynamoDbAsyncClient.builder()
                .httpClient(httpClient)
                .asyncConfiguration(ClientAsyncConfiguration.builder()
                        .advancedOption(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, awsSdkFutureCompletionExecutor)
                        .build())

第二个是 Netty HTTP 客户端的事件循环。根据我加入线程的位置,我可以看到它要么由线程池处理,要么由aws-java-sdk-NettyEventLoop线程sdk-async-response池处理。

如果我打电话dynamoClient.query(request).join(),我可以看到aws-java-sdk-NettyEventLoop继续任何进一步的处理,而dynamoClient.query(request).whenComplete(...)意味着sdk-async-response线程正在执行处理。

有推荐的方法吗?我应该更喜欢在一个线程池中进行处理而不是在另一个线程池中进行处理吗?

4

1 回答 1

3

我怀疑我实际上知道这个问题的答案。我相信响应被移交给sdk-async-response线程池,以防止有人在响应处理程序中对请求进行阻塞调用,从而阻塞 Netty 事件循环。所以要回答我自己的问题,我认为响应处理应该在sdk-async-response线程池中完成。在未来的版本中,最好不要在 Netty 事件循环之外传递响应,但通常需要注意的是,但目前这似乎是不可能的。

于 2020-06-22T15:53:56.313 回答