Я не уверен на 100%, чего вы надеетесь достичь, без дополнительного контекста. Я подозреваю, что ответ @ lasekio , скорее всего, именно то, что вы ищете.
Но если вы ищете решение для асинхронной потоковой передачи, то есть если вы хотите обрабатывать строки по мере их поступления, а не ждать, пока они все не станут доступными (возможно, потому, что в памяти больше строк, чем уместится - миллионы / миллиарды), тогда, ну, тогда вы должны использовать Akka Streams. Но так как кажется, что вы против этого, вот альтернатива, которая является чистой Akka + Futures:
Актер будет возвращать строку, а также будущее следующей строки. Поскольку вам нужен способ указать, что строк больше нет, я обертываю результат в Option
в моем примере, где Some
содержит Row
и будущее следующего Row
, а None
означает, что больше нет строк. Вы также можете создать отдельный тип или использовать null
, просто что-то, что ясно указывает на отсутствие дальнейших данных. На стороне актера, вы бы сделали:
case _: Bar =>
if (/*... there are more rows...*/) sender() ! Some((Row(), (context.self ? Bar()))
else sender() ! None
На стороне потребителя:
def consumeRows(rowsFut: Future[Option[(Row,Future[_])]]): Unit = {
rowsFut.foreach {
_.foreach {
case (row: Row, nextRowsFut: Future[Option[(Row,Future[_])]]) =>
// Do something with row
println(row)
consumeRows(nextRowsFut)
}
}
val rowsFut = ask(foo, Bar())(1 seconds).mapTo[Option[(Row,Future[_])]]
consumeRows(rowsFut)