2016-02-23 4 views
7

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

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

ответ

9

Поскольку Akka использует non-daemonic threads, поэтому он будет держать приложение работает до тех пор, пока запорно-вниз ActorSystem. Это объясняется тем, что типичный вариант использования - просто запустить систему в вашем основном методе, а затем все вычисления происходят в потоках, которыми управляет ActorSystem (т. Е. Поток main() оставлен для завершения и уходит - если потоки будут демоническими, приложение закрывается вниз, чего мы обычно не хотим).

Вы можете сделать это с помощью:

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

Answered в 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() } 
Смежные вопросы