Pourquoi jeter un EJBException est un “recommandé” la pratique?
Je reçois cette "suggestion" de nombreux collègues développeurs et plus encore. Dans mon expérience, j'ai constaté que EJBExceptions sont bien adaptés à une "fin du monde" à partir de l'exemple d'haricot point de vue (comme quand quelque chose est tellement mauvais que le haricot instance ne peut pas récupérer par lui-même). Si une instance peut récupérer, je pense que c'est mieux de jeter une exception d'application.
Voici le modèle que j'ai rencontrer encore et encore:
privé SomeResource des ressources; d'ejbcreate: ressource = allocateResource(...); omMessage: try { ... } catch (JMSException e) { throw new EJBException(e); } ejbRemove: freeResource(ressource);
À mon humble avis c'est un antipattern qui provoque des fuites de ressource.
MODIFIER: en particulier, la spécification EJB dit que si un haricot, déclenche une exception d'exécution (et EJBException est une exception runtime) à partir de la méthode des affaires, puis le haricot est rejeté sans appel ejbRemove.
Est-ce un exemple pertinent à l'encontre de jeter un EJBException?
Quels sont les cas lorsque EJBException doivent être jetés?
OriginalL'auteur vinny_g | 2009-10-17
Vous devez vous connecter pour publier un commentaire.
Le fait de lancer des
EJBException
est recommandé par l'EJB spec (14.2.2 de l'EJB 3) dans le cas où l'EJB ne peut pas récupérer d'une exception il rencontre. La spec dit aussi que les EJB peut raisonnablement se permettre (case non cochée) Système d'Exceptions à se propager à l'conteneur.Je suis d'accord avec votre lecture de la spec que, dans de tels cas, le cycle de vie des méthodes de rappel ne sera pas invoquée par le conteneur, et donc votre préoccupation que toute ressource-tidy up qui devrait normalement se produire dans le
ejbRemove()
de rappel n'arrivera pas, et donc il y a un danger de fuite de ressources.Mon expérience est que de très nombreux épineux problèmes surviennent en raison d'un manque de défensive de codage. "La Situation de X ne peut pas se produire dans un comportement correct du système, et si c'est le cas alors tout le système est cassé, donc je ne vais pas le code pour cette éventualité." Ensuite nous avons un peu de "intéressante" l'alignement des étoiles et des erreurs de l'opérateur et le "ne peut pas se produire" se produit plusieurs fois en succession rapide et imprévue des effets secondaires d'un coup de pied à la tête de vraiment difficile à diagnostiquer les problèmes.
Donc je dirais:
TransientException
vérifié exception.ejbRemove
alors vous pouvez vous permettre SystemExceptions à propager - mais je ne suis pas sûr que ce soit amical. Vous dépendra de la bibliothèque et des il jette à unNullPointerException
. Est est en fait plus robuste pour les attraper et de les renvoyerTransientException
?EJBException
ou un système d'exception, de sorte que l'instance est détruite, mais au moins vous avez essayé de faire le ménage.OriginalL'auteur djna
Le conteneur peut encore valider la transaction en cours, même si l'EJB méthode a jeté une exception d'application. Si votre EJB méthode peut lever une exception d'application, alors vous devriez envisager d'utiliser EJBContext.setRollbackOnly() comme ceci:
Jeter un EJBException ou d'un système (non cochée) exception signifie que le conteneur sera automatiquement annuler la transaction. Voir: http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction3.html
Si votre système Ejb ne sont pas systématiquement intercepter et gérer les exceptions de l'application puis le code qui génère peut entraîner partielle d'une opération complète de commettre ses changements.
Cela peut conduire à un dur-à-trouver des bugs, car l'utilisateur "mythe" de la méthode d'un EJB avec le CPM est que cela correspond à une transaction, qui est atomique. Le compléter en partie de la logique métier est atomiquement commis à la base de données. C'est extrêmement confus quand il arrive dans la pratique. Joël article sur abstractions qui fuient: http://www.joelonsoftware.com/articles/LeakyAbstractions.html explique pourquoi.
Si votre système dispose d'Ejb qui ne gère pas les exceptions de l'application correctement la réponse logique est de les corriger afin qu'ils n'. Jusqu'à ce que le problème est résolu, votre équipe peut avoir une raison logique de ne pas vouloir l'application des exceptions générées à partir des Ejb.
OriginalL'auteur richj
Possibilité ou non de fuites de ressources dépend de la façon dont ces ressources sont administrées. La jetée de haricots obtient des ordures collectées en donnant sa référence à la ressource qui devient de déchets ramassés à son tour, lorsque le point de références. Si la ressource est également conservée dans une collection avec un chemin d'accès à la racine, il sera de fuite à moins que le conteneur a un gestionnaire de pool qui permet de détecter l'inactivité de ressources et de les recycler.
Je suis d'accord avec vous que le bean doit gérer toutes les exceptions qu'il peut par lui-même et de laisser le résultat sera connu à l'appelant. Pour moi l'anti modèle dans la situation que vous décrivez est l'utilisation d'exceptions pour passer à l'état d'objet. Les Exceptions doivent être des exceptions, ne sont pas utilisés comme valeurs de retour.
OriginalL'auteur rsp