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 :

RuntimeException et EJB : plantage en cascade


Sujet :

Java EE

  1. #1
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut RuntimeException et EJB : plantage en cascade
    Bonjour à tous

    J'ai récemment eu un souci avec les RuntimeException dans un projet Java EE. Le fait est que si un EJB en référence un autre (via @EJB) et que ce dernier lance une RuntimeException, toutes les injections @EJB sautent !

    Voici l'exemple utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ProcessorBean { public String process() { throw new RuntimeException("error"); } } /* This is a sub-bean that throws a simple RuntimeException */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class OtherBean  { public String hello() { return "processed by OtherBean"; } } /* Another sub-bean to test the catch-call (optional) */
    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
    public class TestBean
    {
        @EJB
        private ProcessorLocal processor;
     
        @EJB
        private OtherLocal other;
     
        public String process()
        {
              String result = null;
              try
              {
                  result = processor.process(); //will throws a RuntimeException
              }
              catch(Exception e)
              {
                  result = other.hello(); //CRASH !!!! --> afther that processor.process() trhows a RuntimeException, all injections @EJB are down ! There will be a ejb.some_unmapped_exception written in the console.
              }
     
              return result;
        }
    }
    Afin de palier au problème, nous avons pensé à la solution suivante : utiliser les annotations pour faire du pré-processing avant la compilation. L'idée est d'encapsuler chacune des méthodes des classes annotées par un gros try/catch et de relancer une RemoteException (qui n'est pas une RuntimeException).

    J'aimerais si possible avoir quelques retour la-dessus. Est-ce que quelqu'un a déjà eu ce problème ? Comment l'a-t-il contourné ? Est-ce que notre idée semble correcte ?

    Merci d'avance !

    @++
    Libzippp (C++)
    Lost in AStorm

  2. #2
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Points : 2 370
    Points
    2 370
    Par défaut
    Salut,
    ton problème est intéressant.

    Le comportement est normal puisque les RuntimeException et les RemoteException sont des system exceptions.
    Quand le container rencontre une system exception, il y a 3 conséquences:
    l'erreur est loggée, la transaction est rollbackée et le bean est abandonné (il n'y a plus de référence à ce bean qui du coup devient candidat pour le GC).

    Solution:
    ce que tu peux faire c'est transformé ta RuntimeException en une application exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @ApplicationException
    public class MonException extends RuntimeException

  3. #3
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    Salut,

    Merci de ta réponse, cela semble être tout à fait ce que nous cherchons à faire Je vais tester ça !
    Ce qui est tout de même bizarre c'est que lorsque la transaction est "rollbackée" toutes les références aux EJB sont perdues... même ceux qui n'ont pas provoqué d'erreur
    J'espère vraiment que Glassfish 3 enverra autre chose que des "ejb.some_unmapped_exception"

    @++
    Libzippp (C++)
    Lost in AStorm

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Hello,

    Je suis un collègue du Captain (d'ailleurs, si vous lui en voulez personnellement, faites-le moi savoir, et je forwarderai les beignes, promis ).


    En fait, j'ai bien peur que ce ne soit pas la bonne solution : je ne pourrai décorer que les exceptions perso, pas celles de java (p. ex ArrayIndexOutOfBounds).

    Peut-être devrions nous utiliser des Interceptor dans nos session beans...

    Mééééeu! Je veux faire du code propre!


  5. #5
    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
    Citation Envoyé par Grosgrognon Voir le message
    En fait, j'ai bien peur que ce ne soit pas la bonne solution : je ne pourrai décorer que les exceptions perso, pas celles de java (p. ex ArrayIndexOutOfBounds).
    Bonjour,
    C'est bizarre ce que vous cherchez à faire, il me semble. Les exceptions du genre ArrayIndexOutOfBounds sont des bugs dans votre code qui doivent normalement être traqués et corrigés avant la version finale à déployer.
    Ce ne serait donc pas une bonne idée d'utiliser des blocs try/catch pour des RuntimeException.
    Sinon, comme l'a dit longbeach, un ejb qui provoque une "system exception" est détruit pas le conteneur, la transaction est rollbackée, et donc normalement les références à d'autres beans sont perdues également.
    Je pense qu'il vaut mieux essayer de corriger ces bugs potentiels dans votre code.
    SCJP 5 / SCBCD 1.3 Certified

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 170
    Points
    170
    Par défaut
    Bonjour,

    je déterre ce sujet car j'ai été confronté à un problème de RuntimeException. Effectivement, l'annotation @ApplicationException permet au conteneur EJB de traiter les exceptions «unchecked» comme des «checked» (c'est-à-dire pas de rollback – sauf configuration contraire – ni de wrapping de l'exception dans une EJBException).

    Citation Envoyé par Grosgrognon Voir le message
    En fait, j'ai bien peur que ce ne soit pas la bonne solution : je ne pourrai décorer que les exceptions perso, pas celles de java (p. ex ArrayIndexOutOfBounds).
    Je veux simplement ajouter que la décoration des exceptions standard de Java est aussi possible dans le descripteur ejb-jar.xml ==> voir ce billet

  7. #7
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Points : 2 370
    Points
    2 370
    Par défaut
    Citation Envoyé par tHE_fLAmMinG_mOE Voir le message
    Bonjour,

    je déterre ce sujet car j'ai été confronté à un problème de RuntimeException. Effectivement, l'annotation @ApplicationException permet au conteneur EJB de traiter les exceptions «unchecked» comme des «checked» (c'est-à-dire pas de rollback – sauf configuration contraire – ni de wrapping de l'exception dans une EJBException).



    Je veux simplement ajouter que la décoration des exceptions standard de Java est aussi possible dans le descripteur ejb-jar.xml ==> voir ce billet
    Tout à fait.
    Ci-joint un extrait de la spec ejb-3_0-fr-spec-ejbcore.pdf (JSR 220):

    An application exception that is an unchecked exception is defined as an application exception by annotating it with the ApplicationException
    metadata annotation, or denoting it in the deployment descriptor with the application-exception element.

Discussions similaires

  1. [ EJB ] [JBoss ] [ XDoclet ] probleme avec cascade-delete
    Par Houbbba dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 03/05/2006, 10h05
  2. Réponses: 7
    Dernier message: 20/08/2003, 10h33
  3. [EJB2] Sources de données pour EJB
    Par thomy dans le forum Java EE
    Réponses: 4
    Dernier message: 04/06/2003, 15h52
  4. [EJB] Débutant en EJB sur Weblogic
    Par viny dans le forum JBuilder
    Réponses: 8
    Dernier message: 24/04/2003, 15h34
  5. [Kylix] Plantage IDE Kylix3/Mandrake 9.0
    Par OmicroN dans le forum EDI
    Réponses: 3
    Dernier message: 28/01/2003, 23h04

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