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
相关产品推荐
相关产品推荐

