Une introduction aux Enterprises Java Bean
Transcription
Une introduction aux Enterprises Java Bean
Une introduction aux Enterprises Java Bean Cours très complet… Plus de 500 transparents Que nous allons faire d’une manière incomplète Nous allons en regarder uniquement une 100 aines Nombreux transparents masqués Michel RIVEILL – Université de Nice – Sophia Antipolis Mais visible dans version pdf par 4 http://www.polytech.unice.fr/~riveill - [email protected] Pour nous arrêté uniquement sur les principes de base © 2006, M. Riveill 2 Les promesses des EJB Motivation des EJBs Enterprise JavaBeans Considérons : Standard industriel pour un modèle de composant logiciel distribué, un site de gestion de portefeuille boursier, Permet d'implémenter des "objets métier" d'une manière propre et réutilisable, un centre d'appel, une application bancaire, un système d'analyse de risque, Pour le développement RAD d'applications côté serveur … Fait partie des spécifications J2EE © 2006, M. Riveill 3 © 2006, M. Riveill 4 Choses à considérer lorsqu'on construit une application distribuée Choses à considérer lorsqu'on construit une application distribuée Protocoles d'accès distants (CORBA, RMI, IIOP…) Gestion de la charge, Gestion des pannes, Persistence, intégration au back-end, Gestion des transactions, Clustering, Redéploiement à chaud, Arrêt de serveurs sans interrompre l'application, Gestion des traces, règlages (tuning and auditing), Programmation multithread Problèmes de nommage Securité, performances, Gestion des états Cycle de vie des objets Gestion des ressources (Resource pooling) Requête par message (message-oriented midddleware) Si on prend une application monolithique Puis on la transforme en application distribuée, plusieurs clients se connectent sur plusieurs serveurs Les serveurs utilisent plusieurs SGBD. Que faut-il mettre en place ? © 2006, M. Riveill 5 © 2006, M. Riveill Qui s'occupe de tout ceci : l’intergiciel (middleware) ! 6 Serveur d'application : mutualiser les compétences ! Dans le passé, la plupart des entreprises programmaient leur propre intergiciel Un serveur d'application fournit les services intergiciels les plus courants, Qui adressaient rarement tous les problèmes, Transaction, sécurité, cycle de vie, … Qui demandait des compétences spécifiques, Différentes du secteur d'activité de l'entreprise (banque, commerce…) Permettent de se focaliser sur l'application que l'on développe, sans s'occuper du reste. Difficulté de développement, de maintenance Aujourd’hui, les entreprises achètent un produit Le code est déployé sur le serveur d'application. Oracle, IBM, BEA, … proposent depuis plusieurs années des solutions… Séparation des métiers et des spécificités : Il y a aussi plusieurs proposition ‘libre’ d'un côté la logique métier, Consortium ObjectWeb (Bull, France Telecom et l’INRIA) de l'autre les aspects techniques. Aujourd’hui les intergiciels intègrent : le web, l’accès aux données… serveurs d'application. © 2006, M. Riveill 7 © 2006, M. Riveill 8 Encore mieux ! Utilisons des composants Serveurs d'application : construction des applications selon le modèle 3-parties Il est possible d'acheter ou de réutiliser une partie de la logique métier ! Development Tools Presentation HTML Business Logic Distributed Objects HTML Transactions Java Content Management Java Application Vous développez votre application à l'aide de composants. Data Access Code qui implémente des interfaces prédéfinies. Sorte de boîte noire. Un bout de logique facilement réutilisable. Un composant n'est pas une application complète. Juste un bout. On assemble les composants comme un puzzle, afin de résoudre des problèmes importants. Et on les configure pour les adapter au problème à résoudre Data Access Objects Enterprise Data Connectors Data Enterprise Deployment Services Scalability Reliability Security Manageability © 2006, M. Riveill 9 © 2006, M. Riveill 10 Composant logiciel réutilisable Composant logiciel réutilisable Une entreprise peut acheter un composant Ce composant répond à un besoin récurrent On parle alors de COTS Vente en ligne de matériel informatique, et l'intégrer avec des composants qu'elle a développé. Gestion des coûts sur une chaîne de production automobile, Par exemple, un composant qui sait gérer des prix. Facturation interne à une entreprise, On lui passe une liste de produits et il calcule le prix total. Etc… Simple en apparence, mais la gestion des prix peut devenir très complexe : remises, promotions, lots, clients privilégiés, règles complexes en fonction du pays, des taxes, etc… © 2006, M. Riveill 11 © 2006, M. Riveill 12 Composant logiciel réutilisable © 2006, M. Riveill Composant logiciel réutilisable 13 © 2006, M. Riveill Composant logiciel réutilisable 14 Quel intérêt ? Moins d'expertise requise pour répondre à certains points du cahier des charges, Développement plus rapide. Normalement, les vendeurs de composants assurent un service de qualité (BEA, IBM…) Réduction des frais de maintenance. Naissance d'un marché des composants. Pas encore l'explosion attendue mais… © 2006, M. Riveill 15 © 2006, M. Riveill 16 Architectures de composants Architectures de composants Plus de 50 serveurs d'applications ont vu le jour depuis une dizaine d'années, Au début, composants propriétaires uniquement. Nécessité de standardiser la notion de composants Ensemble de définitions d'interfaces entre le serveur d'application et les composants Pas de cohabitation entre composants développés pour différents serveurs d'application Dépendant d'un fabriquant une fois le choix effectué. Ainsi n'importe quel composant peut tourner ou être recompilé sur n'importe quel serveur Dur à avaler pour les développeurs java qui prônent la portabilité et l'ouverture ! Un tel standard s'appelle une architecture de composants Penser aux CDs audio, à la télé, au VHS, etc… © 2006, M. Riveill 17 © 2006, M. Riveill Architecture à composants 18 Enterprise JavaBeans (EJB) Qu’est-ce qui est important pour définir un composant ? Le standard EJB http://java.sun.com/products/ejb/index.html Plusieurs réponses possibles EJB est une architecture de composants pour des composants serveur écrits en java. Java Beans CCM .Net components Adopté par l'industrie. "Train once, code anywhere" J2EE components Portable facilement Rapid Application Development (RAD) La notion de composants est en train de dérivé vers la notion de services Attention : EJB != Java Beans La aussi plusieurs réponses possible Java beans = composants côté client Services Web http://java.sun.com/docs/books/tutorial/javabeans/index.html © 2006, M. Riveill 19 © 2006, M. Riveill 20 Enterprise Java Beans Enterprise JavaBeans EJB signifie deux choses : Cahier des charges Une spécification Rendre une application Un ensemble d'interfaces facile à développer, déployer et administrer Permet la création d’applications réparties selon l’architecture 3 parties indépendamment de la plate-forme permettant son exécution Favoriser la réutilisation interface Un EB (EnterpriseBean) n’est pas spécifique de la plate-forme dans laquelle il est utilisé Traitement – c’est la partie concernée par les EJB persistance Accélerer le déploiement Le composant de traitement est exécuté sur un serveur et il est appelé par un client généralement distant © 2006, M. Riveill Le déploiement d’un EB se fait sans recompilation ou modification du code source 21 © 2006, M. Riveill 22 La plate-forme Java J2EE La plate-forme Java J2EE Les EJB ne sont qu’une partie de la spécification J2EE Chaque API dans J2EE à sa propre spécification (PDF) J2EE = architecture distribuée en java Batterie de logiciels pour valider les implémentations Pour le développement d'application serveur test suites Ensemble de spécifications et d'APIs Implémentation de référence Java contient deux autres architectures 1. J2ME (Java 2 Micro Edition) : pour les mobiles 2. J2SE : pour applications et applets standards J2EE est livrée avec un serveur d'application qui sert d’exemple… Ensemble de "blueprints« Non attaché à un vendeur particulier. Définit précisément le rôle de chaque API (PDF) Quiconque respecte les spécification est "J2EE compliant" Donne des conseils pour construire une application et utiliser l’architecture Applications développées indépendantes des vendeurs d'outils. © 2006, M. Riveill 23 © 2006, M. Riveill 24 J2EE : les APIs Plate-forme Enterprise Java J2EE comprend en plus de J2ME et J2SE EJB : standard de définition de composants Java 2 RMI et RMI-IIOP : objets distribués JNDI (Java Naming and Directory Interface) JDBC (Java Data Base Connectivity) JTA (Java Transaction API) JMS (Java Messaging Service) Java Servlets and Java Pages (JSP) Java IDL (Corba) JavaMail JCA (J2EE Connector Architecture) : ponts vers SAP/3, CICS… JAXP (Java API for XML Parsing) JAAS (Java Authentification and Authorization Service) Composants Java beans RMI (JRMP, IIOP) Composants Enterprise Java Beans Plate-forme EJB (Conteneur + Serveur) JMS JTA JDBC JNDI ... ... Plate-forme Serveur (Unix, NT) + JVM + JDK © 2006, M. Riveill 25 © 2006, M. Riveill 26 EJB Caractéristiques principales Consistent, Integrated Architecture Development and Deployment Tools L’architecture EJB identifie les éléments suivants : composants logiciels ou beans (EB), conteneurs, Presentation HTML Java Application Business Logic EJB Visual Servlets Triggers On Demand Java Content Management JNDI serveurs, JDBC 2.0 Servlets/JSP JTS/JTA Data Access clients. Distributed Data Cache JavaMail Les conteneurs isolent les beans du client et d’une implémentation spécifique d’un serveur Data Access Objects Enterprise Data Connectors RMI-IIOP Rappel : les beans sont dans la partie serveur Data Conteneurs et serveurs implémentent les mécanismes de bas niveau utilisés par les applications JMS Enterprise Deployment Services Scalability © 2006, M. Riveill Reliability Security Manageability transactions, persistance, gestion mémoire, … 27 © 2006, M. Riveill 28 EJB Caractéristiques principales L’écosystème des EJBs Mise en évidence de différents rôles Fournisseur d’EB EJB s’intéresse aux activités liées au développement, au déploiement et à l’exécution d’une application Enterprise Bean (EB) Assembleur d’application Application EJB définit différents rôles associés aux différentes parties intervenant dans la production d’une application L’installateur EJB définit des contrats associés à un bean Développement de l’application Déploiement et exécution Ces contrats sont passés entre le conteneur et les clients qui utilisent le bean. => ce sont des règles (obligations) qui doivent être respectées par le Fournisseur de conteneur EJB fournisseur de l’EB et de conteneur Conteneu r Fournisseur de serveur EJB Serveur Développement du serveur EJB Produit Utilise © 2006, M. Riveill 29 © 2006, M. Riveill L'écosystème EJB 30 L'écosystème EJB 2 - L'assembleur d'application Pour déployer et exécuter un projet à base d'EJBs, six métiers sont impliqués Il s'agit de l'architecte de l'application Il est client des EJBs achetées ou développées 1 - Le fournisseur d'EJBs Il décide de la combinaison de composants dont il a besoin Peut-être un membre de votre équipe, ou bien une entreprise qui vend des EJBs (www.componentsource.com ou www.flashline.com pour voir une liste) Fournit un GUI à l'application Conçoit et développe de nouveau composants Conçoit et développe les programmes clients Définit le mapping avec les données manipulées par les différents composants En général, c'est un expert en Génie Logiciel, en UML et en développement Java. Il peut s'agir d'un intégrateur de systèmes, d'un consultant, d'une équipe de développeurs/concepteurs maison… © 2006, M. Riveill 31 © 2006, M. Riveill 32 L'écosystème EJB L'écosystème EJB 3 - Le déployeur d'EJBs 4 - L'administrateur système Après que l'application ait été assemblée, elle doit être déployée sur un ou plusieurs serveurs d'application Vérifie le bon fonctionnement de l'application en exploitation. Il utilise les outils de monitoring des serveurs d'application. Attention à la sécurité (firewall, etc…) Il effectue la maintenance hardware et software (lancement, arrêt) Branchement de services annexes (LDAP, Lotus Notes, Microsoft Active Directory, etc…) sur le serveur d'applications. du système. Certains serveurs d'application savent téléphoner et appeler l'administrateur système en cas de problème. Choix du hardware, des SGBD, etc… Paramétrage du serveur d'application, optimisation des performances… Ponts avec les outils de Tivoli, Computer Associates, … via JMX. Il adapte les composants et le serveur à l'application Il peut être une équipe ou une personne, un consultant ou un vendeur d'hébergement de serveurs d'applications. Exemples aux USA : www.hostJ2EE.com ou www.loudcloud.com © 2006, M. Riveill 33 © 2006, M. Riveill L'écosystème EJB 34 L'écosystème EJB 5 - Le fournisseur du serveur d'application et des containers 6 - Les vendeurs d'outils EJB container = environnement au sein du serveur dans lequel les EJB vivent. Développer une application à base d'EJB est assez lourd. Pourtant la manière de développer, construire, maintenir, déployer les EJBs est standard. Le container EJB fournit les services middleware et manage les EJBs. Il est très pratique d'utiliser un IDE pour simplifier les tâches répétitives comme le déploiement, etc… Exemples : Weblogic, Websphere, BES, Oracle Orion Server, JRun, JBoss… Principaux IDEs : JBuilder, Visual Age, Visual Cafe. Il existe d'autre containers spécialisés (container Web comme Tomcat, Resin…) Outil de test (JUnit), de stress (LodeRunner), etc… Autres outils : les outils UML comme Together/J, Rational Rose Le fournisseur du serveur d'application est le même que le fournisseur de containers EJB. On confond en général container et serveur d'application. © 2006, M. Riveill 35 © 2006, M. Riveill 36 La spécification EJB défini plusieurs contrats Les différents métiers… client Nécessaire Bientôt un nouveau métier : le "persistence manager" Garantir la complémentarité Développe des outils qui se "branchent" sur le serveur d'application et implémentent les mécanismes de persistance. des différents métiers Garantir la portabilité du code Mapping BD relationnelles/Objets Contrat client Fournir un modèle de développement uniforme pour les applications qui utilisent les composants EB Mapping BD objet/Objets Etc… Enterprise Bean Contrat conteneur EBJ conteneur EJB serveur Contrat parckaging Fichier ejb-jar © 2006, M. Riveill 37 © 2006, M. Riveill 38 La spécification EJB défini plusieurs contrats Contrat coté client EJB Le contrat coté client client Un client accède toujours à un bean par son interface fournir une vue uniforme du bean au client. vue est indépendante de la plate-forme de déploiement Localiser le bean Contrat client utilisation de JNDI Enterprise Bean Utiliser le bean utilisation de l’interface standard fournie par l’EB provider Home Interface (méthodes liées à la gestion du bean : create, remove, finder, ...) Contrat conteneur EBJ conteneur Remote Interface (méthodes de l’application) EJB serveur Le container implémente le mécanisme de délégation permettant de “faire suivre” l’appel au bean Contrat parckaging le client ne communique pas directement avec le bean mais avec le container Fichier ejb-jar © 2006, M. Riveill 39 © 2006, M. Riveill 40 La spécification EJB défini plusieurs contrats Contrat coté conteneur EJB Le contrat du “conteneur” client L’EJB conteneur permet permettre la portabilité des beans sur différents serveurs EJB gestion du cycle de vie, gestion de l’état, sécurité, transaction distribuée, concurrence, extensibilité Contrat client Enterprise Bean ces services appellent des méthodes fournies par le bean (callback methods) Contrat conteneur Les conteneurs gèrent plusieurs types de beans propriétés et cycle de vie différent selon la nature du Bean EBJ conteneur Avec ou sans état EJB serveur Avec ou sans données persistantes Contrat parckaging Communication par appel de méthode ou envoie de message Fichier ejb-jar © 2006, M. Riveill 41 © 2006, M. Riveill La spécification EJB défini plusieurs contrats Contrat coté “packaging” (ejb-jar file) fournir un format de fichier standard pour “packager” les beans. Ce format doit être Enterprise Bean en résumé client Contrat client 42 Composant serveur qui peut être déployé Composé de un ou plusieurs objets Les clients d'un Bean lui parlent au travers d'une interface Enterprise Bean supporter par tous les outils Contrat conteneur liés aux EJB EBJ conteneur Cette interface, de même que le Bean, suivent la spécification EJB Cette spécification requiert que le Bean expose certaines méthodes EJB serveur Contrat parckaging Fichier ejb-jar © 2006, M. Riveill 43 © 2006, M. Riveill 44 Enterprise Bean 3 types de Beans : Session Bean Le client d'un Bean peut être Session Beans Une servlet Modélisent un traitement (business process) Une applet Correspondent à des verbes, à des actions Une application classique Ex : gestion de compte bancaire, affichage de catalogue de produit, Un autre Bean vérifieur de données bancaires, gestionnaire de prix… On peut décomposer une application en un graphe de tâches/sous-tâches Les actions impliquent des calculs, des accès à une base de données, consulter un service externe (appel téléphonique, etc.) Exemple : achat d'un CD à partir du code-barre Souvent clients d'autres Beans Scanner (qui a une JVM embarquée) client d'un Bean sur le Serveur Ce Bean client d'autres Beans : gestion de catalogue, de commandes, de gestion de transaction VISA, etc… Modèle flexible, extensible… © 2006, M. Riveill 45 © 2006, M. Riveill 46 3 types de Beans : Message-Driven Bean 3 types de Beans : Entity Bean Entity beans Message-Driven Beans Modélisent des données Nouveau dans EJB 2.0, Correspondent à des noms Similaire aux Session bean : représentent des verbes ou des Ex : un Bean Personne, un Bean compte bancaire, un Bean produit, un actions, Bean commande. On les invoque en leur envoyant des messages, Ce sont des objets java qui cachent des données d'une base de données Ex : message pour déclencher des transactions boursières, des autorisations d'achat par CB, Ils sont persistants Servent de proxy entre la logique métier et les base de données Souvent clients d'autres beans… Permettent le mapping d’une base de donnée relationnelle dans un langage à objets Sont très souvent utilisé par des Beans Session Rarement par un client © 2006, M. Riveill 47 © 2006, M. Riveill 48 Exemple de Session/Entity bean 3 types de Beans : pourquoi ? Pas d'Entity Beans dans les solutions Microsoft par exemple… Session Bean Entity Bean Gestion de compte Compte bancaire Vérificateur de CB Carte de crédit Système d'entrée gestion de commandes Commande, ligne de commande Gestion de catalogue Produits Gestionnaire d'enchères Enchère, Produit Standard EJB plus difficile à apprendre, Gestion d'achats Commande, Produit, ligne de commande Risque de mauvaise utilisation mais… DataSet est l’objet qui s’en rapproche le plus Nombreuses compagnies impliquées dans les standards EJB/J2EE Leurs clients ont des besoins variés, Solution proposée flexible mais plus complexe, © 2006, M. Riveill On est gagnant sur le long terme. 49 © 2006, M. Riveill Clients interagissant avec un serveur à base d'EJBs © 2006, M. Riveill 50 Les objets distribués au cœur des EJBs 51 © 2006, M. Riveill 52 Les objets distribués et l’intergiciel (middleware) Intergiciel explicite Lorsqu'une application devient importante, des besoins récurrents apparaissent : sécurité, transactions, cycle de vie, etc… C'est là qu'intervient l’intergiciel (middleware) ! Deux approches Intergiciel explicite, Intergiciel implicite © 2006, M. Riveill 53 © 2006, M. Riveill Intergiciel explicite 54 Intergiciel explicite Explicite Difficile à écrire, C’est le composant qui appelle les services techniques Difficile à maintenir, Exemple : Votre code est dépendant des API du vendeur de middleware que vous utilisez transfert d'un compte bancaire vers un autre transfert(Compte c1, Compte c2, long montant) La portabilité est loin d’être acquise Appel vers l'API middleware qui fait une vérification de sécurité, Appel vers l'API de transaction pour démarrer une transaction, Appel vers l'API pour lire des lignes dans des tables d'une BD, Faire le calcul : enlever de l'argent d'un compte pour le mettre dans l'autre Appeler l'API pour mettre à jour les lignes dans les tables, Appeler l'API de transaction pour terminer la transaction. © 2006, M. Riveill 55 © 2006, M. Riveill 56 Intergiciel implicite Le principe de mise en oeuvre Interposition Object, Home et descripteurs © 2006, M. Riveill 57 Constitution d'un EJB : Enterprise Bean class Constitution d'un EJB : Enterprise Bean class La classe du Bean (Enterprise Bean class) Interfaces implémentées par la classe du Bean Une classe qui implémente une interface précise et qui respecte certaines règles, Tous les beans implémentent javax.ejb.EnterpriseBean Il s'agit de l'implémentation du bean lui-même, Important Juste un marqueur, Session Bean : logique métier, calculs, transfert de compte bancaire, saisie de commandes, etc… Cette interface dérive de Serializable Sera utilisé pour ‘passivé’ / ‘activé’ le bean Entity Bean : logique orientée donnée, par exemple comment changer le nom d'un client, diminuer un compte bancaire… Chaque type de bean implémente des interfaces plus spécifiques : Javax.ejb.SessionBean Message-Driven Bean : logique orientée message, traitement après réception d'un ordre d'achat d'actions boursières… Javax.ejb.EntityBean Javax.ejb.MessageDrivenBean © 2006, M. Riveill 59 © 2006, M. Riveill 60 Constitution d'un EJB : EJB Object Constitution d'un EJB : EJB Object Que se passe-t-il lors de l'interception ? Les clients n'invoquent jamais directement les méthodes de la classe du Bean Prise en compte des transactions, Sécurité : le client est-il autorisé ? Les appels de méthodes (requests) sont interceptés par le Container, afin d'assurer le traitement middleware implicite, Gestion des ressources + cycle de vie des composants : threads, sockets, connexions DB, pooling des instances (mémoire), Persistance, Accès distant aux objets, Une fois ce traitement effectué, le container appelle les méthodes de la classe du Bean Threading des clients en attente, Activation / passivation, Le développeur de composant se concentre sur la logique, ignore la partie intergiciel Clustering, Monitoring : statistiques, graphiques temps réel du comportement du système… Et donc les appels aux services technique … © 2006, M. Riveill 61 © 2006, M. Riveill Constitution d'un EJB : EJB Object 62 Constitution d'un EJB : EJB Object Container = couche d'indirection entre le client et le bean L'EJB Object contient du code spécifique au container (vendeur-dépendant) Cette couche est matérialisée par un objet unique : l'EJB Object Il appelle les méthodes de la classe du Bean, Il est généré par le container ! Chaque container est livré avec des outils pour générer les EJB Object pour chaque Bean. © 2006, M. Riveill 63 © 2006, M. Riveill 64 EJB : classe du Bean et EJB Object EJ EJBean Bean Serveur EJB • Utilisation du descripteur de déploiement (fourni par l'auteur du Bean) • Code simple • Génération du code à partir du Bean Container EJB EJB Object : génération du code • Le code généré fournit Transactions, Securité, Persistance, Accès Distant, Gestion des ressources, etc. EJB Server EJ EJBean Bean EJB Container Container EJB EJ EJBean Bean Serveur EJB Container EJB • Fournit les services au container • Paramètres de déploiement = securité, mappings objets/BD relationelle, etc.) • Génération du code pour intégrer le bean dans le container, ajout du ‘plumbing’ (persistance, securité, etc…) EJ EJBean Bean Code généré © 2006, M. Riveill 65 © 2006, M. Riveill Constitution d'un EJB l'interface distante Constitution d'un EJB l'interface distante Les clients invoquent les méthodes des EJB Objects, Le programmeur du Bean dérivera son interface distante de javax.ejb.EJBObject, Ces EJB Objects doivent cloner toutes les méthodes que le bean expose, Rajoutera les signatures des méthodes qu'il souhaite exposer, Comment l'outil qui génère l'EJB Object peut-il connaître la liste des méthodes à cloner ? L'EJB Object sera généré par le container ! Réponse : il utilise une interface fournie par le programmeur du bean, l'interface distante © 2006, M. Riveill 66 Presque rien à faire pour le développeur de bean ! 67 © 2006, M. Riveill 68 Constitution d'un EJB Home Object Constitution d'un EJB Home Object Nous avons vu comment les clients appelaient les méthodes d'un Bean : via l'EJB Object. L'EJB factory est responsable de l'instanciation et de la destruction des EJB Objects. Mais comment obtiennent-ils une référence sur l'EJB Object ? La spécification EJB appelle cette factory un Home Object. En effet : pas d'instanciations lorsque on travaille avec des objets distants ! Responsabilités du Home Object Créer les EJB Objects, Trouver les EJB Objects existants (Entity beans seulement) Solution : le client demande la référence à une fabrique d'EJB Objects (EJB Object Factory) Supprimer les EJB Objects. Design pattern que vous avez sûrement utilisé dans le cadre de Java RMI © 2006, M. Riveill 69 © 2006, M. Riveill Constitution d'un EJB Home Object 70 Constitution d'un EJB : l'interface Home Comme les EJB Objects, les Home Objects sont générés par le container Comme pour les EJB Objects, le développeur du bean doit spécifier une interface Home Contiennent du code spécifique, L'interface Home définit Assurent le load-balancing, etc… Les méthodes pour créer, détruire et localiser les EJB Objects Le Home Object (généré par le container) implémente cette interface. L'interface fournie par le développeur dérive de javax.ejb.EJBHome Javax.ejb.EJBHome dérive de java.rmi.Remote Les Home objects sont aussi des objets distants, compatibles RMIIIOP © 2006, M. Riveill 71 © 2006, M. Riveill 72 Constitution d'un EJB les interfaces locales Constitution d'un EJB Commentaires sur la figure précédente Le client appelle un stub (souche), Le stub encode les paramètres dans un format capable de voyager sur le réseau, Le stub ouvre une connexion sur le skeleton (squelette), Le skeleton décode les paramètres, Le skeleton appelle l'EJB Object, L'EJB Object effectue les appels middleware, L'EJB Object appelle la méthode du bean, Le Bean fait son travail, On fait le chemin inverse pour retourner la valeur de retour vers le client ! …Sans compter le chargement dynamique des classes nécessaires ! Attention : la création de bean et l'appel de méthode distante coûtent cher ! © 2006, M. Riveill 73 © 2006, M. Riveill Constitution d'un EJB les interfaces locales Constitution d'un EJB les interfaces locales Pour améliorer les performances… dans le cadre d’appels locaux Pour l'appel distant de méthodes, le développeur peut fournir une interface locale, qui sera implémentée par le container en tant que Local Object Nouveau dans EJB 2.0 : les interfaces locales. Introduit la notion de Local Object, en remplacement de EJB Object A distinguer du cas "normal" (EJB 1.1) ou on a interface distante implémentée par EJB Object Pour la création/localisation de beans, le développeur peut fournir une interface home interface locale, qui sera implémentée par le container en tant que Home Object local Les Local Objects implémentent une interface locale au lieu d'une interface distante Exemple d'appel de méthode distante Le client appelle le Local Object, Le Local Object appelle le middleware puis la méthode du bean A comparer avec Home Interface implémentée par le container en tant que Home Object La valeur de retour est renvoyée au Local Object, puis au client © 2006, M. Riveill 74 75 © 2006, M. Riveill 76 Constitution d'un EJB les interfaces locales Constitution d'un EJB les descripteurs de déploiement Pour informer le container des besoins ‘intergiciel’, on utilise un descripteur de déploiement (XML) Les interfaces locales ne tournent que si les EJB sont dans le même processus (même container), Standardisé, Attention, paramètres et valeurs de retour (lors des appels de méthodes) se passent maintenant par référence A l'extérieur de l'implémentation du bean. Attention si on les écrit à la main! Toujours par valeur dans le cas d'appels distants! Outils d'aide au déploiement : IDEs (Jbuilder, Visual Cafe), outils spécifiques (Borland Application Server, Weblogic 6.1) Plus performant mais sémantique différente. Descripteurs peuvent être modifiés après le déploiement. Descripteurs spécifiques au serveur d'application Difficile de passer d'une implémentation locale à une implémentation classique Chaque vendeur ajoute des trucs en plus : load-balancing, persistance complexe, clustering, monitoring… Aurait pu être fait dans les descripteurs (weblogic) © 2006, M. Riveill Dans des fichiers spécifiques (inprise-ejb.xml avec Borland) 77 © 2006, M. Riveill Déploiement : un fichier .jar 78 Les EJB en résumé Enterprise Bean class Interface distante (remote interface)/Interface locale EJB Object/Local Object Home interface/Local Home interface Home Object/Local Home Object Descripteur de déploiement standard Descripteurs spécifiques au vendeur Fichier .jar de l'EJB © 2006, M. Riveill 79 © 2006, M. Riveill 80 Principaux bénéfices Mon premier Bean… Application complexe “facile” à écrire gestion des transaction de manière déclarative gestion de la persistance gestion intégré de la sécurité gestion de la répartition La plate-forme et le bus logiciel (middleware) sont indépendants des applications Hello world… pour faire original Extensibilité du modèle © 2006, M. Riveill 81 Comment s'y prendre ? Modèle objet du bean HelloWorld Ordre typique des opérations 1. Ecrire les fichiers .java qui composent le bean, 2. Ecrire le descripteur du bean, 3. Compiler les .java de l'étape 1, 4. Créer un .jar contenant les .class et le descripteur, 5. Deployer le .jar (via outil ou simple copie), 6. Vérifier que le serveur fonctionne et a bien déployé le bean, sinon, vérifier la config, 7. © 2006, M. Riveill Ecrire, compiler, exécuter un client de test du bean. 83 © 2006, M. Riveill 84 L'interface distante L'interface locale package examples; /** * This is the HelloBean remote interface.* * This interface is what clients operate on when * they interact with EJB objects. The container * vendor will implement this interface; the * implemented object is the EJB object, which * delegates invocations to the actual bean. */ package examples; /** * This is the HelloBean local interface. * * This interface is what local clients operate * on when they interact with EJB local objects. * The container vendor will implement this * interface; the implemented object is the * EJB local object, which delegates invocations * to the actual bean. */ public interface Hello extends javax.ejb.EJBObject { /** * The one method - hello - returns a greeting to the client. */ public String hello() throws java.rmi.RemoteException; } © 2006, M. Riveill public interface HelloLocal extends javax.ejb.EJBLocalObject { /** * The one method - hello - returns a greeting to the client. */ public String hello(); } 85 © 2006, M. Riveill L'interface Home L'interface Home locale package examples; /** * This is the home interface for HelloBean. This interface * is implemented by the EJB Server's tools - the * implemented object is called the Home Object, and serves * as a factory for EJB Objects. * * One create() method is in this Home Interface, which * corresponds to the ejbCreate() method in HelloBean. */ package examples; /** * This is the local home interface for HelloBean. * This interface is implemented by the EJB Server's * tools - the implemented object is called the * local home object, and serves as a factory for * EJB local objects. */ public interface HelloLocalHome extends javax.ejb.EJBLocalHome { /* * This method creates the EJB Object. * * @return The newly created EJB Object. */ HelloLocal create() throws javax.ejb.CreateException; } public interface HelloHome extends javax.ejb.EJBHome { /* * This method creates the EJB Object. * * @return The newly created EJB Object. */ Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; } © 2006, M. Riveill 86 87 © 2006, M. Riveill 88 La classe du bean La classe du bean package examples; /** * Demonstration stateless session bean. */ public class HelloBean implements javax.ejb.SessionBean { private SessionContext ctx; // // EJB-required methods public void ejbCreate() { System.out.println("ejbCreate()"); } public void ejbRemove() { System.out.println("ejbRemove()"); } public void ejbActivate() { System.out.println("ejbActivate()"); } public void ejbPassivate() { System.out.println("ejbPassivate()"); } public void setSessionContext(javax.ejb.SessionContext ctx) { this.ctx = ctx;} // // Business methods public String hello() { System.out.println("hello()"); return "Hello, World!"; } } © 2006, M. Riveill 89 ejbCreate() correspond au create() de l'interface Home Une seule méthode métier : hello() On la retrouve dans les interfaces distante et locales. ejbActivate() et ejbPassivate() n'ont pas d'utilité dans le cas de session bean stateless Elles sont vides. Etudiées plus tard. © 2006, M. Riveill Les EJBContexts : le lien avec le container 90 Les EJBContexts : le lien avec le container Sert à encapsuler le domaine dans lequel évolue le bean dans un objet. Tous les contextes implémentent public interface javax.ejb.EJBContext { setSessionContext() appelé par le container. /* Un contexte par type de Bean * Call these from within your bean to access * your own home object or local home object. SessionContext, EntityContext, MesageDrivenContext * Méthodes correspondantes * You can use them to create, destroy, or * find EJB objects and EJB local objects setSessionContext(), * of your own bean class type. setEntityContext(), */ setMessageDrivenBeanContext() public javax.ejb.EJBHome getEJBHome(); public javax.ejb.EJBLocalHome getEJBLocalHome(); … © 2006, M. Riveill 91 © 2006, M. Riveill 92 Les EJBContexts : le lien avec le container Les EJBContexts : le lien avec le container ... /* * These are transaction methods – sera vu plus tard ☺ */ public boolean getRollbackOnly(); public void setRollbackOnly(); public javax.transaction.UserTransaction getUserTransaction(); /* * These are security methods – ne sera pa vu */ public boolean isCallerInRole(java.lang.String); public java.security.Principal getCallerPrincipal(); } © 2006, M. Riveill 93 © 2006, M. Riveill Le descripteur de déploiement spécifique Le descripteur de déploiement <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd"> Selon les serveurs d'application, il peut y avoir un descripteur en plus, spécifique. <ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>examples.HelloHome</home> <remote>examples.Hello</remote> <local-home>examples.HelloLocalHome</local-home> <local>examples.HelloLocal</local> <ejb-class>examples.HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> © 2006, M. Riveill 94 Voir pendant les exercices… Nous allons utiliser Jonas Et il y a un container spécifique 95 © 2006, M. Riveill 96 Le fichier .jar de l'EJB Déployer le bean Il faut mettre tous les fichiers compilés Cette étape varie selon le container + descripteurs Simple copie dans un répertoire spécifique avec JBoss, dans un .jar A l'aide d'un outil de déploiement spécifique avec Jonas A faire depuis un IDE ou à la main Lors du déploiement jar cf HelloWorld.jar * Vérification du fichier.jar, Contenu de HelloWorld.jar Le container génère les EJBObjects et EJBHome, META-INF/MANIFEST.MF Le container génère les stubs et skeletons pour les appels RMIIIOP. META-INF/ejb-jar.xml examples/HelloBean.class Vérifier le déploiement examples/HelloLocalHome.class examples/HelloHome.class Le serveur doit vous avertir qu'il a bien chargé le bean. examples/HelloLocal.class examples/Hello.class © 2006, M. Riveill 97 © 2006, M. Riveill 98 Client : localiser (lookup) un objet Home, Écriture d'un client Deux types de clients On ne sait pas où se trouve l'objet… Clients JAVA RMI-IIOP : ils utilisent JNDI pour localiser les objets et Java Transaction API pour contrôler les transactions. Utilisation de JNDI JNDI sert à lier des ressources sur des noms logiques : utilisateurs, services, imprimantes, EJB, Datasource (base de données)… Clients CORBA : par exemple écrits en C++… Ils utilisent COS Naming Service et Object Transaction Service (OTS) pour les transactions… JNDI est un pont vers des services d’annuaire tels que LDAP, Microsoft Active Directory, Lotus Notes Domino Server, iPlanet Directory Server… Quel que soit le client Localiser (lookup) un objet Home, JNDI permet de rendre transparente la localisation des objets… Utiliser cet objet Home pour créer (create) un EJBObject, Appeler les méthodes de l'EJBObject, Supprimer (remove) l'EJBObject. © 2006, M. Riveill 99 © 2006, M. Riveill 100 Client : les étapes en images Client : le code package examples; import javax.naming.Context; import javax.naming.InitialContext; import java.util.Properties; /** * This class is an example of client code which invokes * methods on a simple stateless session bean. */ public class HelloClient { public static void main(String[] args) throws Exception { /* Setup properties for JNDI initialization. * These properties will be read-in from * the command-line. */ Properties props = System.getProperties(); … © 2006, M. Riveill 101 © 2006, M. Riveill Client : le code 102 Client : le code ... /* Get a reference to the home object - the * factory for Hello EJB Objects */ Object obj = ctx.lookup("HelloHome"); /* Home objects are RMI-IIOP objects, and so * they must be cast into RMI-IIOP objects * using a special RMI-IIOP cast. * See Appendix X for more details on this. */ HelloHome home = (HelloHome) javax.rmi.PortableRemoteObject.narrow(obj, HelloHome.class); /* Use the factory to create the Hello EJB Object */ Hello hello = home.create(); /* Call the hello() method on the EJB object. The * EJB object will delegate the call to the bean, * receive the result, and return it to us. * We then print the result to the screen. */ System.out.println(hello.hello()); /* Done with EJB Object, so remove it. * The container will destroy the EJB object. */ hello.remove(); … /* Obtain the JNDI initial context. * The initial context is a starting point for * connecting to a JNDI tree. We choose our JNDI * driver, the network location of the server, etc * by passing in the environment properties. */ Context ctx = new InitialContext(props); … } } © 2006, M. Riveill 103 © 2006, M. Riveill 104 Exécution du client de test Introduction aux Session Beans Place aux exercices !!!! A faire en TP lors de la première séance pour vérifier que vous avez bien compris Tiens, une question que représente le mot-clé this pour un EJB ? © 2006, M. Riveill 105 Session Bean : rappel Durée de vie d'un Session Bean Durée de vie = la session Un Session Bean représente En gros, le temps qu'un client reste connecté sur le bean. une action, un verbe, Dans une logique e-commerce, le temps qu'un utilisateur est connecté sur une logique métier, un algorithme, le site. Un enchaînement de tâches… Le container crée une instance lorsqu'un client se connecte sur le Session Bean. Exemples © 2006, M. Riveill Saisie d'une commande, Il peut le détruire lorsque le client se déconnecte. Compression vidéo, Les Session Beans ne résistent pas à des crashes du serveur. Gestion d'un caddy, d'un catalogue de produits, Ce sont des objets en mémoire, non persistants. Transactions bancaires… Le contraire des Entity Beans que nous verrons plus tard. 107 © 2006, M. Riveill 108 Types de Session Beans Stateful Session Beans Chaque EJB a un moment donné entretient une conversation avec un client. Certaines conversations se déroulent sous forment de requêtes successives. Conversation = suites d'appels de méthodes. Exemple : un client surfe sur un site de e-commerce, sélectionne des produits, remplit son caddy… Il existe deux types de Session Beans 1. Stateful Session Beans, 2. Stateless Session Beans. D'une requête HTTP à l'autre, il faut un moyen de conserver un état (le caddy par ex.) Autre exemple : une application bancaire. Le client effectue plusieurs opérations. On en va pas à chaque fois lui redemander son No de compte… Chacun modélisant un type particulier de conversation. © 2006, M. Riveill 109 © 2006, M. Riveill 110 Stateful Session Beans Stateless Session Beans Certaines conversations peuvent se résumer à un appel de méthode, sans besoin de connaître l'état courant du Bean En résumé, un Stateful Session Bean est utile pour maintenir un état pendant la durée de vie du client Ex : simple traitement, simple calcul (validation de No de CB), au cours d'appels de méthodes successifs. compression… Au cours de transactions successives. Le client passe toutes les données nécessaires au traitement lors de l'appel Si un appel de méthode change l'état du Bean, lors d'un autre de méthode. appel de méthode l'état sera disponible. Le container est responsable de la création et de la destruction du Bean Conséquence : une instance de Stateful Session Bean par client. Il peut le détruire juste après un appel de méthode, ou le garder en mémoire pendant un certain temps pour réutilisation. Avec certains containers, les Stateful Session Beans peuvent être persistants (BAS/BES…) par sérialisation. © 2006, M. Riveill Conséquence : une instance de Stateless Session Bean n'est pas propre à un client donné, elle peut être partagée entre chaque appel de méthode. 111 © 2006, M. Riveill 112 Pooling de Stateless Session Beans Pooling des Stateful Session Beans Le pooling des instances de Stateful Session Beans n'est pas aussi simple… Le client entretient une conversation avec le bean, dont l'état doit être disponible lorsque ce même client appelle une autre méthode. Problème si trop de clients utilisent ce type de Bean en même temps. Ressources limitées (connexions, mémoire, sockets…) Mauvaise scalabilité du système, L'état peut occuper pas mal de mémoire… Problème similaire à la gestion des tâches dans un OS… © 2006, M. Riveill 113 © 2006, M. Riveill 114 Pooling des Stateful Session Beans Pooling des Stateful Session Beans Avec un OS : on utilise le concept de mémoire virtuelle… Avec les Stateful Session Beans on fait pareil ! Entre chaque appel de méthode, un client ne fait rien (Idle), Un utilisateur d'un site de e-commerce lit les infos sur la page Lorsqu'un processus ne fait plus rien (Idle), on swappe son état mémoire sur disque dur, libérant de la place. www, réfléchit… de temps en temps il clique sur un bouton… Pendant qu'il ne fait rien, l'état du bean est swappé mais les ressources telles que les connexions BD, sockets, la mémoire intrinsèque qu'il occupe, peuvent être utilisées par un autre client. Lorsqu'on a de nouveau besoin de ce processus, on fait l'inverse. Etc… Ceci arrive souvent lorsqu'on passe d'une application à l'autre… © 2006, M. Riveill 115 © 2006, M. Riveill 116 En quoi consiste l'état d'un Bean Stateful? Pooling des Stateful Session Beans Ceci a un coût : L'état conversationnel d'un bean suit les règles de la sérialisation d'objets en java. l'activation/passivation génère des E/S En effet, la passivation (swap de la mémoire d’exécution vers la mémoire de stockage - disque) et l'activation (l'inverse) sont réalisées par sérialisation. Choix du bean à swapper par LRU le plus souvent (Least Recent Used) Choix du bean à activer : lorsqu'on le demande Rappelez-vous que javax.ejb.EnterpriseBean implémente java.io.Serializable (just in time) Tous les attributs du Bean non transients sont donc concernés. © 2006, M. Riveill 117 © 2006, M. Riveill En quoi consiste l'état d'un Bean Stateful? 118 Passivation d'un Stateful Session Bean Sont concernées également tous les attributs issus du container Références vers EJBObject, EJBHome, EJBContext, contextes JNDI… © 2006, M. Riveill 119 © 2006, M. Riveill 120 Activation d'un Stateful Session Bean Activation/Passivation callbacks Lorsqu'un bean va être mis en passivation le container l'avertit en appelant sa méthode ejbPassivate() Il peut libérer des ressources (connexions…) Idem lorsque le bean vient d'être activé, le container appelle ejbActivate() © 2006, M. Riveill 121 © 2006, M. Riveill Cycle de vie d'un Session Bean stateless © 2006, M. Riveill 122 Cycle de vie d'un Session Bean stateful 123 © 2006, M. Riveill 124 Count : l'interface distante Un exemple de statefull session bean package examples; import javax.ejb.*; import java.rmi.RemoteException; /** * These are CountBean ’s business logic methods. * * This interface is what clients operate on when they * interact with EJB objects.The container vendor will * implement this interface;the implemented object is * the EJB object,which delegates invocations to the * actual bean. */ public interface Count extends EJBObject { /** * Increments the int stored as conversational state */ public int count()throws RemoteException; } © 2006, M. Riveill CountBean : la classe du bean CountBean : la classe du bean /** Counts up */ public int count(){ System.out.println("count()"); return ++val; } // // EJB-required methods // public void ejbCreate(int val)throws CreateException { this.val =val; System.out.println("ejbCreate()"); } public void ejbRemove(){ System.out.println("ejbRemove()"); } public void ejbActivate(){ System.out.println("ejbActivate()"); } public void ejbPassivate(){ System.out.println("ejbPassivate()"); } public void setSessionContext(SessionContext ctx){ } package examples; import javax.ejb.*; /** * Demonstration Stateful Session Bean.This Bean is initialized * to some integer value,and has a business method which * increments the value. * * This example shows the basics of how to write a stateful * session bean,and how passivation/activation works. */ public class CountBean implements SessionBean { // The current counter is our conversational state. public int val; // //Business methods // © 2006, M. Riveill 126 127 © 2006, M. Riveill } 128 CountBean : la classe du bean CountHome : l'interface Home Val est serializable, représente l'état du bean Le bean est stateful mais ce n'est précisé nulle part dans le code. setSessionContext(SessionContext) Appelé par le container, L'objet SessionContext implémente public interface javax.ejb.SessionContext extends javax.ejb.EJBContext { public javax.ejb.EJBLocalObject getEJBLocalObject(); public javax.ejb.EJBObject getEJBObject(); } Ces deux méthodes permettent de récupérer une référence sur l'EJBObject associé au Bean, remplace le this pour les EJB ! © 2006, M. Riveill 129 package examples; import javax.ejb.*; import java.rmi.RemoteException; /** * This is the home interface for CountBean. This interface * is implemented by the EJB Server’s glue-code tools - the * implemented object is called the Home Object, and serves * as a factory for EJB Objects. * * One create() method is in this Home Interface, which * corresponds to the ejbCreate() method in the CountBean file. */ public interface CountHome extends EJBHome { /* * This method creates the EJB Object. * @param val Value to initialize counter to * @return The newly created EJB Object. */ Count create(int val) throws RemoteException, CreateException; } © 2006, M. Riveill ejb-jar.xml : descripteur de déploiement 130 Descripteur de déploiement propriétaire <!DOCTYPE ejb-jar PUBLIC Rien de spécial à signaler… "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" Truc intéressant à faire : indiquer au container que l'on ne désire pas plus de deux instances de l'EJB dans le pool. "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>Count</ejb-name> Si on crée trois Beans, ça va obliger le container à mettre en œuvre le pooling, à swapper l'état d'une instance lors des requêtes… <home>examples.CountHome</home> <remote>examples.Count</remote> <ejb-class>examples.CountBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> © 2006, M. Riveill 131 © 2006, M. Riveill 132 Client de l'EJB Client de l'EJB package examples; import javax.ejb.*; import javax.naming.*; import java.util.Properties; /** This class is a simple example of client code. * We create 3 EJB Objects in this example, but we only allow * the container to have 2 in memory. This illustrates how * beans are passivated to storage. */ public class CountClient { public static void main(String[] args) { try { /* Get System properties for JNDI initialization */ Properties props = System.getProperties(); /* Get a reference to the Home Object - the * factory for EJB Objects */ Context ctx = new InitialContext(props); CountHome home = (CountHome) javax.rmi.PortableRemoteObject.narrow( ctx.lookup("CountHome"), CountHome.class); /* An array to hold 3 Count EJB Objects */ Count count[] = new Count[3]; int countVal = 0; /* Create and count() on each member of array */ System.out.println("Instantiating beans . . . "); for (int i=0; i < 3; i++) { /* Create an EJB Object and initialize it * to the current count value */ count[i] = home.create(countVal); /* Add 1 and print */ countVal = count[i].count(); System.out.println(countVal); /* Sleep for 1/2 second */ Thread.sleep(500); } // try ... © 2006, M. Riveill 133 © 2006, M. Riveill Exécution du client, déploiement du Bea,n Client de l'EJB Sortie client /* Let’s call count() on each EJB Object to * make sure the beans were passivated and * activated properly. */ System.out.println("Calling count() on beans . . . "); for (int i=0; i < 3; i++) { /* Add 1 and print */ countVal = count[i].count(); System.out.println(countVal); /* Sleep for 1/2 second */ Thread.sleep(500); } // for /* Done with EJB Objects, so remove them */ for (int i=0; i < 3; i++) { count[i].remove(); } } catch (Exception e) { e.printStackTrace(); } // try } // main Instantiating beans . . . 1 2 3 Calling count() on beans . . . 2 3 4 } © 2006, M. Riveill 134 135 © 2006, M. Riveill Sortie serveur ejbCreate() count() ejbCreate() count() ejbCreate() ejbPassivate() count() ejbPassivate() ejbActivate() count() ejbPassivate() ejbActivate() count() ejbPassivate() ejbActivate() count() ejbPassivate() ejbActivate() ejbRemove() ejbActivate() ejbRemove() … 136 Introduction aux Entity Beans