异步休息在Java中调用非顺序

时间:2015-03-04 12:29:36

标签: java spring asynchronous java-8 nio

我在一次通话中对第三方应用程序进行了多次同步调用。 我正在使用Spring RestTemplate来调用第三方应用程序,如下所示,

Class B {
   public void makeRestCall(String url){
      Collection response = restTemplate.getForObject(url, Collection.class, params);
      return response;
   }
}

我接到了控制器的电话

Class A {

    public List<Data> getAllData(){
         // Some Business Logic
         String url1 = "htpp://anyurl1";
         // Some Processing based on Logic
         String url2 = "htpp://anyurl2";
         B b = new B()
         b.makeRestCall(url1);
         b.makeRestCall(url2);

        // Club together data from both calls

        // Again some rest calls based on business logic
        }
    }

现在,当我休息时,我的其余代码被阻止,直到我从请求的URL获得响应。 我尝试过使用AsyncRestTemplate和SimpleReact API,但我遇到了以下问题。我有一系列的休息电话顺序,我不能直接在下面的代码中提供网址列表,因为我不想将其余的电话代码与我的实际应用程序流混合。

new SimpleReact()
.fromStream(urls.stream()
        .map(it ->  
            toCompletableFuture(template
                        .getForEntity(it,String.class))))
.then(it -> it.getBody())
.then(it -> extractTitle(it))

如果有人可以帮助我如何在我的情况下进行异步休息呼叫。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这个问题,但我想这可能是如何弥合一些示例简单反应代码与运营商自己的代码之间的差距?

如果有帮助,您不必使用URL作为简单反应的输入,您可以使用任何Java 8供应商。只需使用标准的Spring RestTemplate(即非NIO同步Rest调用),您就可以使代码与简单反应中的代码异步 -

e.g。

 List<Results> results = new SimpleReact().react( () -> makeRestCall(url1),
                                                  () -> makeRestCall(url2), 
                                                  ..etc..)
                                          .block();

甚至进一步抽象

   List<Results> results = new SimpleReact().react( supplier1,supplier2, ..etc..)
                  .block();

如果你想插入NIO AsyncRestTemplate(实际上你正在进行大量的异步调用并且需要远离使用每个请求的线程) - 你可以修改makeRestCall以使用AsyncRestTemplate和返回CompletableFuture。您可以将这些CompletableFutures推送到简单反应中,如下所示

 List<Results> results = new SimpleReact().fromStream(Stream.of(
                                                      makeRestCall(url1),
                                                      makeRestCall(url2))
                                          .block();

在我们的另一个开源项目Microserver中有一个使用异步NIO Rest客户端和简单反应的示例。例如(https://github.com/aol/micro-server/blob/master/micro-core/src/test/java/app/async/com/aol/micro/server/AsyncResource.java