Future在Play Framework中无法可靠地完成

时间:2014-07-16 10:05:06

标签: scala playframework-2.0 future

使用Play Framework 2.3的一段代码

def signup = Action(parse.json) { implicit request =>
  val email = (request.body \ "email").asOpt[String]

  val holder =
    WS.url("https://foobar.com/foo")
      .withAuth("1234","5678",WSAuthScheme.BASIC)

  val data = Json.obj(
    "email" -> email,
  )

  holder.post(data)
  Ok("OK")
}

此代码将在我的计算机上本地运行时执行post(),但在远程计算机上不可靠。根据我的理解,post()调用应该创建并返回一个future,signup()返回Ok(),将来在默认的ExecutionContext上运行,并在某些时候完成并清理。显然事实并非如此。

我已经将函数更改为Action.async,现在正在等待Future:

val res = holder.post(data)
res.map( x => Ok(Json.obj("status" -> "OK"))) recover {
  case (e: Exception) =>
    InternalServerError(Json.obj("status" -> "Not OK."))
}

这可靠地运作。因此,我的问题是:

  • 为什么第一个版本无法可靠运行?
  • 我一般如何"分叉"一个长期运行的程序,无意等待它,纯粹是因为它的副作用,如果不像我在版本1中那样?

1 个答案:

答案 0 :(得分:1)

几乎不可能说出为什么Future无法可靠地完成"但是我猜测有什么东西您尝试联系的网络服务有问题。 SSL问题,未达到超时,......可能性很大而不知道抛出什么异常(如果有的话)。

如果您不想等待WS通话,可以使用onComplete回调:

val res = holder.post(data)

res.onComplete {
    case Success(response) =>
        // Create some side-effect to the response
    case Failure(e) =>
        // The `Future` failed.
}