2016-05-17 2 views
0

Nous utilisons Play Framework 2.4 avec mongodb 2.6. Mais puisque nous avons migré reactivemongo de 0.11.10 à 0.11.11-play24, quelque chose ne va pas.Aucune donnée insérée pendant le démarrage de l'application Play (avec Play 2.4 et reactivemongo 11.11)

Nous chargeons des données dans mongodb au démarrage de l'application. Tout semble bien, l'application a démarré, aucune erreur ne s'est produite dans les journaux mais aucune donnée n'a été insérée dans la base de données.

Voici le code pour le début de l'application dans Global.scala:

override def onStart(app: Application) { 
    Logger.info("creating object in database...") 
    someProducts.foreach{ product => 
    ProductDB.insertOrUpdate(product._id, product) 
    } 
} 

Pour injecter reactivemongo, nous avons décidé de ne pas utiliser le @Inject() pour le moment, donc nous utilisons à la place current.injector (selon le Reactivemongo documentation). NB: nous avons totalement supprimé toute trace de ReactiveMongoPlugin car elle est obsolète dans play-reactivemongo 0.11.11-play24.

Ici, nous définissons notre modèle et nous injectons ReactiveMongo:

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

En application.conf, ReactiveMongoModule est activé avec cette ligne: play.modules.enabled += "play.modules.reactivemongo.ReactiveMongoModule"

Journaux de l'application:

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

Et voici les journaux de mongodb:

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 

Répondre

0

Vous devez brancher après la base de données a été chargée:

def db: DefaultDB = Await.result(reactiveMongoApi.database, Duration.Inf) 

La chose est que maintenant, reactiveMongoApi.db est synchrone et, si elle est directement utilisé, la connexion ne se fait pas encore (cycle de vie).

Je suggère donc que soit vous attendez la base de données (comme le code ci-dessus) ou votre registre juste callbacks dans un tampon qui sera exécuté lorsque la base de données a neem initialisé

reactiveMongoApi.database.onSuccess { 
     case _ => callbacks.foreach(_()) 
    } 
+0

Merci pour votre réponse, j'étais penser exactement à quelque chose comme votre première solution! – ersefuril