我使用的是适用于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
线程正在执行该处理。有没有推荐的方法?我是否应该在一个线程池中比在另一个线程池中进行处理?
最佳答案
我怀疑我实际上知道这个答案。我相信响应将被移交给sdk-async-response
线程池,以防止有人在响应处理程序中为请求执行阻塞调用,从而阻塞Netty事件循环。因此,为了回答我自己的问题,我认为响应处理应该在sdk-async-response
线程池中进行。在将来的版本中,如果没有通常的警告,就不能在Netty事件循环之外移交响应,那可能会很好,但是目前看来这是不可能的。
关于java - AsyncFutureCompletionExecutor与Netty事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62472073/