2

我正在尝试使用 AWS SDK 上传文件以演示由于任何原因导致上传中断。但我看到它总是从头开始上传。那里的代码非常简单,但问题在于保存持久的 obj 状态,以便我们可以在恢复上传时重复使用。

这是我的代码:

public class Upload2 {

private static final File RESUME_UPLOAD_INFO = new File(System.getProperty("user.home"), "resumeUploadFile");
private static final boolean UPLOAD_HALF_AND_KILL = !RESUME_UPLOAD_INFO.exists();

private static Upload upload;

public static void main(String[] args) throws Exception
{
    log("Execution started");
    String bucket = "itpc123412";
    String key = "s3.txt";
    String file_path = "C:\\Users\\rkompelli\\Desktop\\abc3.txt";
    File f = new File(file_path);

    TransferManager tm = AWSConfiguration.getConnectionTransfer(); 
    System.out.println(RESUME_UPLOAD_INFO.exists());
    if (UPLOAD_HALF_AND_KILL)
    {
        PutObjectRequest por = new PutObjectRequest(bucket, key,f);
        log("Starting from scratch");
        upload = tm.upload(por, LISTENER);         
    }
    else
    {
        log("Starting again");
        upload = tm.resumeUpload(PersistableUpload.deserializeFrom(new FileInputStream(RESUME_UPLOAD_INFO)));
        upload.addProgressListener(LISTENER);
    }

    log("Total bytes to transfer: " + upload.getProgress().getTotalBytesToTransfer());
    log("Bytes transferred: " + upload.getProgress().getBytesTransferred());

    upload.waitForCompletion();
    log("Done");

    tm.shutdownNow();
    if (upload.isDone())
        RESUME_UPLOAD_INFO.delete();

    System.exit(0);
}

private static void log(String msg)
{
    System.out.println(DateFormat.getTimeInstance().format(new Date()) + ": " + msg);
}

private static long LAST_LOGGED_BYTES;
private static final S3ProgressListener LISTENER = new S3SyncProgressListener()
{
    @Override
    public void progressChanged(ProgressEvent pe)
    {
        long bytes = upload.getProgress().getBytesTransferred();
        if (pe.getEventType().isByteCountEvent())
        {
            if (LAST_LOGGED_BYTES == 0 || bytes - LAST_LOGGED_BYTES > 5)
            {
                LAST_LOGGED_BYTES = bytes;
                log("uploaded: " + NumberFormat.getNumberInstance().format(bytes));
            }
        }

        if (bytes > upload.getProgress().getTotalBytesToTransfer()/2 && UPLOAD_HALF_AND_KILL) 
        { 
            log("IF 2 in get progress"); 
            log("Exiting");
            System.exit(0); 
        }

    }

    @Override
    public void onPersistableTransfer(final PersistableTransfer pt)
    {
        // TODO should not be blocked
        try
        {
            log("Saving upload state");
            pt.serialize(new FileOutputStream(RESUME_UPLOAD_INFO));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }           
};      
}

我注意到onPersistableTransfer()没有执行具有序列化 obj 的代码的事件。

4

0 回答 0