Search code examples
akka-stream

Why does this simple Akka Streams program never terminate?


Should be a simple question. I'm using Akka 2.4.2 (contains Akka Streams & HTTP). I expected this Source to complete & the program to terminate because the Source is finite, but it never does. Why doesn't this program terminate?

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

Output:

$ 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

Relevant portion of my build.sbt file:

scalaVersion  := "2.11.7"

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

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

Solution

  • Because Akka uses non-daemonic threads, so it'll keep the app running until you shut-down the ActorSystem. That's because the typical use case is to start the system in your main method and then all computation happens on threads that the ActorSystem manages (i.e. the main() thread is left to complete and go away - if the threads would be daemonic the app would shut down, which is not what we usually want).

    You can do so via:

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