我正在尝试创建一个小服务来接受文件上传,解压缩并删除上传的文件。这三个步骤应该被视为未来。我正在使用Google Guava图书馆。如何连锁番石榴期货?
工作流程是:
未来的下载文件时,如果操作完成,则未来要解压文件。如果解压缩完成,将来会删除原始上传的文件。
但说实话,我不清楚我将如何锁定期货,甚至如何以番石榴的方式创造它们。文件简单而不清楚。好的,有transform
方法,但没有具体的例子。 chain
方法已弃用。
我想RxJava
库。
我正在尝试创建一个小服务来接受文件上传,解压缩并删除上传的文件。这三个步骤应该被视为未来。我正在使用Google Guava图书馆。如何连锁番石榴期货?
工作流程是:
未来的下载文件时,如果操作完成,则未来要解压文件。如果解压缩完成,将来会删除原始上传的文件。
但说实话,我不清楚我将如何锁定期货,甚至如何以番石榴的方式创造它们。文件简单而不清楚。好的,有transform
方法,但没有具体的例子。 chain
方法已弃用。
我想RxJava
库。
番石榴扩展Future
接口与ListenableFuture
为此目的。
像这样的东西应该工作:
Runnable downloader, unzipper;
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
service.submit(downloader).addListener(unzipper, service);
我会包括删除在unzipper文件,因为它是一个近乎瞬时动作,并且将代码分离它复杂化。
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(滚动或搜索“改造” - 深度链接似乎被打破当前)
期货不做工作。 Runnables可以。 –
@BrettOkken如何以番石榴的方式链接可运行? – Chiron
[可以使用Guava链接异步调用吗?](http://stackoverflow.com/questions/8191891/is-it-possible-to-chain-async-calls-using-guava) – Joe