2016-02-23 7 views
7

Sollte eine einfache Frage sein. Ich benutze Akka 2.4.2 (enthält Akka Streams & HTTP). Ich erwartete, dass Source & das Programm beendet, weil die Source endlich ist, aber es nie tut. Warum endet dieses Programm nicht?Warum hört dieses einfache Programm von Akka Streams niemals auf?

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

Ausgang:

$ 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 

Relevante Teil meiner build.sbt Datei:

scalaVersion := "2.11.7" 

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

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

Antwort

9

Da Akka non-daemonic threads verwendet, so dass es die App am Laufen halten werde, bis Sie die ActorSystem Abfahren. Das liegt daran, dass der typische Anwendungsfall darin besteht, das System einfach in der Hauptmethode zu starten, und dann alle Berechnungen auf Threads durchführt, die das ActorSystem verwaltet (dh der Thread main() wird abgeschlossen und weggehen - wenn die Threads dämonisch wären, würde die App geschlossen werden runter, was wir normalerweise nicht wollen).

können Sie tun dies über:

import system.dispatcher 
s.runForeach(println).onComplete { _ => system.terminate() }