似乎无法让Future在Scala中运行回调

时间:2014-07-15 19:59:20

标签: scala elasticsearch future

(我不包括进口产品,以免弄乱这个问题)

(这是最简单的Scala应用程序(使用Typesafe Activator上的scala-minimal模板创建))

我试图对Elasticsearch Server运行查询。

我在 sbt console 上运行了相同的代码,我可以看到结果正常。

但是,当我运行以下代码时,我会看到"END"(回调后的代码)被打印,但是Success回调和Failure回调都没有运行。

我是斯卡拉诺布,所以也许我在这里做错了什么? 此代码编译。(只是为了让您知道所有导入都在那里)

object Hello{
  def main(args: Array[String]): Unit = {
  val client = ElasticClient.remote("vm-3bsa", 9300)

  val res:Future[SearchResponse] = client.execute{ search in "vulnerabilities/3bsa" query "css" }

  res onComplete{
    case Success(s) => println(s)
    case Failure(t) => println("An error has occured: " + t)
  }

  println("END")
  //EDIT start
  Await.result(res,10.seconds)
  //EDIT end
  }
}

最终编辑

而不是使用onComplete,如果我打印调用Await.result的结果,它就有效:

val await=Await.result(res,10.seconds)
println(await)
// results shown

1 个答案:

答案 0 :(得分:2)

主线程将注册您的onCompleteprintln("END"),然后退出,这会使程序终止,因此您永远不会看到您的onComplete回调。

您可以使用Await.result(future, timeout)阻止主线程使其保持活动状态,直到答案到达为止。在服务器上下文中,这是一个很大的禁忌,但在像这样的小应用程序中,阻塞一个线程不是一个问题。