scala - 使用响应式(Reactive) mongo 驱动程序时,控制台 Scala 应用程序不会停止

标签 scala console-application reactivemongo

我正在通过 Reactive Mongo 驱动程序使用 Mongo 数据库

import org.slf4j.LoggerFactory

import reactivemongo.api.MongoDriver
import reactivemongo.api.collections.default.BSONCollection
import reactivemongo.bson.BSONDocument

import scala.concurrent.Future
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

object Main {

  val log = LoggerFactory.getLogger("Main")

  def main(args: Array[String]): Unit = {

    log.info("Start")

    val conn = new MongoDriver().connection(List("localhost"))
    val db = conn("test")

    log.info("Done")

  }
}

我的 build.sbt文件:
lazy val root = (project in file(".")).
  settings(
    name := "simpleapp",
    version := "1.0.0",
    scalaVersion := "2.11.4",
    libraryDependencies ++= Seq(
      "org.reactivemongo" %% "reactivemongo" % "0.10.5.0.akka23",
      "ch.qos.logback" % "logback-classic" % "1.1.2"
    )
  )

当我运行时:sbt compile run
我得到这个输出:
$ sbt compile run
[success] Total time: 0 s, completed Apr 25, 2015 5:36:51 PM
[info] Running Main 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
17:36:52.328 [run-main-0] INFO  Main - Start
17:36:52.333 [run-main-0] INFO  Main - Done

并且应用程序不会停止....:/

我必须按 Ctrl + C 才能杀死它

我读过 MongoDriver()创建 ActorSystem所以我尝试使用 conn.close() 手动关闭连接但我明白了:
[info] Running Main 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
17:42:23.252 [run-main-0] INFO  Main - Start
17:42:23.258 [run-main-0] INFO  Main - Done
17:42:23.403 [reactivemongo-akka.actor.default-dispatcher-2] ERROR reactivemongo.core.actors.MongoDBSystem - (State: Closing) UNHANDLED MESSAGE: ChannelConnected(-973180998)
[INFO] [04/25/2015 17:42:23.413] [reactivemongo-akka.actor.default-dispatcher-3] [akka://reactivemongo/deadLetters] Message [reactivemongo.core.actors.Closed$] from Actor[akka://reactivemongo/user/$b#-1700211063] to Actor[akka://reactivemongo/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [04/25/2015 17:42:23.414] [reactivemongo-akka.actor.default-dispatcher-3] [akka://reactivemongo/user/$a] Message [reactivemongo.core.actors.Close$] from Actor[akka://reactivemongo/user/$b#-1700211063] to Actor[akka://reactivemongo/user/$a#-1418324178] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

而且应用程序也不会退出

那么,我做错了什么?我找不到答案...

在我看来,官方文档根本没有解释我是否应该关心优雅关机。

我对控制台应用程序没有太多经验,我在我的项目中使用 play 框架,但我想创建与 mongodb 一起使用的子项目

我看到许多模板(在激活器中),例如:Play + Reactive Mongo、Play + Akka + Mongo 但没有 Scala + Reactive Mongo 可以解释如何正常工作:/

最佳答案

我遇到了同样的问题。我找到的解决方案是在对象、驱动程序和连接上调用 close:

val driver = new MongoDriver
val connection = driver.connection(List("localhost"))
...
connection.close()
driver.close()

如果您只关闭连接,那么 akka 系统将保持事件状态。

使用 ReactiveMongo 0.12 测试

关于scala - 使用响应式(Reactive) mongo 驱动程序时,控制台 Scala 应用程序不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866051/

相关文章:

scala - Play Framework 2 (Scala) 模板 : see if user is logged in

scala - 烫金比较连续记录

c# - 如何从一个线程使用 Console.ReadLine 并从另一个线程使用 ConsoleKeys?

c# - 检查是否在控制台应用程序 C# 中按下了任何键

c# - 从 Facebook 获取我的 friend

mongodb - 使用 Play Framework、ReactiveMongo 批量插入/插入多个

scala - 如何在 Play 2 中从 ReactiveMongo 返回 JSON 的枚举器

scala - 在 scala 2.7.5 中对迭代器进行分区

mongodb - Play-ReactiveMongo 插件 : play2 testing a controller with a reactiveMongoApi

scala - 当类层次结构中有原始类型时,为什么 Scala 会提示非法继承?