是否可以使用Guava链接异步调用?

Ale*_*rov 14 java guava

我想链接异步休息服务调用,并在完成后进行单次回调.

是否可以用番石榴做到这一点?

Coo*_*per 20

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);
Run Code Online (Sandbox Code Playgroud)


Vas*_*iuk 11

你可以使用Futures.chain链接ListenableFutures:

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 Code Online (Sandbox Code Playgroud)

在终端上面的代码输出:

> 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
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,'Futures.chain`已不再可用.另一种方法是使用`Futures.transform`. (7认同)