2015-01-13 6 views
6

ファイルのアップロードを受け入れ、解凍してからアップロードしたファイルを削除する小さなサービスを作成しようとしています。これらの3つのステップは、先物として連鎖されるべきです。私はGoogle Guavaライブラリを使用しています。グアバの先物の仕組みは?

ワークフローは次のとおりです。

操作が完了した場合、ファイルを解凍するために、今後、その後、ファイルをダウンロードするための将来。解凍が行われた場合、元のアップロードされたファイルを削除する未来。

しかし正直なところ、私は先物をどのようにチェーン化するのか、それをどのようにしてグアバの方法で作るのかはわかりません。ドキュメントは簡潔で不明瞭です。はい、transformメソッドがありますが、具体的な例はありません。 chainメソッドは推奨されていません。

私はRxJavaが不足しています。

+0

先物は仕事をしません。ランナブルは行う。 –

+0

@BrettOkkenグアバの道で走り回ることができますか?間違って何 – Chiron

+0

可能重複['Futures.transform'](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/util/concurrent/Futures.html#transform%28com.google .common.util.concurrent.ListenableFuture、%20comcompany.com.util.concurrent.AsyncFunction、%20java.util.concurrent.Executor%29)? – Joe

答えて

2

グアバは、FutureインターフェイスをListenableFutureに拡張しています。

Runnable downloader, unzipper; 
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); 

service.submit(downloader).addListener(unzipper, service); 

が、私はそれが近い瞬間アクションであることから、unzipperでファイルを削除含まれるであろう、そしてそれを分離するためのコードを複雑になります。このような

何かが動作するはずです。

2

Futures.transformはRxJavaのように流暢に連鎖可能ではありませんが、まだそれを使用して互いに依存するFutureを設定できます。ここで具体例である:

final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); 

final ListenableFuture<FileClass> fileFuture = service.submit(() -> fileDownloader.download()) 
final ListenableFuture<UnzippedFileClass> unzippedFileFuture = Futures.transform(fileFuture, 
     //need to cast this lambda 
     (Function<FileClass, UnzippedFileClass>) file -> fileUnzipper.unzip(file)); 
final ListenableFuture<Void> deletedFileFuture = Futures.transform(unzippedFileFuture, 
     (Function<UnzippedFileClass, Void>) unzippedFile -> fileDeleter.delete(unzippedFile)); 
deletedFileFuture.get(); //or however you want to wait for the result 

この例では、FileClassのインスタンスを返すfileDownloader.download()前提と、fileUpzipper.unzip()FileDownloader.download()代わりListenableFuture<FileClass>を返す場合UnzippedFileClass等、AsyncFunction代わりにFunctionを使用し返します。

この例でも、簡潔にするためにJava 8ラムダを使用しています。あなたは、Java 8を使用していない場合は、代わりに、関数またはAsyncFunctionの匿名の実装を渡す:

Futures.transform(fileFuture, new AsyncFunction<FileClass, UpzippedFileClass>() { 
     @Override 
     public ListenableFuture<UnzippedFileClass> apply(final FileClass input) throws Exception { 
      return fileUnzipper.unzip(); 
     } 
    }); 

ここtransformの詳細情報:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/util/concurrent/Futures.html#transformを(スクロールや「変換」を検索 - ディープリンクは現在壊れているように見えます)