2017-09-12 3 views
0

나는이 응용 프로그램이 정확히 화면에 10 개의 행을 인쇄 예상 실행되는 Alpakka 카산드라 도서관왜 Akka Streams 응용 프로그램이 정상적으로 종료되지 않습니까?

package com.abhi 

import akka.actor.ActorSystem 
import akka.stream.{ActorMaterializer, ClosedShape} 
import akka.stream.alpakka.cassandra.scaladsl.CassandraSource 
import akka.stream.scaladsl.{Flow, GraphDSL, RunnableGraph, Sink} 
import com.datastax.driver.core.{Cluster, Row, SimpleStatement} 
import scala.concurrent.Await 
import scala.concurrent.duration._ 

object MyApp extends App { 
    implicit val actorSystem = ActorSystem() 
    implicit val actorMaterializer = ActorMaterializer() 
    implicit val session = Cluster 
     .builder 
     .addContactPoints(List("localhost") :_*) 
     .withPort(9042) 
     .withCredentials("foo", "bar") 
     .build 
     .connect("foobar") 
    val stmt = new SimpleStatement("SELECT col1, col2 FROM foo").setFetchSize(20) 
    val source = CassandraSource(stmt) 
    val toFoo = Flow[Row].map(row => Foo(row.getLong(0), row.Long(1))) 
    val sink = Sink.foreach[Foo](foo => println(foo.col1, foo.col2)) 
    val graph = RunnableGraph.fromGraph(GraphDSL.create(sink){ implicit b => 
     s => 
     import GraphDSL.Implicits._ 
     source.take(10) ~> toFoo ~> s 
     ClosedShape 
    }) 
    // let us run the graph 
    val future = graph.run() 
    import actorSystem.dispatcher 
    future.onComplete{_ => 
     session.close() 
     Await.result(actorSystem.terminate(), Duration.Inf) 
    } 
    Await.result(future, Duration.Inf) 
    System.exit(0) 
} 

case class Foo(col1: Long, col2: Long) 

를 사용하여이 간단한 응용 프로그램을 썼다.

하지만 게시 중단. System.exit(0) 호출이 실행될 때 예외를

Exception: sbt.TrapExitSecurityException thrown from the UncaughtExceptionHandler in thread "run-main-0" 

을 던졌습니다하지만 여전히 응용 프로그램이 실행을 중지하지 않습니다. 그것은 단지 매달린다.

나는이 응용 프로그램 (사실조차하는 System.exit (0) 호출을 필요가 없습니다 정상적으로 종료되지 않는 이유를 이해하지 않습니다.

이 응용 프로그램을 종료 할 수있는 유일한 방법을 제어 C를 통해입니다 .

답변

2

SBT가 자신의 JVM 인스턴스에서 코드를 실행하기 때문에이 일어날 수, 당신의 System.exit 것이다 다음 위의 결과를 제공 출구 SBT의 JVM

당신이 설정을 시도해 봤어 :.? fork in run := true을 어딘가에 SBT 빌드에서

actorSystem.dispatcher을 사용하여 onComplete 콜백을 실행하는 것이 좋습니다 (배우 시스템 자체의 종료를 기다리는 데 사용하기 때문에). 대신 시도 할 수

뭔가 : JVM이 당신이 남아있는 유일한 스레드가 데몬 스레드 때 System.exit를 호출 할 필요없이 종료됩니다

import actorSystem.dispatcher 
future.onComplete{ _ => 
    session.close() 
    actorSystem.terminate() 
} 
Await.result(actorSystem.whenTerminated, Duration.Inf) 

주 (예를 What is Daemon thread in Java? 참조).

관련 문제