M2 TIW : Intergiciels et Services

TP Entreprise JavaBeans

Objectifs pédagogiques

Mettre en pratique la notion d'architecture orientée composants à l'aide d'un serveur d'applications GlassFish (Java EE) et d'objets transactionnels distribués (EJB 3.0).

Outils

Dans ce TP, vous utiliserez les sources disponibles sur la forge ici (hg clone https://forge.univ-lyon1.fr/hg/inf2198m-2014-base) ou en zip .
Remarques : le projet calc_ejb est disponible en versions Maven et Eclipse ; le projet calc_client n'est disponible qu'en Eclise (mais c'est une webapp) ; le projet tp4 est "Mavenisé" (mais ne contient pour l'instant aucun EJB).

La commande Maven pour compiler un projet EJB et générer une archive JAR contenant un ou plusieurs EJB(s) est :
mvn compile ejb:ejb

Rappels sur GlassFish et JNDI

GlassFish Server est un serveur d'applications conforme à Java EE 7. À ce titre, il intègre un annuaire JNDI, structuré en fonction :

Un mécanisme de liens permet à un objet "bindé" dans un contexte JNDI d'être accédé avec plusieurs noms / chemins, s'il correspond à plusieurs types de directories différents (par exemple : un EJB possédant une interface locale et distante). Dans tous les cas, le nom d'un objet s'exprime sous la forme d'un chemin à partir d'un contexte initial (InitialContext), représentant la racine de l'arborescence JNDI. Pour mieux en comprendre le fonctionnement, vous trouverez sur le site d'Oracle un tutoriel sur le nommage JNDI.

Pour connaître les noms d'un objet déployé dans l'annuaire JNDI par GlassFish, vous pouvez observer les noms indiqués dans la console de logs (terminal dans lequel le serveur est lancé ou console Eclipse) lors du déploiement, ou suivre avec la commande asadmin list-jndi-entries.

1. Installation et prise en main de GlassFish

Vous trouverez ici un serveur d'applications GlassFish version 4.1 (la dernière en date), qui implémente la spécification Java Entreprise Edition 7.
Remarque : Java EE 7 requiert un JDK 7 ou supérieur ; le JDK 8 u20 ou supérieur est recommandé pour GlassFish 4.1.

Si vous utilisez l'IDE Eclipse, il faut installer les plugins GlassFish Tools for Luna (remplacer la fin de l'URL par le nom de votre version d'Eclipse) et Maven. Ce plugin contient entre autres un "server adapter" pour GlassFish 4.0 ou 4.1, qui vous permettra de déployer automatiquement vos projets sur le serveur.

Le zip du serveur contient un "domaine" préconfiguré, nommé "Domain1". Le lancement du serveur se fait en appelant le script asadmin start-domain siué dans le répertoire bin. Ce script doit être lancé depuis un terminal et non un gestionnaire de fichiers, sans quoi vous ne pourrez pas visualiser sa console de logs. Vous pouvez aussi le lancer depuis Eclipse. Dans ce cas, vous utiliserez la console d'Eclipse pour visualiser les logs du serveur.

Lancez le serveur et connectez-vous sur son interface Web (http://localhost:4848). Cette interface vous donne accès à la documentation en ligne et à la console d'administration. C'est dans cette console que vous pourrez déployer vos composants et voir les résultats de vos différentes opérations de déploiement.

Déploiement d'EJB

À l'aide de cette console d'administration (menu gauche -> "Applications"), déployez et activez le fichier calc.jar de l'application calculatrice. Cette archive contient deux EJB :

Vérifiez que l'application est présente dans le serveur de noms JNDI.

Si vous renvontrez une NameAlreaydyBoundException, voici quelques références pour résoudre ce problème :

2. Première Enterprise Application

Dans cette partie, vous allez faire évoluer l'application de calculatrice.

Création d'un client

Récupérez l'archive calc_client.zip et créez un projet Eclipse à partir des sources de ce projet. Ce projet contient un formulaire Web et un servlet. Ce servlet (client.AddServlet) n'interroge que le bean AddBean (les autres opérations ainsi que la gestion de la mémoire ne sont pas implémentées). Le nom bindé de l'EJB est java:global/calc-ejb/AddBean (voir la doc ici).

La documentation est à https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB.

Compilez ce projet et faites-le tourner. Vérifiez son fonctionnement.

Créez une autre servlet qui répondra à l'URL /mem et interrogera le bean MemBean. Utilisez le mécanisme d'injection de dépendances présenté en cours pour accéder au bean depuis la servlet. L'interface est la suivante :

@Remote public interface MemRemote { public void setMem (float a); public float getMem(); }

Le nom du bean dans l'annuaire JNDI est affiché dans la console de GlassFish.

Remarque : l'intérêt d'un bean stateful est de posséder une instance pour chaque client qui l'interroge. Faites en sorte que ce nouveau servlet appelle une instance différente du bean MemBean pour chacun de ses clients.

Lancez votre application dans plusieurs navigateurs Web et véfifiez que le Bean mémoire est bien stateful, contrairement au bean add.

Création / déploiement d'EJB

Récupérez les sources du projet calc_ejb et intégrez-les dans votre IDE.

Compilez et redéployez les deux projets. Vérifiez dans la console de logs (terminal dans lequel le serveur est lancé ou console IDE) qu'ils ont bien été déployés, et que de nouveaux EJB sont présents dans le projet calc_ejb.

Refactoring et création d'un projet EAR

Créez ensuite un nouveau projet qui permettra l'interrogation des EJB dans une application standalone. Ce projet ne devra dépendre que des interfaces de vos EJB et d'un string indiquant le nom JNDI de votre application EJB. Déployez et testez.

Configuration spécifique à Glassfish : pour d'obscures raisons de compatibilité ascendante, GlassFish maintient un nom JNDI par défaut spécifique et lié à l'interface et non à celui spécifié dans la configuration (voir ici). Il faut désactiver l'option disable-nonportable-jndi-names dans la configuration du serveur pour permettre de déployer plusieurs beans qui implémentent la même interface, faute de quoi vous tomberez irrémédiablement sur une NameAlreadyBoundException.

3. Reprise de l'application agenda

Rendu du TP

Ce TP est facultatif (bonus). Si vous le rendez, ne rendez que la question 3 : "Reprise de l'application agenda".

Licence Creative Commons
Valid XHTML 1.0 Strict