繁体   English   中英

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

[英]Asynchronous rest calls non sequential in Java

我在一次通话中对第三方应用程序进行了多次同步调用。 我正在使用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))

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

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

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

例如

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM