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 :

[CMT] Gestion d'exception et transaction [EJB Session]


Sujet :

Java EE

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [CMT] Gestion d'exception et transaction
    J'ai un EJB Session Stateful avec transaction de type Container et je voulais savoir si ceci est réalisable:

    Voici une méthode de cet EJB:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try {
         blablabla
    }
    catch (Exception e) {
         doSomething()
    }
         doSomethingElse()
    Lorsque aucune exception est levée, tout ce qui est fait dans doSomethingElse est commité c'est le fonctionnement normal du Container.

    Lorsque une exception est levée je voudrais que tout ce qui est fait dans le catch (le doSomething) soit lui commité.

    Le probleme c'est que aujourd'hui toute ma transaction est rollbackée.

  2. #2
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    A mon avis, tu ne catche pas l'exception. Dans le code présenté tu catche tout ce qui est de type Exception. Donc toutes les RuntimeException (NullPointer, etc...) ne sont pas catchées par ton code mais par le container qui réalise alors un rollback.
    Change Exception par Throwable, et regarde si çà marche.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Alors en fait je n'ai pas été complet:

    voici plutot la portion de code que j'execute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {  
            doSomethingElse()
     } catch (IllegalStateException e) {  
            doSomething()
            throw e;
    }
    Dans le catch je renvoie l'exception dans l'idée justement de rollbacker tout ce qui a pu etre fait en amont ... le fond de la question est donc de savoir si il existe un moyen pour que tout ce qui est fait dans doSomething soit commité tout en rollbackant ce qui a pu etre fait dans le doSomethingElse ... hmm hmm je sais pas si c'est tres clair ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    En mettant ton doSomething() dans un finally par exemple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    boolean flag=false
    try { 
    doSomethingElse()
    } catch (IllegalStateException e) {
    flag=true;
    throw e; 
    }
    finally{if(flag)  doSomething() ;}

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Non ca ne marche pas mieux ...

    Le doSomething() contient des ordres d'update dans une base de donnée mais je pense que la transaction est marquée rollbackée à partir du moment ou l'exception est levée et donc tout ce qui est fait dans le doSomething est lui aussi rollbacké ...

    L'orde d'update dans le doSomething leve cette trace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [TxInterceptorCMT] IllegalStateException while setting transaction for rollback only
    java.lang.IllegalStateException: Already rolled back. TransactionImpl:XidImpl[FormatId=257, GlobalId=fr-31-01-05-072/17, BranchQual=, localId=17]
    	at org.jboss.tm.TransactionImpl.setRollbackOnly(TransactionImpl.java:691)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Et si tu indiquais un "RequiresNew" comme attribut de transaction pour la méthode doSomething(), qu'est-ce que ça donne ? Parce que dans ce cas, la méthode doSomething() s'exécuterait dans une autre transaction, commiterait, puis rendrait la main pour relancer l'autre transaction rollbackée. Bon, j'ai pas encore vérifié ça, si tu peux nous dire ce qu'il en retourne.
    SCJP 5 / SCBCD 1.3 Certified

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Effectivement c'est une piste que j'ai essayé d'explorer ...
    Voici ce que j'ai (je travaille avec XDoclet):

    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
     
    /**
     * 
     * <!-- begin-xdoclet-definition -->
     * 
     * @ejb.interface-method view-type="remote" <!-- end-xdoclet-definition -->
     * @generated
     * 
     */
     
    public void method1 {
      try { 
         doSomethingElse()  
      } 
      catch (IllegalStateException e) { 
         doSomething()  
         throw e; 
      }
    }
    avec doSomething qui est une methode de ce meme EJB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /**
     * @ejb.interface-method view-type="local" <!-- end-xdoclet-definition -->
     * @ejb.transaction type="RequiresNew"
    */
    public void doSomething(){
         //appel d'un EJB Session facade qui lui meme fait un save en base via Hibernate
    }
    Et la transaction est qd meme rolbackée!!!
    Ceci dit ca ne m'étonne qu'a moitié puisque la transaction de haut niveau c'est à dire celle de la méthode "method1" est rollbackée ...
    J'ai l'impression que je me marche sur les pieds ...

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Et pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try
    {
       doSomethingElse();
       "commit()";  
    }
    catch (Throwable t)
    {
       "rollback()";
       doSomething();
       "commit()";
       throw t;
    }
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    En fait je ne peux pas faire ce que tu dis puisque je suis dans un Session bean en mode Container Managed Transaction.

    J'ai trouvé visiblement la solution.

    En fait le RequiresNew était une bonne solution mais il me restait un problème à savoir que la méthode que j'appelais faisait partie du même session bean ...

    En créant un nveau session bean en lui ajoutant la fameuse doSomething en RequiresNew, cela marche ...

    Le lien suivant fournissait en quelques sorte la réponse:
    http://www.jboss.com/index.html?modu...opic&p=3807209

    Donc au final la solution suivante marche:

    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
    /**
     * 
     * <!-- begin-xdoclet-definition -->
     * 
     * @ejb.interface-method view-type="remote" <!-- end-xdoclet-definition -->
     * @generated
     * 
     */
     
    public void method1 {
      try { 
         ejb1.doSomethingElse()  
      } 
      catch (IllegalStateException e) { 
         ejb2.doSomething()  
         throw e; 
      }
    }
    avec doSomething en transition type = RequiresNew.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Framework] Question sur la gestion des exceptions et du @Transactional
    Par franckbis dans le forum Spring
    Réponses: 0
    Dernier message: 13/01/2010, 11h53
  2. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  3. [C#] Gestion d'exception
    Par ALCINA dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 12h18
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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