我正在尝试创建一个小型服务来接受文件上传、解压缩然后删除上传的文件。这三个步骤应该作为 future 链接起来。我正在使用 Google Guava 库。
工作流程是:
A future 下载文件,如果操作完成,则a future 解压文件。如果解压缩完成,将来会删除原始上传的文件。
但老实说,我不清楚我将如何链接 future ,甚至如何以 Guava 的方式创建它们。文档简明扼要且不清楚。好的,有 transform
方法,但根本没有具体示例。 chain
方法已弃用。
我想念 RxJava
库。
最佳答案
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,请传入 Function 或 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 (滚动或搜索“转换”——深层链接目前似乎已损坏)
关于java - Guava future 如何上链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920856/