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

AWS Java SDK 2.x TransferManager中如何在TransferListener里获取v1版本TransferState的等价状态?

AWS Java SDK 2.x TransferManager中如何在TransferListener里获取v1版本TransferState的等价状态?

嘿,这个问题我刚好踩过坑,给你详细梳理下具体的实现方式~

和v1直接提供TransferState枚举类不同,AWS Java SDK v2的TransferManager采用了事件驱动的设计,没有直接对应的状态枚举,而是通过TransferListener的几个回调方法来传递传输的不同阶段状态,我们可以在这些回调里对应到v1的各个TransferState值:

  • 传输启动(对应v1的TransferState.Started):当你调用transferManager.upload()或download()发起传输后,传输开始时会触发transferStarted(TransferStartEvent event)方法,这时候就对应v1里的Started状态。
  • 传输进行中(对应v1的TransferState.InProgress):bytesTransferred(TransferProgressEvent event)方法会在传输过程中被多次调用,每次有字节传输完成时都会触发,这就对应InProgress状态,还能通过event.bytesTransferred()获取已传输的字节数。
  • 传输成功完成(对应v1的TransferState.Completed):当传输顺利完成时,transferComplete(TransferCompletionEvent event)方法会被触发,这里就是Completed状态。
  • 传输失败(对应v1的TransferState.Failed):如果传输过程中出现错误,transferFailed(TransferFailureEvent event)会被触发,通过event.exception()可以拿到具体的异常信息,对应Failed状态。
  • 传输被取消(对应v1的TransferState.Canceled):如果调用Transfer.abort()取消传输,transferFailed同样会被触发,但可以通过判断异常类型(比如AbortedException)来区分是主动取消还是普通失败,对应Canceled状态。

给你写个实际的代码示例,自定义一个TransferListener来映射这些状态:

import software.amazon.awssdk.transfer.s3.TransferListener;
import software.amazon.awssdk.transfer.s3.model.*;

public class CustomTransferStateListener implements TransferListener {
    @Override
    public void transferStarted(TransferStartEvent event) {
        System.out.println("当前传输状态: Started");
        // 对应v1的 TransferState.Started
    }

    @Override
    public void bytesTransferred(TransferProgressEvent event) {
        System.out.printf("当前传输状态: InProgress,已传输字节数: %d%n", event.bytesTransferred());
        // 对应v1的 TransferState.InProgress
    }

    @Override
    public void transferComplete(TransferCompletionEvent event) {
        System.out.println("当前传输状态: Completed");
        // 对应v1的 TransferState.Completed
    }

    @Override
    public void transferFailed(TransferFailureEvent event) {
        Throwable exception = event.exception();
        if (exception instanceof software.amazon.awssdk.core.exception.AbortedException) {
            System.out.println("当前传输状态: Canceled");
            // 对应v1的 TransferState.Canceled
        } else {
            System.out.printf("当前传输状态: Failed,错误信息: %s%n", exception.getMessage());
            // 对应v1的 TransferState.Failed
        }
    }
}

使用这个listener也很简单,发起传输时绑定即可:

import software.amazon.awssdk.transfer.s3.TransferManager;
import software.amazon.awssdk.transfer.s3.UploadRequest;
import java.io.File;

public class TransferExample {
    public static void main(String[] args) {
        TransferManager transferManager = TransferManager.create();
        UploadRequest uploadRequest = UploadRequest.builder()
                .source(new File("本地文件路径"))
                .bucket("你的S3桶名")
                .key("远程文件键名")
                .build();

        // 绑定自定义监听
        transferManager.upload(uploadRequest,
                TransferListener.defaultListenerBuilder()
                        .additionalListener(new CustomTransferStateListener())
                        .build());
    }
}

其实v2的这种设计更灵活,把状态判断的控制权交给了开发者,虽然没有v1那样直接的枚举,但通过事件回调完全可以实现等价的状态判断逻辑。

备注:内容来源于stack exchange,提问作者Novaterata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:13:08