4

I'm playing with Mongo database through the Reactive Mongo driver

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

  }
}

My build.sbt file:

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

When I run: sbt compile run

I get this output:

$ 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

And application doesn't stop.... :/

I have to press Ctrl + C to kill it

I've read that MongoDriver() creates ActorSystem so I tried to close connection manually with conn.close() but I get this:

[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'. 

And app doesn't exit also

So, what am i doing wrong? I can'f find answer...

And it seems to me that official docs doesn't explain whether i should care about graceful shutdown at all.

I don't have much experience with console apps, i use play framework in my projects but i want to create sub-project that works with mongodb

I see many templates (in activator) such as: Play + Reactive Mongo, Play + Akka + Mongo but there's no Scala + Reactive Mongo that would explain how to work properly :/

toniedzwiedz
  • 17,895
  • 9
  • 86
  • 131
Alexander Kondaurov
  • 3,677
  • 5
  • 42
  • 64

2 Answers2

3

I was having the same problem. The solution I found was invoking close on both object, the driver and the connection:

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

If you close only the connection, then the akka system remains alive.

Tested with ReactiveMongo 0.12

Jorge
  • 137
  • 4
  • According to the `driver.close` Javadoc, closing the driver also closes the connection. `Closes this driver (and all its connections and resources).` – Abhijit Sarkar Dec 04 '17 at 04:51
2

This looks like a known issue with Reactive Mongo, see the relevant thread on GitHub

A fix for this was introduced in this pull request #241 by reid-spencer, merged on the 3rd of February 2015

You should be able to fix it by using a newer version. If no release has been made since February, you could try checking out a version that includes this fix and building the code yourself.

As far as I can see, there's no mention of this bugfix in the release notes for version 0.10.5

  1. Bugfixes:
    • BSON library: fix BSONDateTimeNumberLike typeclass
    • Cursor: fix exception propagation
    • Commands: fix ok deserialization for some cases
    • Commands: fix CollStatsResult
    • Commands: fix AddToSet in aggregation
    • Core: fix connection leak in some cases
    • GenericCollection: do not ignore WriteConcern in save()
    • GenericCollection: do not ignore WriteConcern in bulk inserts
    • GridFS: fix uploadDate deserialization field
    • Indexes: fix parsing for Ascending and Descending
    • Macros: fix type aliases
    • Macros: allow custom annotations

The name of the committer does not appear as well:

Here is the list of the commits included in this release (since 0.9, the top commit is the most recent one):

$ 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

Looking at the commit history for 0.10.5.0.akka23 (the one you reference in build.sbt), it seems the fix was not merged into it.

toniedzwiedz
  • 17,895
  • 9
  • 86
  • 131
  • Yes, that's strange. I think this work well with play reactive mongo plugin but it lacks when using driver directly.. That's interesting, did they check app code examples in official docs or not because it's obvious doesn't work. I didn't know about casbah, i'm going to use this synchronous instead of async one. It works well and i understood that i don't need async code execution at all :) – Alexander Kondaurov Apr 25 '15 at 15:28
  • I also tried to build from sources last version (0.11.0) and then made dependency on this version but nothing changed – Alexander Kondaurov Apr 25 '15 at 15:31
  • @AlexanderKondaurov I'm afraid I don't know any more about this than I've already written. If this is still happening in the snapshot of version 0.11.0 and you have a minimal example that enables you to reproduce it and describe it to the team, I think you should submit an issue. – toniedzwiedz Apr 25 '15 at 15:42