是否有可能避免使用Elastic4s .await

时间:2018-04-24 09:05:29

标签: async-await elastic4s

我正在使用Elastic4s(Scala Client for ElasticSearch)。

我可以通过等待来检索multiGet结果:

mongooseService.connect

但我已经读过,在实践中最好避免这种“.await”。 我们怎么做?谢谢

2 个答案:

答案 0 :(得分:0)

你不应该使用.await,因为你正在阻止线程等待将来返回。

相反,你应该像处理任何其他返回期货的API一样处理未来 - 无论是反应性mongo,akka.ask还是其他什么。

答案 1 :(得分:0)

我意识到这很老了,但是如果有人碰到它,最简单的处理方法是:

val client = HttpClient(ElasticsearchClientUri(esHosts, esPort))
val respFuture = client.execute {
  multiget(
    get(C1) from "mlphi_crm_0/profiles" fetchSourceInclude("crm_events"),
    get(C2) from "mlphi_crm_0/profiles" fetchSourceInclude("crm_events"),
    get(C3) from "mlphi_crm_0/profiles" fetchSourceInclude("crm_events")
  )
}

respFuture.map(resp=> ...[do stuff with resp.items])

这里的关键是,您的处理实际上是在子线程中进行的,Scala会在数据准备就绪时(仅在任何时候)为您服务。呼叫者在respFuture.map()之后立即保持运行。 map(()=>{})返回中的任何函数都将作为新的Future返回;如果您不需要它,请使用onCompleteandThen,因为它们会使错误处理更加容易。

有关期货处理的更多详细信息,请参见https://docs.scala-lang.org/overviews/core/futures.html,有关一些好的示例,请参见https://alvinalexander.com/scala/concurrency-with-scala-futures-tutorials-examples