2017-01-13 13 views
1

У меня есть приложение this с использованием потоков Akka и ReactiveMongo. Нет субъектов, определенных пользователем. Приложение запускается из метода main.Как прекратить актерскую систему Akka от основного метода?

Проблема заключается в том, что JVM продолжает работать навсегда после того, как метод main завершен. Это то, что я делаю сейчас:

val g = (file: String) => RunnableGraph.fromGraph(GraphDSL.create(Sink.ignore) { 
    implicit builder => 
    sink => 
     import GraphDSL.Implicits._ 

     // Source 
     val A: Outlet[(String, String)] = builder.add(Source.fromIterator(() => parseMovies(file).iterator)).out 
     // Flow 
     val B: FlowShape[(String, String), Either[String, Movie]] = builder.add(findMovie) 
     // Flow 
     val C: FlowShape[Either[String, Movie], Option[String]] = builder.add(persistMovie) 

     A ~> B ~> C ~> sink.in 

     ClosedShape 
}) 

def main(args: Array[String]): Unit = { 
    require(args.size >= 1, "Path to file is required.") 

    g(args(0)).run 
    .onComplete(_ => Await.result(system.terminate(), 5.seconds)) 
} 

Я прочитал this нить, и this, ни один из которых работают. system.shutdown устарел, и у меня нет каких-либо явных актеров для просмотра. Я могу позвонить system.exit, но это не изящно.

Из журналов выясняется, что Акка пытается закрыть, но затем я вижу кучу сообщений Монго.

2017-01-13 11:35:57.320 [DEBUG] a.e.EventStream.$anonfun$applyOrElse$4 - shutting down: StandardOutLogger started 
2017-01-13 11:36:05.397 [DEBUG] r.c.a.MongoDBSystem.debug - [Supervisor-1/Connection-2] ConnectAll Job running... Status: {{NodeSet None Node[localhost:27017: Primary (10/10 available connections), latency=6], auth=Set() }} 
2017-01-13 11:36:05.420 [DEBUG] r.c.a.MongoDBSystem.debug - [Supervisor-1/Connection-2] RefreshAll Job running... Status: {{NodeSet None Node[localhost:27017: Primary (10/10 available connections), latency=6], auth=Set() }} 
// more of MongoDBSystem.debug messages 

Почему не it.just.die?

+2

Вы должны закрыть 'MongoDriver' должным образом, как это управление собственной основной Actor системой, доступ, который вы никогда не должен (не может) напрямую – cchantep

+0

@cchantep Вы можете быть более конкретным или показать пример кода? Закрытие монгольской связи не помогло. –

+0

Если вы внимательно прочитали, я упомянул «MongoDriver», а не «MongoConnection» – cchantep

ответ

0

Я думаю, что вы хотите добавить выключение крючка или позвоните actorSystem.registerOnTermination(driver.close()):

def main(args: Array[String]): Unit = { 
    import akka.actor.CoordinatedShutdown 
    require(args.size >= 1, "Path to file is required.") 

    CoordinatedShutdown(system).addTask(CooordinatedShutdown.PhaseBeforeActorSystemTerminate, "shutdownMongoDriver") {() => driver.close(5.seconds); Future.successful(Done) } 

    g(args(0)).run.onComplete(_ => CoordinatedShutdown(system).run())  
}