【问题标题】:How to do async calls in PlayFramework 2 in service layer?如何在服务层的 PlayFramework 2 中进行异步调用?
【发布时间】:2014-01-28 19:49:30
【问题描述】:

我是框架 2 的新手。我看过很多关于异步调用的示例,例如: JavaAsync。但是,它们都发生在“控制器”层。这意味着函数组合的结果在这些示例中始终是“结果”对象,并且我没有看到任何其他示例返回“结果”以外的任何内容。话虽如此,由于设置不同,我需要返回一个布尔值。这是我的设置:

我有一个服务层。因此,我的控制器从用户那里获取请求,将其传递给我的服务层,我的服务层与外部服务(在我的情况下为弹性搜索)对话,外部服务将结果发送给它,我的服务层获取它并将其传递给控制器,... .

我的问题是我的异步调用发生在服务层(顺便说一句,我正在使用 play2-elasticsearch 插件以防万一):

@Override public Boolean saveTask(TaskInfo taskInfo){ final TaskEntity taskEntity = EntityTransformer.createNewTaskEntity(taskInfo); // save to es F.Promise indexResponsePromise = taskEntity.indexAsync(); return indexResponsePromise.map(new F.Function() { @Override public Boolean apply(IndexResponse indexResponse) throws Throwable { if (indexResponse.getId().equals(taskEntity.id.toString())) { return Boolean.TRUE; } else { return Boolean.FALSE; } } }); }

有了上面的代码,我收到一条错误消息,告诉我 saveTask 方法应该返回一个“F.Promise”。现在的问题:

  1. 我怎样才能只返回“布尔”而不是“F.Promise”?
  2. 如果返回 'F.Promise',如何从中获取价值?

谢谢!

【问题讨论】:

  • 您希望使用冗长操作的弹性搜索调用返回一个布尔值?我建议你删除返回类型并将其替换为在承诺中执行的回调

标签: java asynchronous playframework-2.0 promise


【解决方案1】:

返回布尔值的唯一方法是阻塞调用线程,直到回复到达,这将是一件坏事(tm)。

一个好的选择(乍一看可能看起来很糟糕)是让异步性通过你的层泄漏出来。所以,你让你的控制器异步,让你的服务层返回 F.Promise。这样你就可以让你的控制器方法完全异步,并对到达的布尔值做出反应,然后创建一个 http 回复。

【讨论】:

    【解决方案2】:

    以下是 Play Framework google 小组的回复:

    我认为为了更好地了解情况,我们需要退后一步。

    当您进行异步操作时,您面临着一个选择。您可以是端到端异步的,也可以在某个时候阻塞并避免异步(但要付出代价!)。

    因此,回答您的问题,理想情况下,saveTake 将返回 F.Promise<Boolean>,而不是 Boolean。然后任何调用 saveTask 都会异步地对该布尔值进行操作,依此类推,直到您到达控制器。然后控制器将采用Future<Result> 而不是简单的Result。那时,该代码路径从头到尾都是异步的。 (好吧,忽略代码库中发生的任何其他事情)

    一旦你有了F.Promise<Boolean>,你就可以在F.Promise上使用各种高阶函数来异步操作。例如,如果您查看 F.Promise 的 API,您会看到 map 函数。

    您将创建一个F.Function,它将Boolean 作为其唯一的输入参数并返回一个B(无论B 是什么,因为F.Function 是通用的)。这称为映射。

    您可以在执行过程中将这些函数链接到您的 Promise 上,而不是直接对您的布尔值进行操作,仅在前面的结果可用时执行每个函数,并且所有这些都将异步完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多