Is it possible to chain async calls using Guava?

前端 未结 2 524
死守一世寂寞
死守一世寂寞 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: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 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());
    

    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
    

提交回复
热议问题