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

Play2使用AsyncResult(Java)调用多个Web服务

凤昊东
2023-03-14

我有一个Java的Play 2.1控制器,需要调用一个外部的webservice来获取一些数据。然后有了这个数据结果,我必须用n次调用调用另一个web服务,对应于第一个web service调用的n个结果。

对于性能问题,我想使用 promise 在单独的线程中进行 n 次调用。

所以我会有一个这样的循环:

List<String> firstResults = WS.url("http://...") ///...blablabla

for(String keyword : firstResults){
  Promise<ResultType> promise = play.libs.Akka.future(
    new Callable<ResultType>() {
      public Integer call() {
        return //...
      }
    }
  );}

如何使用异步API同步n个promise,然后在一个响应(所有结果的列表)中减少结果,然后仅在所有调用完成时返回http响应?

由于无法知道通话次数,问题变得更加困难……(我无法将promise声明为promise人1、promise人2等)

共有1个答案

牟黎昕
2023-03-14

Promise.waitAll是你想要的:

List<String> firstResults = WS.url("http://...") ///...blablabla

List<Promise<? extends ResultType>> webServiceCalls = new ArrayList<>;
for(String keyword : firstResults){
  Promise<ResultType> promise = WS.url("http://...?keyboard=" + keyword).get().map(
    // function of Response to ResultType
  );
  webServiceCalls.add(promise);
}

// Don't be confused by the name here, it's not actually waiting
Promise<List<ResultType>> results = Promise.waitAll(webServiceCalls);

return async(results.map(new Function<List<ResultType, Result>>() {
  public Result apply(List<ResultType> results) {
    // Convert results to ResultType
  }
});
 类似资料:
  • 我在Scala上使用Play 2.5,我创建了一个类,可以多次调用外部web服务。 外部Web服务在某些条件下被调用并得到ok或nok的简单响应。如果可以,那么我应该更新内部对象状态,如果可以,我现在什么也不做。 这是我的类,它将String的列表作为参数,并返回要在控制器中处理的对象的Future列表。 是列表类型的列表,但我希望它只是一个简单的响应列表。 1)如何简化和纠正我的代码以获得响应列

  • 我正在尝试并行运行15个服务,每个服务将向不同的客户发送邮件。提取标准因服务而异 服务1、服务2、服务3。。。。服务15。每个类都扩展了NotificationService类。 NotificationService类具有方法extractRecipients()、sendMail()、sendSMS()、logNotification()。 所有的Service类[1到15]都有进程()方法,

  • 问题内容: 我用来调用Firebase请求函数,并在请求完成后得到通知,以便能够处理结果。在这种情况下,我只是打印了一条语句。 这段代码工作正常。 问题 在于,在运行时,数据将被添加到Firebase数据库中。这就是为什么我必须使用而不是。 这意味着在运行时会有一个观察者,并且如果数据已添加到数据库中,则将再次调用其中的块。 一旦发生这种情况,该应用就会崩溃,因为没有调用。只要我说对了。 如果将其

  • 当我调用服务时,我会得到一个错误。我尝试了所有我能找到的解决办法 错误全文:

  • 我正在使用Camel,并使用CXF从WSDL生成代码。我生成了一个客户端存根,实现如下所示: 如您所见,端口接受两个参数并返回响应,我想将其委托回我的骆驼路由。在 Camel 中实现这一点的最佳方法是什么?我已经定义了我的 CXF Enpoint,我只是在努力解决其中的 DSL 路由部分。我应该添加像此链接中那样的处理器吗?Apache Camel和Web服务 谢谢

  • 问题内容: 在我的Web服务器应用程序中,我有一个方法,该方法可以修改xml文档并看起来类似于: 使用的zip归档文件包含需要修改的xml文件和其他一些文件。如何区分使用的xml文件和方法内部的归档以及应该使用哪种方法参数来表示此使用的资源? 问题答案: 一种解决方案是只读取。您可以将包裹在中。有了,您可以得到with ,然后可以得到与文件名。然后只要检查名称即可。 不过,您需要消耗。这是一个简单