私はJava(大学で学んだがバージョン2でした)ではかなり新しいです。 これで、s3のファイルを並行してダウンロードするアプリケーションを開発しました。私は、このように並列に複数のファイルをダウンロードするExecutorService
とRunnable
を使用しました:私はからダウンロードする必要があるフォルダが含まれているリストにいくつかのダウンロードオブジェクトを追加する機能毎分呼び出すdownloadControllerでJava - ランナブル、ラムダ関数、およびクラスのメソッド
public class DownloaderController {
private AmazonS3 s3Client;
private ExecutorService fixedPool;
private TransferManager dlManager;
private List<MultipleFileDownload> downloads = new ArrayList<>();
public DownloaderController() {
checkForNewWork();
}
public void checkForNewWork(){
Provider1 provider = new Provider1();
fixedPool = Executors.newFixedThreadPool(4);
List<Download> providedDownloadList = provider.toBeDownloaded();
for (Download temp : providedDownloadList) {
if (!downloadData.contains(temp)) {
fixedPool.submit(download.downloadCompletedHandler(s3Client));
}
}
}
}
public void printToTextArea(String msg){
Date now = new Date();
if (!DateUtils.isSameDay(this.lastLogged, now)){
this._doLogRotate();
}
this.lastLogged = now;
SimpleDateFormat ft = new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
String output = "[ " + ft.format(now) + " ] " + msg + System.getProperty("line.separator");
Platform.runLater(() -> {
//this is a FXML object
statusTextArea.appendText(output);
});
}
}
public class Provider1 implements downloadProvider {
}
public class Download {
abstract Runnable downloadCompletedHandler(AmazonS3 s3Client);
}
public class DownloadProvider1 extends Download {
@Override
public Runnable downloadCompletedHandler(AmazonS3 s3Client){
Runnable downloadwork =() -> {
ObjectListing list = s3Client.listObjects(this.bucket,this.getFolder());
List<S3ObjectSummary> objects = list.getObjectSummaries();
AtomicLong workSize = new AtomicLong(0);
List<DeleteObjectsRequest.KeyVersion> keys = new ArrayList<>();
objects.forEach(obj -> {
workSize.getAndAdd(obj.getSize());
keys.add((new DeleteObjectsRequest.KeyVersion(obj.getKey())));
});
MultipleFileDownload fileDownload = dlManager.downloadDirectory("myBucket","folder","outputDirectory");
try {
fileDownload.waitForCompletion();
} catch (Exception e){
printToTextArea("Exception while download from AmazonS3");
}
};
return downloadwork;
}
}
s3。新しいDownloadが追加されると、ExecutorServiceプールにも追加されます。ダウンロードオブジェクトは、s3からフォルダをダウンロードするために実行する必要のあるコードと、ダウンロードが完了したときの処理を返します。 私の問題は、RunnableとDownloadControllerの間で通信する最善の方法は何ですか?
「発信者」とは何ですか? – Oleg
このコードには構文エラーがあります。エラーフリーで実行可能なコードを提供してください。また、 'printToTextArea()'の呼び出しが正しいようです。私は正しく質問をしていません。 – procrastinator
なぜあなたはすでに持っているものが「ベスト」ではないと思いますか? –