Informatique Repartie Chapitre 5 : Web Services – REST (III) Cecilia Zanni‐Merk cecilia.zanni‐merk@insa‐rouen.fr Bureau BO B R1 04 Références • Le cours de M Pauchet sur Moodle • Architectures réparties en Java Annick Fron ISBN 9782100738700. Editions Dunod • Java EE. Guide de développement d'applications web en Java Jérôme Lafosse Livre numérique. Editions ENI 2 Références et cours sur le Web • The Java EE 6 tutorial http://docs.oracle.com/javaee/6/tutorial/doc/index.html • Cours Sun http://miageprojet2.unice.fr/@api/deki/files/99/=FY09TechDays_RES T_Carol_(1).odp • Cours M. Baron http://mbaron.developpez.com/soa/jaxrs/ • JAX‐RS 2.0 https://jax‐rs‐spec.java.net/ 3 Les clients REST 4 Les clients REST • Comme évoqué précédemment, plusieurs implémentations de la spécification JAX‐RS existent : JERSEY (Oracle, référence), CXF (Apache), RESTEasy (JBoss/WildFly), RESTlet • La spécification ne décrit que la partie serveur, la partie client dépend de chaque implémentation • En conséquence, il y a plusieurs possibilités pour développer un client pour consommer des services REST • • • • Avec JERSEY Avec Java.net.URL ( déjà discuté) Avec Apache HttpClient Avec le framework pour les clients proposé par RESTeasy 5 Le framework RESTeasy • http://resteasy.jboss.org/ • https://docs.jboss.org/resteasy/docs/3.0.6.Final/userguide/html/RESTEasy_Client _Framework.html • Attention : le classpath des clients doit contenir • • • • • • • • commons‐io‐2.3.jar commons‐logging‐1.1.1.jar httpclient‐4.2.3.jar httpcore‐4.2.3.jar jaxrs‐api‐3.0.9.Final.jar resteasy‐client‐3.0.9.Final.jar resteasy‐jaxb‐provider‐3.0.9.Final.jar resteasy‐jaxrs‐3.0.9.Final.jar 6 Clients de test pour la boutique • ClientGet : Effectue une requête http sur l’URL du premier visiteur 7 Clients de test pour la boutique • ClientGet : Effectue une requête http sur l’URL du premier visiteur 7 Clients de test pour la boutique • ClientPost : pour créer un nouvel enregistrement 8 Clients de test pour la boutique • ClientPost : pour créer un nouvel enregistrement 8 Clients de test pour la boutique • ClientPut : va nous permettre de modifier le courriel de Lara avec PUT 9 Clients de test pour la boutique • ClientPut : va nous permettre de modifier le courriel de Lara avec PUT 9 Clients de test pour la boutique • ClientDelete : Va nous permettre de supprimer le client 2 10 Clients de test pour la boutique • ClientDelete : Va nous permettre de supprimer le client 2 10 Clients de test pour la boutique • ClientGetAll : pour nous permettre de lister tous les visiteurs 11 Clients de test pour la boutique • ClientGetAll : pour nous permettre de lister tous les visiteurs 11 Informatique Repartie Chapitre 6 : Introduction à EJB Cecilia Zanni‐Merk cecilia.zanni‐merk@insa‐rouen.fr Bureau BO B R1 04 Références • Le cours de M Pauchet sur Moodle • Java EE. Guide de développement d'applications web en Java Jérôme Lafosse Livre numérique. Editions ENI • Le cours « Les Enterprise Java Beans » de Jean‐Marc Farinone (CNAM Paris) 13 Références et cours sur le Web • The Java EE 6 tutorial, ORACLE http://docs.oracle.com/javaee/6/tutorial/doc/index.html • Java EE programming, WIKIBOOKS https://en.wikibooks.org/wiki/Java_EE_Programming • Java Persistence, WIKIBOOKS http://en.wikibooks.org/wiki/Java_Persistence 14 Un peu d’histoire sur les architectures (rappel) • Années 70 : architectures Mainframe (1 tier) • Années 80 : architectures 2 tiers (BD) • Fin des années 80 : architectures 3 tiers (RPC) • Années 90 : architectures 3 tiers Objet (RMI/Corba) • Années 00 : architectures orientées services (Web Services) • Fin des années 00 : architectures orientées ressources (RESTful) 15 Un peu d’histoire sur les aspects programmation • Années 70‐80 : Programmation procédurale • alors que les premiers langages objets datent de la fin des années 60 ! • Années 90 : Programmation objet • Fin des années 90 : Programmation orientée composants • Les composants peuvent être physiquement distants • Si changement, pas besoin de tout recompiler et de tout relinker • Similaire à la POO, car on utilise une approche objet, pas au sein du code, mais au niveau de l’architecture générale du logiciel 16 J2EE • Cadre de développement par composants avec services proposé par SUN • J2EE (Java 2 Edition Enterprise), qui propose des API pour : • • • • • • • • • • • L'invocation de méthodes distantes : RMI, CORBA, Web Services L'accès aux bases de données relationnelles : JDBC L'accès aux annuaires et services de nommage : JNDI La sérialisation par XML : JAXB HTML dynamique et traitement de requêtes HTTP : JSP et Servlet La gestion du Mail : JavaMail La gestion des composants distribués transactionnels: EJB La gestion des messages entre composants : Java Message Service (JMS) La gestion des droits d'accès : Java Authentication and Authorization Gestion de la persistence de données : JPA … entre autres 17 Architecture 18 Les composants Java EE • Sont des unités de software auto‐contenues intégrées dans une application Java EE • Les applications clients et les applets sont des composants qui s’exécutent du côte client • Les composants qui utilisent les technologies Java Servlet, JavaServer Faces et JSP (JavaServer Pages) sont des composants web qui s’exécutent du côte serveur • Les Enterprise JavaBeans (EJB) sont des composants métier qui s’exécutent du côte serveur 19 J2EE et les conteneurs Web (rappels) • La spécification J2EE fournit les éléments suivants pour la conception et la réalisation d'application Web : • Servlets Java et JSP. • Les servlets et JSP constituent les blocs de construction du développement d'applications web avec J2EE • En terme J2EE, les servlets et pages JSP sont des composants web • Application web • Collection de servlets et de pages JSP, d'autres classes annexes ou de bibliothèques de classes, ainsi que des ressources statiques telles que des documents HTML, XHTML ou XML, images, etc. 20 J2EE et les conteneurs Web (rappels) • Eléments de la spécification J2EE (suite) : • Conteneur web • Essentiellement un environnement d'exécution Java pour les applications web • Responsable de l'initialisation, de l'invocation et de la gestion de la durée de vie des servlets Java et des pages JSP • Structure de paquetage et descripteur de déploiement • Le descripteur de déploiement est un fichier XML 21 J2EE et les conteneurs Web (rappels) • Quelques examples open source • Tomcat (Apache) • http://www.apache.org • GlassFish (Oracle) • https://glassfish.java.net/ • Jboss Application Server (maintenant WildFly) (Red Hat Inc) • http://wildfly.org/ • Jetty (Eclipse) • http://www.eclipse.org/jetty/ 22 Les Enterprise Beans • Les Enterprise Beans sont des composants Java EE qui implémentent la technologie Enterprise JavaBeans (EJB) • Les Enterprise Beans s’exécutent dans un conteneur EJB • Un conteneur EJB fournit tous les services au niveau système, de manière transparente pour le développeur • • • • Transactions Sécurité Persistence Cycle de vie • Les Enterprise Beans sont le coeur des applications transactionnelles Java EE 23 Les Enterprise Beans • Les Enterprise Beans sont des composants Java EE qui implémentent la technologie Enterprise JavaBeans (EJB) • Les Enterprise Beans s’exécutent dans un conteneur EJB • Un conteneur EJB fournit tous les services au niveau système, de manière transparente pour le développeur • • • • Transactions Sécurité Persistence Cycle de vie • Les Enterprise Beans sont le coeur des applications transactionnelles Java EE 23 Les Enterprise Beans • Les Enterprise Beans encapsulent la logique métier de l’application. • Ils simplifient le développement des grandes applications distribuées • Comme le conteneur EJB fournit les services au niveau du système, le développeur du bean se concentre sur la résolution des problèmes métier • Comme les beans contiennent la logique métier, les clients sont légers • Comme les beans sont des composants portables, ils peuvent être réutilisés pour d’autres applications • Les beans s’avèrent utiles quand l’application doit être scalable, quand on doit assurer l’intégrité des données ou quand l’application a une diversité de clients 24 Les services des conteneurs EJB • Persistance. Possibilité pour l'EJB d‘être persistant dans une BD • Transactions déclaratives. Possibilité de gérer des transactions complexes (sans utiliser des API spécifiques) • Mémoire cache. Possibilité d'améliorer les performances • Sécurité déclarative. Possibilité de gérer l'accès aux composants • Gestion d'erreurs. La spécification EJB définit la manière dont les erreurs affectent les transactions, les résultats au niveau client, la connexion et la restauration des composants • Portabilité. EJB = Spécification = possibilité de porter un EJB sur un autre serveur plus puissant 25 Les services des conteneurs EJB • Persistance. Possibilité pour l'EJB d‘être persistant dans une BD • Transactions déclaratives. Possibilité de gérer des transactions complexes (sans utiliser des API spécifiques) • Mémoire cache. Possibilité d'améliorer les performances • Sécurité déclarative. Possibilité de gérer l'accès aux composants • Gestion d'erreurs. La spécification EJB définit la manière dont les Sans écrire une seule erreurs affectent les transactions, les résultats au niveau client, la connexion et la restauration des composantsligne de code • Portabilité. EJB = Spécification = possibilité de porter un EJB sur un autre serveur plus puissant 25 Comment le conteneur fournit‐il ces services? • 3 concepts de bases pour les EJB • Le concept de contrat • Services orthogonaux aux EJB • Interposition du conteneur entre le client et l'EJB • Contrat • Répartition des responsabilités entre chaque couche du logiciel (Client, Conteneur, EJB, Gestionnaire de persistance (dans la version 2.0)) • Services orthogonaux • Le conteneur EJB fournit des services au programmeur • Le programmeur de l'EJB n'a plus qu'a respecter les règles pour exploiter automatiquement ces services • Ces règles sont spécifiées dans le descripteur de déploiement 26 Comment le conteneur fournit‐il ces services? • Interposition 1. 2. 3. 4. 5. 6. 7. Le client exécute un appel sur un Stub RMI Ce stub RMI assemble et envoie des informations au serveur Le skeleton désassemble les paramètres et les transmets au conteneur EJB Le conteneur examine les références de sécurité de l'appelant de la méthode Le conteneur démarre ou rejoint toute transaction nécessaire Le conteneur exécute tous les appels nécessaires aux fonctions de persistance Le conteneur déclenche diverses méthodes callback pour permettre au composant EJB d'acquérir des ressources 8. La méthode « logique métier » est appelée 9. Le conteneur exécute quelques autres taches relatives aux transactions, à la persistance, aux méthodes callback 10. Le conteneur renvoie le résultat de la méthode métier ou une exception au client 27 Comment le conteneur fournit‐il ces services? • Interposition 1. 2. 3. 4. 5. 6. 7. Le client exécute un appel sur un Stub RMI Ce stub RMI assemble et envoie des informations au serveur Le skeleton désassemble les paramètres et les transmets au conteneur EJB Le conteneur examine les références de sécurité de l'appelant de la méthode Le conteneur démarre ou rejoint toute transaction nécessaire Le conteneur exécute tous les appels nécessaires aux fonctions de persistance Le conteneur déclenche diverses méthodes callback pour permettre au composant EJB d'acquérir des ressources 8. La méthode « logique métier » est appelée 9. Le conteneur exécute quelques autres taches relatives aux transactions, à la persistance, aux méthodes callback 10. Le conteneur renvoie le résultat de la méthode métier ou une exception au client 27 Les clients qui utilisent les beans … • Doivent • localiser le Bean par JNDI (Java Naming and Directory Interface) • utiliser le Bean • via la Home Interface : méthodes liées au cycle de vie du bean : create(), remove(), … • via la Remote Interface : services métiers par le bean • Le conteneur implémente le mécanisme de délégation permettant de faire suivre l’appel au bean 28 L’architecture d’utilisation d’un bean • Les clients d'un Bean lui parlent au travers d'interfaces • Ces interfaces, de même que le Bean, suivent la spécification EJB • Cette spécification requiert que le Bean expose certaines méthodes • En général (pour les beans de type Session et Entity, voir la section suivante), le bean doit proposer une interface de création (Home) et une interface d’utilisation (Remote) 29 L’architecture d’utilisation d’un bean • Les clients d'un Bean lui parlent au travers d'interfaces • Ces interfaces, de même que le Bean, suivent la spécification EJB • Cette spécification requiert que le Bean expose certaines méthodes • En général (pour les beans de type Session et Entity, voir la section suivante), le bean doit proposer une interface de création (Home) et une interface d’utilisation (Remote) 29 L’architecture d’utilisation d’un bean • Plus éventuellement 2 interfaces d’accès local, pour lier deux clients partageant la même machine virtuelle 30 L’architecture d’utilisation d’un bean • Plus éventuellement 2 interfaces d’accès local, pour lier deux clients partageant la même machine virtuelle 30 Récapitulatif : Local vs Remote • Pour spécifier la manière d’accéder a l’EJB => l’implémentation des services est identique • Interface Local • ≠ appel a un EJB se trouvant sur la même machine • = appel a un EJB se trouvant dans la même JVM • Interface Remote • utilise RMI (Remote Method Invocation) (=> plus lent qu’un appel local) et JNDI (Java Naming and Directory Interface) • utilisé dans la majorité des cas 31 Processus de développement • Développement d’un bean • • • • Ecrire la Home interface Ecrire la Remote interface Ecrire l’implémentation (classe) du bean Compiler ces classes et interfaces • Déploiement du Bean • Construire le descripteur de déploiement • Construire le fichier d’archive .jar ou .ear • Utilisation du Bean • Ecrire, compiler et exécuter le client, qui peut être une servlet ou une application Java ou une applet, etc. 32 Processus de développement • Développement d’un bean • • • • Ecrire la Home interface Ecrire la Remote interface Ecrire l’implémentation (classe) du bean Compiler ces classes et interfaces • Déploiement du Bean • Construire le descripteur de déploiement • Construire le fichier d’archive .jar ou .ear • Utilisation du Bean • Ecrire, compiler et exécuter le client, qui peut être une servlet ou une application Java ou une applet, etc. 32 Types d’EJB 33 Trois types d’Enterprise Beans • EJB Session • stateless • stateful • EJB Entity • CMP (Container Managed Persistence) • BMP (Bean Managed Persistence) • EJB Message Driven 34 Les EJB Session • Réalisent une tâche pour un client, optionnellement peuvent implémenter un web service • Modélisent une suite d’interactions avec les données • En général c’est par ces beans que commence la première connexion. Puis les beans session accèdent aux entity beans • Si le service proposé est un ajout fonctionnel au client, définir un EJB Session stateless (sans état) • Exemple : un convertisseur de monnaies • Un tel EJB est partageable consécutivement par de multiples clients • Si l’interaction doit être suivie, on utilise un EJB session stateful (avec état) • Exemple : un panier de commandes • Un tel EJB est propre à un client pendant toute la durée de la session • Il gère une conversation avec un client 35 Les EJB Session • Réalisent une tâche pour un client, optionnellement peuvent implémenter un web service • Modélisent une suite d’interactions avec les données • En général c’est par ces beans que commence la première connexion. Puis les beans session accèdent aux entity beans Seuls EJB interfaçables • Si le service proposé est un ajout fonctionnel au client, définir un EJB Session stateless (sans état) par les clients • Exemple : un convertisseur de monnaies • Un tel EJB est partageable consécutivement par de multiples clients • Si l’interaction doit être suivie, on utilise un EJB session stateful (avec état) • Exemple : un panier de commandes • Un tel EJB est propre à un client pendant toute la durée de la session • Il gère une conversation avec un client 35 Les EJB stateless • Les attributs de l’EJB sont réinitialisées entre chaque appel même s’il s’agit du même client • Sont spécialement pensés pour être robustes et fiables lorsqu’il y a beaucoup d’appels en concurrence • Lorsqu’un client appelle l’EJB, une instance de ce dernier sert le client, puis, retourne dans le pool d’EJB (cette dernière est donc prête a être réutilisée pour un autre client) 36 Les EJB stateless • Les attributs de l’EJB sont réinitialisées entre chaque appel même s’il s’agit du même client • Sont spécialement pensés pour être robustes et fiables lorsqu’il y a beaucoup d’appels en concurrence • Lorsqu’un client appelle l’EJB, une instance de ce dernier sert le client, puis, retourne dans le pool d’EJB (cette dernière est donc prête a être réutilisée pour un autre client) 36 Les EJB Session stateful • Les attributs de l’EJB sont sauvegardes durant toute la session • Lorsqu’un client appelle l’EJB, une instance de ce dernier est créée, puis sert le client. Cette instance reste disponible pour les futurs appels de ce client uniquement. • Cette instance sera détruite a la fin de la session (timeout ou appel a une méthode portant l’annotation @Remove) • S’il y a trop d’instances d’un EJB en mémoire, ces dernières peuvent être sorties de la mémoire de travail. • Elles passent ainsi en mode passif (voir cycle de vie plus tard) (=sauvegardées sur disque => tous les attributs doivent être sérialisables = types implémentant l’interface Serializable) 37 Les EJB Session stateful • Les attributs de l’EJB sont sauvegardes durant toute la session • Lorsqu’un client appelle l’EJB, une instance de ce dernier est créée, puis sert le client. Cette instance reste disponible pour les futurs appels de ce client uniquement. • Cette instance sera détruite a la fin de la session (timeout ou appel a une méthode portant l’annotation @Remove) • S’il y a trop d’instances d’un EJB en mémoire, ces dernières peuvent être sorties de la mémoire de travail. • Elles passent ainsi en mode passif (voir cycle de vie plus tard) (=sauvegardées sur disque => tous les attributs doivent être sérialisables = types implémentant l’interface Serializable) 37 Les EJB Entity • Représentation orientée objet des données dans une base de données • Les clients peuvent y accéder en toute sécurité simultanément • La durée de vie de l'EJB est exactement identique a celle des données qu'il représente • La relation d'un EJB entité avec les données de la base de données peut être gérée par • le développeur : persistance gérée par l'EJB • le conteneur : persistance gérée par le conteneur • Cette distinction se révèlera souvent essentielle du point de vue des performances • Cependant on peut utiliser n'importe quel type d'EJB de manière interchangeable dans la conception 38 Les EJB Message Driven • Sont les beans réactifs à des événements • Sont abonnés à des fils de discussion (suite de messages) • Sont informés lorsqu’un message doit leur être délivré • S’appuient sur JMS (Java Message Service) • Permettent l'envoi de messages asynchrones • Permettent l'envoi multiple (1 n) 39 Les EJB Message Driven • Sont les beans réactifs à des événements • Sont abonnés à des fils de discussion (suite de messages) • Sont informés lorsqu’un message doit leur être délivré • S’appuient sur JMS (Java Message Service) • Permettent l'envoi de messages asynchrones • Permettent l'envoi multiple (1 n) 39 Cycles de Vie des EJB 40 Gestion des ressources • Le serveur EJB maintient un « pool » (une réserve) d’instances de beans (pour les EJB entity et les EJB session stateless) • Les clients des EJB interagissent avec les interfaces Remote qui sont implémentées par les objets EJB. • Les applications clientes n’ont jamais un accès direct au bean réel. Elles interagissent avec des objets EJB • Le pool exploite cet accès indirect aux beans pour offrir de meilleures performances. En d'autres termes, les clients n'ayant jamais accès aux beans directement, il n'y a aucune raison fondamentale de conserver une copie distincte de chaque bean pour chaque client. 41 Les EJB Session stateless 42 Les EJB Session stateful 43 Les EJB Entity 44 Les EJB Message‐Driven 45 Un peu de syntaxe … 46 Annotations Java • Intégrées au JDK 1.5, elles permettent d'ajouter des Meta‐informations au code (i.e. marquer des éléments Java an de leur ajouter une propriété) • Peuvent être utilisées sur n'importe quel type d‘ élément Java (package, class, attribut, méthode, paramètre, etc.) • Plusieurs annotations peuvent être utilisées sur un même élément • Non prises en compte par la JVM (mais présentes dans le .class) : il faut écrire du code ou des outils qui utilise ces informations • Utilisées a la compilation ou a l'exécution • Utilisation : @ suivi du mot‐clef correspondant a l'annotation • L'API Java 5.0 propose de base 3 annotations : @Deprecated, @Override et @SuppressWarnings • Déclaration et création de nouvelles annotations : comme une interface en utilisant le mot‐clef @interface (java.lang.annotation.Annotation) • Possibilité de passer des informations a une annotation : nom=valeur 47 Exemples 48 EJB3 et les annotations • Les EJB3 utilisent les annotations pour simplifier le code a produire : • Moins de code a écrire • Génération automatique des descripteurs de déploiement 49 Les EJB session stateless • Composés d'une ou deux interfaces et d'une classe métier : • Interface de description du contrat pour accès distant (XXRemote.java) • Utilisation de l'annotation @Remote (importation de javax.ejb.Remote) juste avant la définition de l'interface • Interface de description du contrat pour accès local (XXLocal.java) • Utilisation de l'annotation @Local (importation de javax.ejb.Local) juste avant la définition de l'interface • Classe de définition de la logique métier (XXBean.java) • • • • Importation de javax.ejb.Stateless Utilisation de l'annotation @Stateless avant la définition de classe Implémentation des interfaces précédentes Ne doit pas être final 50 Les EJB session stateless • Rappel du cycle de vie 51 Les EJB session stateless • Rappel du cycle de vie • Dans XXXBean.java • @PostConstruct suivi de la méthode postConstruct • @PreDestroy suivi de la méthode preDestroy 51 Les EJB session stateful • Composés d'une ou deux interfaces et d'une classe métier : • Interface de description du contrat pour accès distant (XXRemote.java) • Utilisation de l'annotation @Remote (importation de javax.ejb.Remote) juste avant la définition de l'interface • Interface de description du contrat pour accès local (XXLocal.java) • Utilisation de l'annotation @Local (importation de javax.ejb.Local) juste avant la définition de l'interface • Classe de définition de la logique métier (XXBean.java) • • • • importation de javax.ejb.Stateful Utilisation de l'annotation @Stateful avant la définition de la classe Implémentation des interfaces précédentes Ne doit pas être final 52 Les EJB session stateful • Rappel du cycle de vie • Méthodes liées au cycle de vie • • • • • • @PostConstruct suivi de la méthode postConstruct @Init suivi de la méthode init @PrePassivate suivi de la méthode prePassivate @PostActivate suivi de la méthode postActivate @Remove suivi de la méthode remove @PreDestroy suivi de la méthode preDestroy 53 Exemple • Un compteur pour illustrer la différence entre les EJB session stateless et stateful 54 Exemple • Un compteur pour illustrer la différence entre les EJB session stateless et stateful 54 Exemple • Un compteur pour illustrer la différence entre les EJB session stateless et stateful 54 Exemple 55 Exemple 55 Exemple •@Local et @Remote peuvent être portées par la même interface •Il faut au moins une annotation @Local ou @Remote •Toutes les annotations peuvent éventuellement être placées directement dans l'EJB. L'interface doit alors être précisée : @ Stateless @ Remote (NomInterface.class) public class EJBStateless implements NomInterface { ... } 55 Exemple 56 Exemple 56 Exemple 56 Exemple 56 Côté client • Nommage d'un EJB • Service de nommage : JNDI • Nommage d'un EJB : ejb:AppName(ear)/ModuleName(jar)/BeanName!InterfaceName • Attention ! Pour un EJB Stateful, une session JNDI doit être créée : on ajoute ?stateful lors de la récupération du stub 57 Côté client • Nommage d'un EJB • Service de nommage : JNDI • Nommage d'un EJB : ejb:AppName(ear)/ModuleName(jar)/BeanName!InterfaceName • Attention ! Pour un EJB Stateful, une session JNDI doit être créée : on ajoute ?stateful lors de la récupération du stub 57 Sorties 58 Déploiement avec JBoss • Voir les instructions détaillées pour la compilation et le déploiement du côté serveur et du côté client dans les exemples sur Moodle • Voir le cours de M Pauchet pour le passage de paramètres par valeur, l’envoi d’exceptions et les callbacks 59