繁体   English   中英

AWS Reactive Response 处理程序下载带有 WARN“订阅者在所有事件发布之前取消”的部分文件

[英]AWS Reactive Response handler downloads partial file with WARN "Subscriber cancelled before all events were published"

我正在使用 where awssdkversion = 2.10.1

implementation "org.springframework.boot:spring-boot-starter-webflux"
implementation platform("software.amazon.awssdk:bom:$awssdkVersion")
implementation "software.amazon.awssdk:s3"
implementation "software.amazon.awssdk:netty-nio-client"

并尝试使用 s3client.getObject 从 s3 下载文件但是得到

2022-01-26T02:08:45.607+0000 - WARN - ResponseHandler : message="Subscriber cancelled before all events were published", timestamp="2022-01-26T02:08:45.607+0000", thread="aws-java-sdk-NettyEventLoop-0-1", level="WARN", class="software.amazon.awssdk.http.nio.netty.internal.ResponseHandler"

不知道为什么我会得到它以及应该如何解决

不看代码很难回答问题。 我确实遇到了同样的错误。 所以下面的答案是基于此。

  • 在我的场景中,我们使用 AWS SDK V2 从 S3 读取文件然后处理它。 当我们在处理代码中为一个用例返回Mono.empty()时遇到了这个问题,显然这标志着反应管道中处理的结束。 所以我们必须返回Mono.just("")并处理我们的用例以检查响应中的 "" 字符串。

  • 类似地,在另一个处理位中,当我们找不到结果时,我们在 else 块中返回Stream.empty() ,这会阻塞管道流。 因此,改为返回List.of() ,然后让调用者调用.toList()来标记流程完成。

  • 另一件可以帮助您的事情是检查异步 S3 客户端配置中的 ThreadPool Executor。 如果下载大文件超时或线程耗尽。

     S3AsyncClient asyncClient() { SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder().writeTimeout(Duration.ZERO).maxConcurrency(64).build(); return S3AsyncClient.builder().httpClient(httpClient).region(Region.of(s3ConfigProperties.getRegion())).asyncConfiguration(b -> b.advancedOption(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, Executors.newFixedThreadPool(5))).build();

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM