我想使用AWS Java SDK(aws-java-sdk-s3-1.11.66.jar)中的传输管理器将多个文件上传到AWS S3存储桶,因此我的功能在这里:
public static void uploadDirectory(String virtualDirectoryKeyPrefix, File directory) {
try {
MultipleFileUpload multipleFileUpload = instance.transferManager.uploadFileList(
instance.bucketName,
virtualDirectoryKeyPrefix,
directory,
Arrays.asList(Objects.requireNonNull(directory.listFiles())));
multipleFileUpload.waitForCompletion();
} catch (InterruptedException e) {
Logger.error("Not able to write to s3 bucket : " + virtualDirectoryKeyPrefix, e);
}
}
该问题仅在我调用“ waitForCompletion”方法时有效,并且使我的函数同步,因为在这种情况下,我要等到操作完成。我希望它必须能够在没有“ waitForCompletion”调用的情况下工作,但事实并非如此,您能帮我吗?谢谢。
答案 0 :(得分:0)
waitForCompletion仅阻塞直到传输完成(https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/Transfer.html#waitForCompletion--)。
我怀疑您的传输之前也可以运行,但是由于它是异步的,因此您没有检查传输完成的时间。 为了接收异步更新,请按如下所述添加一个ProgressListener: https://docs.aws.amazon.com/AmazonS3/latest/dev/HLTrackProgressMPUJava.html
答案 1 :(得分:0)
为什么不能将侦听器添加到transferManager实例
transferMangerInstance.upload(putObjectRequestInstance);
transferMangerInstance.addProgressListener(ProgressListener progressListener);
transferMangerInstance.addProgressListener(new ProgressListener() {
@Override
public void progressChanged(ProgressEvent progressEvent) {
if(progressEvent.getEventType() == ProgressEventType.TRANSFER_COMPLETED_EVENT) {
//Do your completion logic here
}
}
}