异步多个文件上传到AWS S3存储桶

时间:2019-04-01 00:31:48

标签: java multithreading amazon-s3 aws-sdk

我想使用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”调用的情况下工作,但事实并非如此,您能帮我吗?谢谢。

2 个答案:

答案 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
                    }
                }
            }