使用反应式mongo驱动程序

时间:2015-04-25 13:52:49

标签: 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'. 

app也不会退出

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

在我看来,官方文档并没有解释我是否应该关心优雅的关闭。

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

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

2 个答案:

答案 0 :(得分:2)

这看起来像Reactive Mongo的已知问题see the relevant thread on GitHub

pull request #241 by reid-spencer中引入了此修复程序,于2015年2月3日合并

您应该可以使用更新的版本来修复它。如果自2月以来没有发布任何版本,您可以尝试签出包含此修复程序的版本并自行构建代码。

据我所知,release notes for version 0.10.5

中没有提及此错误修正
  
      
  1. 错误修正:   
        
    • BSON库:修复BSONDateTimeNumberLike类型类
    •   
    • 光标:修复异常传播
    •   
    • 命令:修复某些情况下的反序列化
    •   
    • 命令:修复CollStatsResult
    •   
    • 命令:修复聚合中的AddToSet
    •   
    • 核心:在某些情况下修复连接泄漏
    •   
    • GenericCollection:不要忽略save()
    • 中的WriteConcern   
    • GenericCollection:不要忽略批量插入中的WriteConcern
    •   
    • GridFS:修复uploadDate反序列化字段
    •   
    • 索引:修正Ascending和Descending的解析
    •   
    • 宏:修复类型别名
    •   
    • 宏:允许自定义注释
    •   
  2.   

提交者的名字也没有出现:

  

以下是此版本中包含的提交列表(从0.9开始,最高提交是最新提交):

$ git shortlog -s -n refs/tags/v0.10.0..0.10.5.x.akka23
39  Stephane Godbillon
 5  Andrey Neverov
 4  lucasrpb
 3  Faissal Boutaounte
 2  杨博 (Yang Bo)
 2  Nikolay Sokolov
 1  David Liman
 1  Maksim Gurtovenko
 1  Age Mooij
 1  Paulo "JCranky" Siqueira
 1  Daniel Armak
 1  Viktor Taranenko
 1  Vincent Debergue
 1  Andrea Lattuada
 1  pavel.glushchenko
 1  Jacek Laskowski

查看commit history for 0.10.5.0.akka23 (the one you reference in build.sbt),似乎修复程序未合并到其中。

答案 1 :(得分:2)

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

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

如果仅关闭连接,则akka系统仍然存活。

使用ReactiveMongo 0.12进行测试