scala - El futuro no está completo?
stream future (2)
object Executor extends App {
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
implicit val ec = system.dispatcher
import akka.stream.io._
val file = new File("res/AdviceAnimals.tsv")
import akka.stream.io.Implicits._
val foreach: Future[Long] = SynchronousFileSource(file)
.to( Sink.outputStream(()=>System.out))
.run()
foreach onComplete { v =>
println(s"the foreach is ${v.get}") // the will not be print
}
}
pero si cambio el Sink.outputStream(()=>System.out)
a Sink.ignore
, se println(s"the foreach is ${v.get}")
.
¿Alguien puede explicar por qué?
No está esperando que se complete la secuencia, en su lugar se completará su método principal (el cuerpo del ejecutor) y, dado que el método principal finaliza, la JVM se cerrará.
Lo que quiere hacer es bloquear ese hilo y no salir de la aplicación antes de que el futuro se complete.
object Executor extends App {
// ...your stuff with streams...
val yourFuture: Future[Long] = ???
val result = Await.result(yourFuture, 5 seconds)
println(s"the foreach is ${result}")
}
Coincidentemente, creé casi la misma aplicación para probar / jugar con Akka Streams. ¿Podrían las implícitas importadas causar el problema? Esta aplicación funciona bien para mí:
object PrintAllInFile extends App {
val file = new java.io.File("data.txt")
implicit val system = ActorSystem("test")
implicit val mat = ActorMaterializer()
implicit val ec = system.dispatcher
SynchronousFileSource(file)
.to(Sink.outputStream(() => System.out))
.run()
.onComplete(_ => system.shutdown())
}
Tenga en cuenta la detención de ActorSystem en ''onComplete''. De lo contrario, la aplicación no saldrá.