2016-02-23 17 views
7

Powinno być proste pytanie. Używam Akka 2.4.2 (zawiera strumień Akka & HTTP). Spodziewałem się, że to zakończy program, aby zakończyć, ponieważ jest skończony, ale nigdy nie ma. Dlaczego ten program się nie kończy?Dlaczego ten prosty program Akka Streams nigdy się nie kończy?

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

wyjściowa:

$ 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 

odpowiednią częścią mojego build.sbt pliku:

scalaVersion := "2.11.7" 

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

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

Odpowiedz

9

Ponieważ Akka wykorzystuje non-daemonic threads, więc będzie to zachować aplikację działa aż do wyłączenia ActorSystem. Dzieje się tak, ponieważ typowym przypadkiem użycia jest po prostu uruchomienie systemu w głównej metodzie, a następnie wszystkie obliczenia odbywają się na wątkach zarządzanych przez ActorSystem (tj. Wątek main() jest pozostawiony do ukończenia i odejdzie - jeśli wątki będą demoniczne, aplikacja zostanie zamknięta w dół, co nie jest tym, czego zwykle chcemy).

Można to zrobić poprzez:

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