Мы используем Elasticsearch 0.90.7 в нашем приложении Scala Play Framework, где конец нашего метода «doSearch» выглядит так:
def doSearch(...) = {
...
val actionRequessBuilder: ActionRequestBuilder // constructed earlier in the method
val executedFuture: ListenableActionFuture<Response> = actionRequestBuilder.execute
return executedFuture.actionGet
}
где ListenableActionFuture
расширяет java.util.concurrent.Future
, а ListenableActionFuture#actionGet
в основном совпадает с Future#get
Все это прекрасно работает, когда мы выполняем поиск последовательно, однако, когда мы пытаемся выполнить несколько поисков параллельно:
val search1 = scala.concurrent.Future(doSearch(...))
val search2 = scala.concurrent.Future(doSearch(...))
return Await.result(search1, defaultDuration) -> Await.result(search2, defaultDuration))
мы иногда (менее 1 или 2% времени) получаем неожиданные тайм-ауты на наших фьючерсах scala, даже при использовании чрезвычайно длительного тайм-аута во время qa (5 секунд, где поиск всегда выполняется менее чем за 200 мс). Это также происходит при использовании глобального контекста выполнения scala, а также при использовании контекста выполнения Play по умолчанию.
Происходит ли здесь какое-то неожиданное взаимодействие из-за того, что будущее java заключено в будущее Scala? Я бы подумал, что actionGet
вызов java-фьючерса в конце doSearch
предотвратит взаимодействие двух фьючерсов друг с другом, но, очевидно, это может быть не так.
do while(i < 100) { i = i + 1; val f1 = Future(doSearch(...)); val f2 = Future(doSearch(...)); Await(f1, defaultDuration); Await(f2, defaultDuration)}
) не вызывают проблемы; Я продолжу играть с этим, чтобы постоянно получать ошибку - person Zim-Zam O'Pootertoot   schedule 17.03.2014