IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Mon appel d'EJB semble async


Sujet :

Java EE

  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut Mon appel d'EJB semble async
    Bonjour à tous,

    J'ai un EJB relativement simple, ChienEjb, possédant une méthode add().

    Cet EJB est utilisé par l'un de mes Web services comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    public class ChienWebService {
      ...
     
      @EJB
      private ChienEjb chienEjb
     
      public List<String> addChiens(@XmlElement(required = true) @WebParam(name = "chienContainer") ChienContainer chienContainer) {
     
        try {
          print("A")
          List<String> result = new ArrayList<String>();
     
          for(Chien chien : chienContainer.getchiens()) {
            print("B");
            chienEjb.add(chien);
            result.add(chien.getName() + " is ok");
          }
     
          print("C");
          return result;
     
        } catch(Exception e) {
          e.printStackTrace();
          throw truc;
        }
      }
     
    }
    Quand j'appelle mon web service avec deux chiens, disons Milou et Idefix dans cet ordre, et qu'Idefix est déjà en base. L'EJB gère bien un rollback sur l'ensemble Milou-Idefix, ce qui est top. Par contre, c'est comme si l'appel à add(..) se faisait de façon asynchrone. en effet, la variable result contient {"Milou", "Idefix"} à la fin du traitement :-( En toute logique, je m'attendais à ce que l'exception lors de l'insert de Idefix fasse sortir de la boucle for... Ca n'entre jamais dans le catch.

    Au niveau des traces, ça me donne ABBC. Et quelques millisecondes plus tard, je vois une exception déclenchée par l'EJB...

  2. #2
    Membre confirmé Avatar de bruneltouopi
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 308
    Points : 466
    Points
    466
    Par défaut
    C'est dû à la gestion de la transaction.
    il essayes tout d'abord certainement d’insérer toutes tes données.voilà tu vois ABBC.
    Puis lors du Commit par ton EntityManager ,Il déclenche ton exception donc va exécuter ton Rollback.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Comment est codée la méthode add dans ton EJB ?
    Peux-tu également montrer le code de l'entity Chien ?

  4. #4
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Oui, c'est ce que je me disais. Mais comment je peux faire pour intercepter l'exception ? Parce qu'en l'état, je retourne un ok à mon utilisateur...

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bruneltouopi Voir le message
    C'est dû à la gestion de la transaction.
    il essayes tout d'abord certainement d’insérer toutes tes données.voilà tu vois ABBC.
    Puis lors du Commit par ton EntityManager ,Il déclenche ton exception donc va exécuter ton Rollback.
    J'y ai pensé également mais il faudrait que ce soit le webservice qui ait initialisé la transaction pour ça... pas assez de code ici pour se déterminer

  6. #6
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Je suis sur une piste qui consiste à demander moi-même le commit avant le return dans le web service. Comme ça, si ça pète, j'ai encore la main.

    Sinon j'ai essayé avec @TransactionAttribute(TransactionAttributeType.REQUIRED) mais ça ne changeait rien.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    L'entityManager est injecté par qui ?
    Qui initialise la transaction ?
    Dans le cas le plus fréquent, ta méthode add de l'EJB devrait plutôt avoir l'attribut REQUIRES_NEW pour qu'à la sortie de la méthode le commit soit fait

  8. #8
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    En fait, les EJB n'ont même pas d'annotation pour gérer la transaction :-( J'ai accès au code seulement en lecture :-( En tous cas, l'entity manager se trouve dans l'ejb.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu peux pas nous faire un copier / coller du code du web service et de l'ejb ? (entêtes de classes compris)

  10. #10
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Ça serait plus pratique effectivement mais je ne vais pas trop pouvoir là, dsl...

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Le comportement que tu décris laisse penser que la transaction est initialisée par le web service et qu'il le communique à l'EJB ou que celui-ci en hérite.
    Du coup, c'est à la sortie de ta méthode du web service que le commit est fait, dans ce cas, le catch ne te sert pas pour ce type d'erreur...

  12. #12
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    oui, c'est ce que je devine aussi... Quoi que j'ai aussi l'impression que l'EJB vit sa vie sans moi :-(

    C'est pour ça que je vais essayer un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    try {
      ...
      em.commit();
      return result;
     
    } catch(E ...) {
     
    }

  13. #13
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Bon, c'était une fausse bonne idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getEntityManager().getTransaction().begin();
    Me lance : Cannot use an EntityTransaction while using JTA.

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Si tu utilises JTA, c'est le conteneur qui gère la transaction, un moyen de récupérer une référence sur cette dernière est via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Resource UserTransaction objUserTransaction;
    ChienWebService est un EJB également ?
    Si oui, a-t-il un entityManager ?

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Si tu as absolument besoin que le add ajoute effectivement le chien, tu ne peux pas simplement mettre sur ChienEjb.add() une annotation exigeant une nouvelle transaction?
    @transactional(REQUIRES_NEW) ?

  16. #16
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    ChienWebService est un EJB également ?
    Non c'est juste un web service genre jersey.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/11/2009, 19h13
  2. appel d'ejb par client web
    Par noutazia20 dans le forum Glassfish et Payara
    Réponses: 8
    Dernier message: 12/08/2009, 17h45
  3. appel d'EJBs entre différents EARs ou différents Server
    Par chemical_seb dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 25/07/2009, 12h49
  4. mon appel de fonction semble impropre
    Par veevee dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 13/04/2008, 09h11
  5. [EJB] [Debutant] Appel d'EJB distants + divers
    Par LAlex dans le forum Java EE
    Réponses: 18
    Dernier message: 16/06/2003, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo