java - AsyncFutureCompletionExecutor vs Netty 事件循环
问题描述
我正在使用适用于 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 事件循环之外传递响应,但通常需要注意的是,但目前这似乎是不可能的。
推荐阅读
- html - 悬停在与包装器相同的背景色上
- electron - 自定义框架菜单栏 - 电子
- jquery - 如何在锚链接上使用ajax
- firebase - 访问当前位置并将其发送到 firebase
- javascript - 我想为 Azure IoT Hub 或 Cosmos 创建一个包含嵌套对象的 JSON 字符串
- laravel - redis中有哪些高级缓存策略
- xcode - 错误 无法构建 iOS 项目。我们运行了“xcodebuild”命令,但它以错误代码 65 退出
- php - 为什么 PHP pack("h*", 0x41) 函数打印错误的 ASCII 文本
- laravel - Laravel 在 User 类中使用外部数据
- javascript - 模态正文内容不显示