是否可以使用Guava链接异步调用?
我想链接异步rest服务调用,并在完成后进行单次回调。
是否可以用番石榴做到这一点?
您可以使用Futures.chain
链接ListenableFuture
:
final ListeningExecutorService service1 = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(16)); final ListeningExecutorService service2 = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(16)); ListenableFuture service1result = service1.submit(new Callable () { @Override public String call() throws Exception { return "service1result"; } }); ListenableFuture service2result = Futures.chain(service1result, new Function>() { @Override public ListenableFuture apply(final @Nullable String input) { return service2.submit(new Callable () { @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
Futures.chain
已在12.0
版中删除。 将ListenableFutures
链接在一起的新方法是通过Futures.transform方法。
https://github.com/google/guava/wiki/ListenableFutureExplained#application
来自Guava最新的javadoc( 16.0.1
为16.0.1
)。
ListenableFuture rowKeyFuture = indexService.lookUp(query); AsyncFunction queryFunction = new AsyncFunction() { public ListenableFuture apply(RowKey rowKey) { return dataService.read(rowKey); } }; ListenableFuture queryFuture = transform(rowKeyFuture, queryFunction);