Amazon S3 Java下载在最后一个文件上挂起

时间:2012-11-27 07:00:55

标签: amazon-s3 download progress hang

我在上一个文件完成下载后挂起了亚马逊S3下载的问题,“锁定”文件被删除,因为它仍然是由Java应用程序“使用”,否则它们工作正常。此外,进度似乎没有正确更新,因为最大的文件只是说100次进度然后继续下载而没有任何进一步的更新,直到它完成,此时它在脚本挂起之前显示“状态:已完成” 。我的代码如下:

private static void getTheS3File(String bucketName, String file, String projID, String fileType) throws Exception {
    ProgressListener progressListener = new ProgressListener() {
        int lastProg = 0;
        public void progressChanged(ProgressEvent progressEvent) {
            if (download == null) return;

            int curProg = (int)download.getProgress().getPercentTransfered();
            if(curProg != lastProg) {
                System.out.println(curProg);
                lastProg = curProg;
            }

            switch (progressEvent.getEventCode()) {
            case ProgressEvent.COMPLETED_EVENT_CODE:
                System.out.println("State: " + download.getState());
                break;
            case ProgressEvent.FAILED_EVENT_CODE:
                try {
                    AmazonClientException e = download.waitForException();
                    System.out.printf("Unable to download file from Amazon S3: " + e.getMessage(), "Error Downloading File", JOptionPane.ERROR_MESSAGE);
                } catch (InterruptedException e) {}
                break;
            }
        }
    };
    File newFile = null;
    GetObjectRequest request = new GetObjectRequest(bucketName, file).withProgressListener(progressListener);
    if(fileType == "img") {
        newFile = new File("/c:/test/" + projID + "/original.jpg");
    } else if(fileType == "txt") {
        newFile = new File("/c:/test/" + projID + "/test.txt");
    }
    download = tx.download(request,newFile);
    //System.out.println("progress: " + download.getProgress().getPercentTransfered() + " State: " + download.getState());
}

我几乎已经破解了SDK附带的Amazon S3 Transfer Progress Sample的示例代码,以便在没有GUI的情况下创建该方法的下载版本,所以我很惊讶它甚至可以工作。我对Java不是很了不起,对AWS API来说更糟糕,所以任何指针都是受欢迎的。

1 个答案:

答案 0 :(得分:0)

我找到了挂起问题的解决方案。显然 tx =新的TransferManager(凭据); 应该是 tx =新的AmazonS3Client(凭据); 。我不确定转移管理器是如何工作的,但我认为它挂起的原因是它在完成连接时没有关闭连接,但是#&#'s&#'s's's's's's's's's's's 39;可能是另一个话题......