Is it possible to chain async calls using Guava?

前端 未结 2 515
死守一世寂寞
死守一世寂寞 2020-12-09 17:58

I want to chain async rest service calls and have single callback when they finished.

Is it possible to do it with guava?

相关标签:
2条回答
  • 2020-12-09 18:24

    Futures.chain was removed in version 12.0. The new method of chaining together ListenableFutures is via the Futures.transform method.

    https://github.com/google/guava/wiki/ListenableFutureExplained#application

    From Guava latest javadoc (16.0.1 as of this writing).

    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);
    
    0 讨论(0)
  • 2020-12-09 18:28

    You can use Futures.chain for chaining 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());
    

    Output of at the code above in the terminal:

    > 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
    
    0 讨论(0)
提交回复
热议问题