我正在使用Elastic4s(Scala Client for ElasticSearch)。
我可以通过等待来检索multiGet结果:
mongooseService.connect
但我已经读过,在实践中最好避免这种“.await”。 我们怎么做?谢谢
答案 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返回;如果您不需要它,请使用onComplete
或andThen
,因为它们会使错误处理更加容易。
有关期货处理的更多详细信息,请参见https://docs.scala-lang.org/overviews/core/futures.html,有关一些好的示例,请参见https://alvinalexander.com/scala/concurrency-with-scala-futures-tutorials-examples。