2015-01-13 26 views
6

我正在尝试创建一个小服务来接受文件上传,解压缩并删除上传的文件。这三个步骤应该被视为未来。我正在使用Google Guava图书馆。如何连锁番石榴期货?

工作流程是:

未来的下载文件时,如果操作完成,则未来要解压文件。如果解压缩完成,将来会删除原始上传的文件。

但说实话,我不清楚我将如何锁定期货,甚至如何以番石榴的方式创造它们。文件简单而不清楚。好的,有transform方法,但没有具体的例子。 chain方法已弃用。

我想RxJava库。

+0

期货不做工作。 Runnables可以。 –

+0

@BrettOkken如何以番石榴的方式链接可运行? – Chiron

+0

[可以使用Guava链接异步调用吗?](http://stackoverflow.com/questions/8191891/is-it-possible-to-chain-async-calls-using-guava) – 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 

这个例子假设fileDownloader.download()返回FileClass一个实例,fileUpzipper.unzip()返回UnzippedFileClass等,如果FileDownloader.download()而是返回一个ListenableFuture<FileClass>,使用AsyncFunction代替Function

为了简洁,本示例还使用Java 8 lambda表达式。如果你没有使用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(滚动或搜索“改造” - 深度链接似乎被打破当前)