0

最後のファイルのダウンロードが完了した後に Amazon S3 のダウンロードがハングするという問題があり、Java アプリによってまだ「使用中」であるため、ファイルが削除されないように「ロック」します。それ以外の場合は正常に動作します。さらに、進行状況が正しく更新されていないように見えます。最大のファイルは進行状況に対して 100 を 1 回だけ表示し、完了するまでそれ以上更新せずにダウンロードを続行します。完了した時点で、スクリプトがハングする前に「状態: 完了」と表示されます。 . 私のコードは以下の通りです:

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 はさらに苦手なので、何かアドバイスをいただければ幸いです。

4

1 に答える 1

0

ハングの問題の解決策を見つけました。どうやらtx = new TransferManager(credentials); tx = new AmazonS3Client(credentials);である必要があります。. 転送マネージャーがどのように機能するかはわかりませんが、ハングしている理由は、完了時に接続を閉じていないためだと思いますが、それはおそらくまったく別のトピックです...

于 2012-11-27T21:45:37.527 に答える