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

如何降低Amazon S3 AWS上传ProgressListener的通知频率与冗余度?

调整S3分片上传进度日志打印粒度方案

实现原理

AWS SDK的ProgressListener默认会在每完成8KB缓冲区数据传输后触发progressChanged事件,无需修改SDK底层逻辑,只需在监听器内部增加累计计数和阈值判断逻辑,即可实现自定义粒度的日志打印。

具体实现代码

修改后的Java参考实现

TransferManager tm = new TransferManager(new ProfileCredentialsProvider());        

PutObjectRequest request = new PutObjectRequest(
        existingBucketName, keyName, new File(filePath));

// 自定义打印阈值,这里设置为1MB=1048576字节,可自行调整
long printThreshold = 1048576L;
AtomicLong totalTransferred = new AtomicLong(0);
AtomicLong lastPrinted = new AtomicLong(0);

request.setGeneralProgressListener(new ProgressListener() {
    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long current = totalTransferred.addAndGet(progressEvent.getBytesTransferred());
        // 累计增量达到阈值才打印
        if (current - lastPrinted.get() >= printThreshold) {
            System.out.println("Transferred bytes: " + current);
            lastPrinted.set(current);
        }
    }
});       

Upload upload = tm.upload(request);

这里用AtomicLong是为了避免多线程场景下的计数错乱,如果你能确认监听器只会单线程回调也可以用普通long变量。

Scala适配实现

import com.amazonaws.event.{ProgressEvent, ProgressListener}
import com.amazonaws.services.s3.model.PutObjectRequest
import com.amazonaws.services.s3.transfer.TransferManager
import com.amazonaws.auth.profile.ProfileCredentialsProvider
import java.util.concurrent.atomic.AtomicLong
import java.io.File

val tm = new TransferManager(new ProfileCredentialsProvider())
val request = new PutObjectRequest(existingBucketName, keyName, new File(filePath))

val printThreshold = 1048576L // 1MB阈值,可自行调整
val totalTransferred = new AtomicLong(0)
val lastPrinted = new AtomicLong(0)

request.setGeneralProgressListener(new ProgressListener {
  override def progressChanged(progressEvent: ProgressEvent): Unit = {
    val current = totalTransferred.addAndGet(progressEvent.getBytesTransferred)
    if (current - lastPrinted.get() >= printThreshold) {
      println(s"Transferred bytes: $current")
      lastPrinted.set(current)
    }
  }
})

val upload = tm.upload(request)

扩展优化

如果需要按百分比打印进度,可以提前获取待上传文件的总大小,将阈值设置为总大小的对应百分比即可,比如设置每上传5%打印一次日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:06:03