in src/main/java/com/aliyun/oss/internal/OSSUploadOperation.java [458:514]
private ArrayList<PartResult> upload(UploadCheckPoint uploadCheckPoint, UploadFileRequest uploadFileRequest)
throws Throwable {
ArrayList<PartResult> taskResults = new ArrayList<PartResult>();
ExecutorService service = Executors.newFixedThreadPool(uploadFileRequest.getTaskNum());
ArrayList<Future<PartResult>> futures = new ArrayList<Future<PartResult>>();
ProgressListener listener = uploadFileRequest.getProgressListener();
// Compute the size of the data pending upload.
long contentLength = 0;
long completedLength = 0;
for (int i = 0; i < uploadCheckPoint.uploadParts.size(); i++) {
long partSize = uploadCheckPoint.uploadParts.get(i).size;
contentLength += partSize;
if (uploadCheckPoint.uploadParts.get(i).isCompleted) {
completedLength += partSize;
}
}
ProgressPublisher.publishRequestContentLength(listener, contentLength);
ProgressPublisher.publishRequestBytesTransferred(listener, completedLength);
uploadFileRequest.setProgressListener(null);
// Upload parts.
for (int i = 0; i < uploadCheckPoint.uploadParts.size(); i++) {
if (!uploadCheckPoint.uploadParts.get(i).isCompleted) {
futures.add(service.submit(new Task(i, "upload-" + i, uploadCheckPoint, i, uploadFileRequest,
multipartOperation, listener)));
} else {
taskResults.add(new PartResult(i + 1, uploadCheckPoint.uploadParts.get(i).offset,
uploadCheckPoint.uploadParts.get(i).size, uploadCheckPoint.uploadParts.get(i).crc));
}
}
service.shutdown();
// Waiting for parts upload complete.
service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
for (Future<PartResult> future : futures) {
try {
PartResult tr = future.get();
taskResults.add(tr);
} catch (ExecutionException e) {
uploadFileRequest.setProgressListener(listener);
throw e.getCause();
}
}
// Sorts PartResult by the part numnber.
Collections.sort(taskResults, new Comparator<PartResult>() {
@Override
public int compare(PartResult p1, PartResult p2) {
return p1.getNumber() - p2.getNumber();
}
});
uploadFileRequest.setProgressListener(listener);
return taskResults;
}