Utilisation des EJB
Une fois les EJB déployés, ils sont utilisables en local ou à distance selon le type de client. Comme nous avons pu le voir dans le chapitre sur JNDI, la principale difficulté est de retrouver l’objet dans le bon contexte JNDI. 1. Utilisation par une application Web Si l’application Web est déployée dans le même serveur que le module EJB, le contexte JNDI est le même. Il faut toujours privilégier cette situation car les appels sont alors locaux. Comme nous avons pu le voir au chapitre Architecture de JBoss, le fichier jbossweb.xml de l’application web permet de lier le nom JNDI global vers un nommage ENC local à l’application : cwc service ejb2/service-calculette/remote Le fichier web.xml déclare l’EJB et les classes utilisées : … service Session fr.editions.eni.jboss.chap3.ejb2.ServiceCalculetteHome fr.editions.eni.jboss.chap3.ejb2.ServiceCalculette Chap_3_-_EJB#Calculette Ensuite, la servlet peut récupérer l’instance : InitialContext initCtx = new InitialContext(); Context ctx = (Context)initCtx.lookup(« java:comp/env »); ServiceCalculetteHome home = (ServiceCalculetteHome)ctx.lookup(calculetteJNDI); Il est préférable d’utiliser des noms JNDI dans java:comp/env, plutôt que les noms JNDI globaux, pour des raisons de facilité de maintenance. Si le nom global change, seul le fichier jbossweb.xlm est à maintenir. L’utilisation des annotations est aussi possible à partir de la version 6 de Tomcat. 2. Utilisation par une application non Web Pour les clients lourds, le principe de recherche reste le même. Il faut ajouter les bibliothèques JBoss adéquates. En général, la librairie jbossallclient.jar suffit, vous la trouverez dans le répertoire client du répertoire d’installation de JBoss. Ensuite, vous devez avoir un fichier jndi.properties adapté :enidentnumber- java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces Le code de recherche reste ensuite, le même : InitialContext ctx = new InitialContext(); ServiceCalculetteHome home = (ServiceCalculetteHome)ctx.lookup(« ejb2/service-calculette/remote »); Le contexte JNDI utilisé ici est évidemment le contexte global, car il est le seul à être accessible en dehors du serveur JBoss.Pour illustrer le besoin et le mode de fonctionnement des transactions, nous allons prendre comme exemple, le paiement (simplifié) d’un article sur site marchand. Les acteurs sont l’acheteur et le fournisseur. Lorsque l’acheteur paie son article, les tâches suivantes sont effectuées : 1. le compte de l’acheteur est débité du montant du prix de l’article ; 2. le compte du fournisseur est crédité du montant du prix de l’article ; 3. la quantité d’articles en stock est mise à jour. Le diagramme de séquence est le suivant : Le diagramme de séquence peut être codé de la manière suivante : … try { … compteAcheteur.debiter(article.getprix()); compteFournisseur.crediter(article.getPrix()); stock.decrementer(article); … } catch(Exception e) { // gestion de l’exception } … Ce code est peu sécurisé, il peut être amené à rencontrer plusieurs problèmes. Lors de la levée d’une exception sur les opérations debiter(…), crediter(…) ou decrementer(…), le code qui suit la levée de l’exception n’est pas exécuté. Que se passetil si l’opération qui crédite le compte du fournisseur échoue ? Le compte de l’acheteur a déjà été débité, mais le processus ayant été interrompu, il ne recevra jamais sa marchandise. Nous voudrions donc, lors d’un problème, que toutes les opérations effectuées dans la méthode soient annulées ainsi que les éventuelles modifications en base de données. Il serait possible de songer à gérer par programmation, les états du processus et d’annuler les opérations si nécessaire. Les bases de données sont, très certainement, sur des serveurs différents, la gestion de stock fait peutêtre partie d’une autre application. Des problèmes réseau, de protocole… seront peutêtre à gérer. Le développeur va devoir fournir un travail considérable pour gérer les annulations d’opérations, avec le risque important de fragiliser le © ENI Editions – All rigths reserved – Kaiss Tag – 1 – enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FTkkuRWRpdGlvbnMuTUVESUFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VOSS5FZGl0aW9ucy5NRURJQXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAA5MzczMzc5IC0gS2Fpc3MgVGFnIC0gZWNhNTA5YTUtMDdkMC00NDU1LTgzYjItZGFmOTViNjc0ZWMzlyREKKWRzIgLAA==-enidentnumber code, de le rendre illisible et peu maintenable. Heureusement, une solution s’offre à nous pour résoudre cette problématique, tout en conservant un code lisible et surtout robuste. Ce sont les transactions.