10
votes

Jpa et threads dans le cadre de jeu

J'essaie de créer un serveur multithreading. Le problème est que je reçois l'erreur suivante: play.Exception.jpaException: le contexte JPA n'est pas initialisé. JPA Entity Manager commence automatiquement lorsqu'une ou plusieurs classes annotées avec l'annotation @ javax.persistence.Entéity se trouve dans l'application.

Qu'est-ce que j'essaie de faire est d'accéder à la DB du nouveau fil ici Code xxx

des idées?


0 commentaires

4 Réponses :


1
votes

Je suppose que votre thread est lancé avant que le jeu ait une chance de démarrer le gestionnaire d'entité JPA.

Si votre classe de modèle est annotée avec @entTity, le gestionnaire d'entité aurait été créé et votre erreur n'apparaîtrait pas.

Donc, vous avez quelques options. Soit,

  1. Vous pouvez créer un playplugin, avec une priorité inférieure à celle des processus Standard Standard Standard.
  2. Vous pouvez lancer votre fil d'un travail de bootstrap. Cela garantira que le jeu a eu une chance de démarrer correctement avant de commencer à interagir avec le serveur. Pour en savoir plus sur les emplois de bootstrap, voir http://www.playframework.org/documentation/1 / emplois # concepts

    Personnellement, j'irais avec l'option 2. Il est mieux documenté et que les plugins de lecture sont plus importants pour prolonger le cadre plutôt que de modifier l'ordre du traitement.


0 commentaires

13
votes

N'utilisez pas de fil uni, utilisez des travaux à la place: xxx

et balljob: xxx


1 commentaires

C'est environ 10 ans que je réalise, cependant, le travail est une chose très générique. Il serait préférable de spécifier le package pour l'objet d'emploi sur une importation. Je ne sais pas si vous voulez dire par lots de printemps ou autre chose.



6
votes

Mise à jour forte>

Ceci est NATATAIREE QUE CE QUE CI-DESSOUS: P>

class Runner extends Runnable {
     @Override
     public void run() {
         if (JPA.local.get() == null) {
             EntityManager em = JPA.newEntityManager();
             final JPA jpa = new JPA();
             jpa.entityManager = em;
             JPA.local.set(jpa);
         }

         JPA.em().getTransaction().begin();
         ... DO YOUR STUFF HERE ...
         JPA.em().getTransaction().commit();
     }
}


3 commentaires

Mise à jour: Vous pouvez supprimer toutes les trucs JPA et le remplacer par jpaplugin.starttx et jpaplugin.closetx.


Comment travailler avec jpa.Local avec le cadre de jeu 1.4?, Cela change complètement


J'aime la simple la solution. Malheureusement, si j'utilise le démarrage, je ne suis pas sûr qu'il y ait un objet JPA à faire référence. Points bonus Si vous pouvez également fournir une réponse amicale de démarrage de printemps aussi :)



0
votes
class Runner extends Runnable {
     @Override
     public void run() {
        EntityManager em = JPA.newEntityManager();
        em.setFlushMode(FlushModeType.COMMIT);
        JPA jpa = new JPA();
        jpa.bindForCurrentThread(JPA.DEFAULT, em, false);

         em.getTransaction().begin();
        // ... DO YOUR STUFF HERE ...
         em.getTransaction().commit();
     }
}

1 commentaires

Ne donnez pas seulement du code comme solution, donnez-lui une explication avec elle également.