Бъдещето не е пълно?

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
  }
}

но ако променя Sink.outputStream(()=>System.out) на Sink.ignore, println(s"the foreach is ${v.get}") ще се отпечата.

Може ли някой да обясни защо?


person daixfnwpu    schedule 09.08.2015    source източник
comment
Извлечете израза от вътрешността на низа. val vGet = v.get; println(s"the foreach is $vGet") -- Какво се случва тогава?   -  person Bob Dalgleish    schedule 09.08.2015
comment
Имам опит, но не успех, предполагам, че Sink.outputStream(()=>System.out) са блокирали. но не знаех защо?   -  person daixfnwpu    schedule 10.08.2015
comment
Какво имаш предвид, не успех? Какъв е симптомът? Все още ли получавате съобщение, че бъдещето не е пълно? O/w вие имате различен проблем. Силно подозирам, че трябва да прочетете документацията за това какъв аргумент onComplete приема.   -  person Bob Dalgleish    schedule 10.08.2015


Отговори (2)


Вие не чакате потокът да завърши, вместо това вашият основен метод (тялото на Executor) ще завърши и тъй като главният метод е готов, излиза, JVM се изключва.

Това, което искате да направите, е да блокирате тази нишка и да не излизате от приложението, преди бъдещето да завърши.

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}")

  // stop the actor system (or it will keep the app alive)
  system.terminate()
}
person johanandren    schedule 10.08.2015
comment
Е, не е напълно вярно, тъй като приложението няма да излезе, докато ActorSystem не бъде изключен. - person Joost den Boer; 26.09.2015

Случайно създадох почти същото приложение за тестване/игра с Akka Streams. Възможно ли е импортираните неявни да причинят проблема? Това приложение работи добре за мен:

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())
}

Обърнете внимание на спирането на ActorSystem в 'onComplete'. В противен случай приложението няма да излезе.

person Joost den Boer    schedule 26.09.2015