我希望链接异步休息服务调用,并在完成时进行单次回调。
是否可以用番石榴做到这一点?
答案 0 :(得分:19)
Futures.chain
中删除了 12.0
。将ListenableFutures
链接在一起的新方法是通过Futures.transform方法。
https://github.com/google/guava/wiki/ListenableFutureExplained#application
来自Guava最新的javadoc(撰写本文时为16.0.1
)。
ListenableFuture<RowKey> rowKeyFuture = indexService.lookUp(query);
AsyncFunction<RowKey, QueryResult> queryFunction =
new AsyncFunction<RowKey, QueryResult>() {
public ListenableFuture<QueryResult> apply(RowKey rowKey) {
return dataService.read(rowKey);
}
};
ListenableFuture<QueryResult> queryFuture = transform(rowKeyFuture, queryFunction);
答案 1 :(得分:11)
您可以使用Futures.chain
链接ListenableFuture
s:
final ListeningExecutorService service1 = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(16));
final ListeningExecutorService service2 = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(16));
ListenableFuture<String> service1result = service1.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "service1result";
}
});
ListenableFuture<String> service2result = Futures.chain(service1result, new Function<String, ListenableFuture<String>>() {
@Override
public ListenableFuture<String> apply(final @Nullable String input) {
return service2.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return Joiner.on(" -> ").join(input, "service2result");
}
});
}
});
System.out.format("Result: %s\r\n", service2result.get());
在终端上面的代码输出:
> run-main training.Training
[info] Compiling 1 Java source to /home/remeniuk/projects/guava-training/target/scala-2.9.1/classes...
[info] Running training.Training
Result: service1result -> service2result