You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用S3AsyncClient获取S3存储桶内对象列表无输出问题排查

问题原因与解决方案

你的代码没有输出的核心原因是:AWS Java SDK 2的异步客户端基于Reactor响应式框架,所有操作都是非阻塞的。当你调用subscribe()订阅对象流后,主线程没有等待异步操作完成就直接终止了,导致控制台来不及输出结果。

解决方法一:用CountDownLatch阻塞主线程(推荐用于生产环境)

通过CountDownLatch让主线程等待异步流处理完成,同时添加错误回调捕获可能的异常:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

// 初始化计数器,计数为1表示等待一个异步任务完成
CountDownLatch latch = new CountDownLatch(1);

ListObjectsV2Request request = ListObjectsV2Request.builder().bucket("my-bucket").build();
ListObjectsV2Publisher response = s3AsyncClient.listObjectsV2Paginator(request);

response.contents()
        .subscribe(
            s3object -> System.out.println(s3object), // 处理每个S3对象
            throwable -> { // 处理异常
                throwable.printStackTrace();
                latch.countDown();
            },
            () -> latch.countDown() // 流处理完成时触发
        );

// 等待10秒,超时后主线程继续执行(可根据实际需求调整超时时间)
try {
    latch.await(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

解决方法二:用Reactor的blockLast()阻塞流(适合快速测试)

如果是简单的测试场景,可以直接用blockLast()方法让主线程阻塞直到整个流处理完毕:

ListObjectsV2Request request = ListObjectsV2Request.builder().bucket("my-bucket").build();
ListObjectsV2Publisher response = s3AsyncClient.listObjectsV2Paginator(request);

// 阻塞直到所有对象都被输出完成
response.contents().blockLast();

额外注意事项

  • 检查S3客户端配置:确保客户端的凭证、区域配置正确,否则即使桶内有对象,也可能因权限或区域不匹配返回空结果
  • 必须添加错误回调:异步操作的异常不会直接抛到主线程,只有通过错误回调才能捕获并排查问题

内容的提问来源于stack exchange,提问作者ghostrider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:10:27