当前位置: 首页 > 知识库问答 >
问题:

Java中的异步rest调用是非顺序的

程俊誉
2023-03-14

我在一次调用中有多个对第三方应用程序的同步调用。我正在使用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
        }
    }

现在,当我进行rest调用时,我的rest代码被阻止,直到我从请求的URL获得响应为止。我曾尝试使用AsyncRestTemplate和SimpleReact API,但我面临以下问题。我有一系列的rest调用,我不能在下面的代码中直接提供URL列表,因为我不想将rest调用代码与实际的应用程序流混为一谈。

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

如果有人能帮助我如何在我的情况下进行异步Rest呼叫。

共有1个答案

萧晔
2023-03-14

我不确定我是否完全理解这个问题,但我想可能是如何在一些简单的react示例代码和op自己的代码之间架起一座桥梁?

如果有帮助的话,您不必使用URL作为SimpleReact的输入,例如,您可以使用任何Java8供应商。只需使用标准的SpringRESTTemplate(即非NIO同步Rest调用),您就可以在简单的react中使用类似的方式使代码异步-

例如。

 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并返回一个完整的未来。您可以将这些可完成的未来推到简单的react中,如下所示

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

在我们的另一个开源项目Microserver中,有一个使用异步NIO Rest客户端和simple react的例子。e、 g(https://github.com/aol/micro-server/blob/master/micro-core/src/test/java/app/async/com/aol/micro/server/AsyncResource.java )

 类似资料:
  • 为了实现上面的逻辑,我需要客户机发送他的监听器信息和请求(基本上是URI)。这是在处理完请求后,将请求状态更新到客户端。 使用JAX-RS处理长时间运行的操作

  • 我可能还不够清楚--情况是,我的现有代码不支持异步,我希望使用新的库,如System.net.http和只支持异步方法的AWS SDK。因此,我需要弥补这一差距,并能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法。 我读了很多书,有很多次有人问这个问题,也有人回答这个问题。 从非异步方法调用异步方法

  • 问题内容: 我有以下代码: 但是,当我执行此代码时,在图形 之前 会收到响应“ hello” 。为什么会这样呢?我将如何改变它以便我首先得到图形? 问题答案: 异步,您永远不知道哪个函数先运行\先完成… 想想异步操作,例如告诉一群人跑1英里,您知道谁会先完成吗?(是的,乔恩·斯基特,然后是查克·诺里斯…) 您可以使用Callack来运行第二个ajax:

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?

  • 我有一些异步服务,我想在 Xamarin 应用程序的不同位置调用这些服务。我使用 Prism 从本机 UWP 应用移植我的代码。 前段时间,我能够通过声明制作方法来做到这一点,例如 或者 在那里等候。然而,它停止了工作。 尝试使用GetAwaiter()。GetResault()会阻止执行并导致死锁。 这有点奇怪,考虑到INavigationService.NavigateAsync本身是异步方法