首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在启动Play应用程序期间没有插入数据(使用Play 2.4和reactivemongo 11.11)

在启动Play应用程序期间没有插入数据(使用Play 2.4和reactivemongo 11.11)
EN

Stack Overflow用户
提问于 2016-05-17 12:13:10
回答 1查看 68关注 0票数 0

我们在MongoDB2.6中使用Play Framework2.4。但是,由于我们将reactivemongo从0.11.10迁移到了0.11.11-play24,有些地方出了问题。

在应用程序开始时,我们将一些数据加载到mongodb中。一切看起来都很好,应用程序已经启动,日志中没有出现错误,但是没有在数据库中插入数据。

下面是在Global.scala中启动应用程序的代码:

代码语言:javascript
复制
override def onStart(app: Application) {
   Logger.info("creating object in database...")
   someProducts.foreach{ product =>
     ProductDB.insertOrUpdate(product._id, product)
   }
}

为了注入reactivemongo,我们决定暂时不使用@Inject(),因此我们使用current.injector (根据Reactivemongo文件)。注:我们完全删除了ReactiveMongoPlugin的每一个痕迹,因为它在play-reactivemongo 0.11.11-play24中被废弃了。

这里我们定义了我们的模型并注入了ReactiveMongo:

代码语言:javascript
复制
abstract class MongoDB[T: Format, ID: Format] {
   def collection: JSONCollection

   def insertOrUpdate( _id: ID, o: T) = collection.update(Json.obj("_id" -> _id), o, upsert = true)
}

object ProductDB extends MongoDB[Product, String] {
  override def collection = current.injector.instanceOf[ReactiveMongoApi].db.collection("products")
}

application.conf中,使用以下行启用了ReactiveMongoModule:play.modules.enabled += "play.modules.reactivemongo.ReactiveMongoModule"

应用程序日志:

代码语言:javascript
复制
[debug] p.a.l.c.ActorSystemProvider - Starting application default Akka system: application
[info] application - starting application, build at: 2016-05-17T13:00:18+0200
[info] application - creating object in database...
[info] application - ReactiveMongoApi starting...
[info] application - ReactiveMongoApi successfully configured with DB 'application'! Servers:
[localhost:27017]
[info] play.api.Play - Application started (Dev)

以下是mongodb的日志:

代码语言:javascript
复制
2016-05-17T13:00:27.774+0200 [initandlisten] connection accepted from 127.0.0.1:65478 #3 (1 connection now open)
2016-05-17T13:00:27.833+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.833+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.880+0200 [initandlisten] connection accepted from 127.0.0.1:65479 #4 (2 connections now open)
2016-05-17T13:00:27.880+0200 [initandlisten] connection accepted from 127.0.0.1:65480 #5 (3 connections now open)
2016-05-17T13:00:27.880+0200 [initandlisten] connection accepted from 127.0.0.1:65481 #6 (4 connections now open)
2016-05-17T13:00:27.880+0200 [initandlisten] connection accepted from 127.0.0.1:65482 #7 (5 connections now open)
2016-05-17T13:00:27.880+0200 [initandlisten] connection accepted from 127.0.0.1:65483 #8 (6 connections now open)
2016-05-17T13:00:27.881+0200 [initandlisten] connection accepted from 127.0.0.1:65484 #9 (7 connections now open)
2016-05-17T13:00:27.881+0200 [initandlisten] connection accepted from 127.0.0.1:65485 #10 (8 connections now open)
2016-05-17T13:00:27.881+0200 [initandlisten] connection accepted from 127.0.0.1:65486 #11 (9 connections now open)
2016-05-17T13:00:27.882+0200 [initandlisten] connection accepted from 127.0.0.1:65487 #12 (10 connections now open)
2016-05-17T13:00:27.888+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.888+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.888+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.889+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.889+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.889+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.889+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.889+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.889+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.889+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.890+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.890+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.890+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.890+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.891+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.891+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
2016-05-17T13:00:27.891+0200 [conn3] run command admin.$cmd { ismaster: 1 }
2016-05-17T13:00:27.891+0200 [conn3] command admin.$cmd command: isMaster { ismaster: 1 } ntoreturn:1 keyUpdates:0 numYields:0  reslen:178 0ms
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-19 17:15:56

您需要在加载数据库之后插入:

代码语言:javascript
复制
    def db: DefaultDB = Await.result(reactiveMongoApi.database, Duration.Inf)

问题是,现在,reactiveMongoApi.db是同步的,如果直接使用,连接还没有完成(生命周期)。

因此,我建议您要么等待数据库(如上面的代码),要么将回调注册到缓冲区中,该缓冲区将在数据库初始化后执行。

代码语言:javascript
复制
    reactiveMongoApi.database.onSuccess {
      case _ => callbacks.foreach(_())
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37275861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档