Почему эта простая программа Akka Streams никогда не завершается?

Должен быть простой вопрос. Я использую Akka 2.4.2 (содержит Akka Streams и HTTP). Я ожидал, что это Source завершится и программа завершится, потому что Source конечно, но этого никогда не происходит. Почему эта программа не завершается?

import scala.concurrent._
import scala.collection.immutable._
import akka._
import akka.actor._
import akka.stream._
import akka.stream.scaladsl._
import akka.util._

object Test extends App {

  implicit val system = ActorSystem("TestSystem")
  implicit val materializer = ActorMaterializer()

  val s = Source.single(1)
  s.runForeach(println)
}

Выход:

$ sbt run
...
[info] Running Test
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] logger log1-Logging$DefaultLogger started
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] Default Loggers started
1

Соответствующая часть моего файла build.sbt:

scalaVersion  := "2.11.7"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")

libraryDependencies ++= {
  val akkaVersion = "2.4.2"
  Seq(
    "com.typesafe.akka" %%  "akka-stream" % akkaVersion
  )
}

person Matthew Adams    schedule 23.02.2016    source источник


Ответы (2)


Поскольку Akka использует не демонические потоки, он сохранит приложение работает до тех пор, пока вы не закроете ActorSystem. Это связано с тем, что типичным вариантом использования является запуск системы в вашем основном методе, а затем все вычисления происходят в потоках, которыми управляет ActorSystem (т. е. поток main() остается для завершения и уходит — если потоки будут демоническими, приложение будет закрыто. , что обычно нам не нужно).

Вы можете сделать это через:

import system.dispatcher
s.runForeach(println).onComplete { _ =>  system.terminate() }
person Konrad 'ktoso' Malawski    schedule 23.02.2016

Ответ на https://groups.google.com/d/msg/akka-user/u3MXlfVpm40/LHyYruS0HgAJ от https://stackoverflow.com/users/111024/konrad-ktoso-malawski, скопировано сюда для удобства; кредит ему:

Поскольку Akka использует недемонические потоки, приложение будет работать до тех пор, пока вы не выключите ActorSystem.

Вы можете сделать это через:

import system.dispatcher
s.runForeach(println).onComplete { _ =>  system.terminate() }
person Matthew Adams    schedule 23.02.2016