2017-10-02 7 views
0

私はJava(大学で学んだがバージョン2でした)ではかなり新しいです。 これで、s3のファイルを並行してダウンロードするアプリケーションを開発しました。私は、このように並列に複数のファイルをダウンロードするExecutorServiceRunnableを使用しました:私はからダウンロードする必要があるフォルダが含まれているリストにいくつかのダウンロードオブジェクトを追加する機能毎分呼び出す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の間で通信する最善の方法は何ですか?

+0

「発信者」とは何ですか? – Oleg

+0

このコードには構文エラーがあります。エラーフリーで実行可能なコードを提供してください。また、 'printToTextArea()'の呼び出しが正しいようです。私は正しく質問をしていません。 – procrastinator

+0

なぜあなたはすでに持っているものが「ベスト」ではないと思いますか? –

答えて

0

あなたのコードでは、目標が何であるか完全にはっきりしません。何もなく、ファイル(懸念のCFG分離)をダウンロードしないとRunnableあるんクラス

public class Download { 
    private AmazonS3 s3Client; 
    public Download(AmazonS2 client) { s3Client = client; } 
    public void run() { // perform download } 
} 

:私が理解から、私はそれをこのような何かをやっているだろう。 executorService.submit(new Download(client))を実行すると、ダウンロードは最終的に完了します。同時に呼び出されることなくテストすることもできます。

これで、終了時にログを記録するためのコールバックメソッドが必要になります。

public class LoggingCallback { 
    public void log() { 
     System.out.println("finished"); 
    } 
} 

またRunnable(メソッドはrun()である必要はありません)。

そして、多分これ

Download dl = new Download(client); 
Logger l = new LoggingCallback(); 
executorService.submit(new OneAfterTheOther(dl::run, l::log)); 

のように提出した場合

class OneAfterTheOther { 
    private Runnable first; 
    private Runnable second; 
    public OneAfterTheOther(Runnable r1, Runnable r2) { 
     first = r1; second = r2; 
    } 
    public void run() { first.run(); second.run(); } 
} 

は、私はあなたがやろうとしていると思う何だろう、それが次々にトリガしています確実にします。

関連する問題