Консольное приложение scala не останавливается при использовании реактивного драйвера mongo

Я играю с базой данных Mongo через драйвер Reactive 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'. 

И приложение тоже не выходит

Итак, что я делаю неправильно? Я не могу найти ответ ...

И мне кажется, что официальные документы не объясняют, должен ли я вообще заботиться о корректном завершении работы.

У меня нет большого опыта работы с консольными приложениями, я использую игровую среду в своих проектах, но я хочу создать подпроект, который работает с mongodb.

Я вижу много шаблонов (в активаторе), таких как: Play + Reactive Mongo, Play + Akka + Mongo, но нет Scala + Reactive Mongo, который объяснил бы, как правильно работать :/


person Alexander Kondaurov    schedule 25.04.2015    source источник


Ответы (2)


Это похоже на известную проблему с Reactive Mongo, см. соответствующую ветку на GitHub

Исправление этой проблемы было представлено в этом запросе на вытягивание № 241 от reid-spencer. , объединено 3 февраля 2015 г.

Вы должны быть в состоянии исправить это, используя более новую версию. Если с февраля не было выпущено ни одного релиза, вы можете попробовать проверить версию, включающую это исправление, и создать код самостоятельно.

Насколько я вижу, это исправление не упоминается в примечаниях к выпуску. для версии 0.10.5

  1. Bugfixes:
    • BSON library: fix BSONDateTimeNumberLike typeclass
    • Курсор: исправить распространение исключений
    • Команды: исправить десериализацию ok для некоторых случаев
    • Команды: исправить CollStatsResult
    • Команды: исправить AddToSet в агрегации
    • Ядро: исправлена ​​утечка соединения в некоторых случаях.
    • GenericCollection: не игнорировать WriteConcern в save()
    • GenericCollection: не игнорировать WriteConcern при массовых вставках
    • GridFS: исправить поле десериализации uploadDate
    • Индексы: исправление синтаксического анализа по возрастанию и убыванию
    • Макросы: исправить псевдонимы типов
    • Макросы: разрешить пользовательские аннотации

Имя коммиттера также не отображается:

Вот список коммитов, включенных в этот релиз (начиная с версии 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

Глядя на историю коммитов для 0.10.5.0.akka23 (на которую вы ссылаетесь в build.sbt), похоже фикс в него не влился.

person toniedzwiedz    schedule 25.04.2015
comment
Да, это странно. Я думаю, что это хорошо работает с плагином play reactive mongo, но его не хватает при непосредственном использовании драйвера. Интересно, проверяли ли они примеры кода приложения в официальных документах или нет, потому что очевидно, что это не работает. Я не знал о casbah, я собираюсь использовать этот синхронный вместо асинхронного. Это работает хорошо, и я понял, что мне вообще не нужно выполнение асинхронного кода :) - person Alexander Kondaurov; 25.04.2015
comment
Я также пытался собрать из исходников последнюю версию (0.11.0), а затем сделал зависимость от этой версии, но ничего не изменилось. - person Alexander Kondaurov; 25.04.2015
comment
@AlexanderKondaurov Боюсь, я знаю об этом не больше, чем уже написал. Если это все еще происходит в моментальном снимке версии 0.11.0, и у вас есть минимальный пример, позволяющий воспроизвести это и описать команде, я думаю, вам следует сообщить о проблеме. - person toniedzwiedz; 25.04.2015

У меня была такая же проблема. Решение, которое я нашел, заключалось в вызове close для объекта, драйвера и соединения:

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

Если закрыть только коннект, то акка система остается живой.

Протестировано с ReactiveMongo 0.12

person Jorge    schedule 17.02.2017
comment
Согласно driver.close Javadoc, закрытие драйвера также закрывает соединение. Closes this driver (and all its connections and resources). - person Abhijit Sarkar; 04.12.2017