Enterprise Java Beans http://java.sun.com/products/ejb/index.html Les enterprises Java Beans… Architecture permettant la création d’applications réparties selon l’architecture 3 parties Michel RIVEILL [email protected] - http://rangiroa.essi.fr/riveill interface traitement persistance Le composant de traitement est exécuté sur un serveur et il est appelé par un client distant Laboratoire I3S REMARQUE : Rien à voir avec les Java beans qui sont des composants côté client 2 Enterprise JavaBeans Enterprise Java Beans Rendre une application facile à développer, déployer et administrer indépendamment de la plate-forme permettant son exécution EJB spécifications = définition d’une architecture pour construire une application en Java dont la partie serveur est construite à à l’aide de composants appelé Entreprise Beans (EB) Architecture = ensemble d’interfaces Caractéristiques principales des EB « écrit une fois, s’exécute partout » composants « serveurs » spécialisés écrits en Java Un EB (EnterpriseBean) n’est pas spécifique de la plateforme dans laquelle il est utilisé Le déploiement d’un EB se fait sans recompilation ou modification du code source JavaBeans = composants clients visuels c.f. objets métiers de CORBA EJB est la partie centrale de la plate-forme 3 4 Plate-forme Enterprise Java Architecture de serveur EJB Composants Java beans Client HTML SGBD relationnel Serveur EJB HTTP Serveur WEB servlet RMI (JRMP, IIOP) RMI Client CORBA Composants Enterprise Java Beans IIOP (c++, Java, VB, …) Plate-forme EJB (Conteneur + Serveur) JMS JTA JDBC JNDI ... Client Java EB container EB container RMI SQL XQ OQL XQ SGBD objet Application, Applet ... Plate-forme Serveur (Unix, NT) + JVM + JDK Client DCOM RPC DCOM JTM ActiveX 5 EJB Caractéristiques principales 6 EJB Modèle d’exécution L’architecture EJB identifie les éléments suivants : composants logiciels ou beans (EB), conteneurs, serveurs, clients. Les conteneurs isolent les beans du client et d’une implémentation spécifique d’un serveur Rappel : les beans sont dans la partie serveur Conteneurs et serveurs implémentent les mécanismes de bas niveau utilisés par les applications transactions, persistance, gestion mémoire, … 7 8 EJB Caractéristiques principales EJB Les différents rôles EJB s’intéresse aux activités liées au développement, au déploiement et à l’exécution d’une application EJB définit différents rôles associés aux différentes parties intervenant dans la production d’une application EJB définit des contrats associés à un bean Fournisseur d’EB Enterprise Bean (EB) Assembleur d’application 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 l’EB et de conteneur Application L’installateur Développement de l’application Déploiement et exécution Fournisseur de conteneur EJB Fournisseur de serveur EJB Conteneu r Serveur Développement du serveur EJB Produit Utilise 9 EJB Le contrat coté client EJB contrats Fournir un modèle de développement uniforme pour les applications qui Contrat utilisent les composants EB Contrat coté client client client Contrat coté conteneur fournir une vue uniforme du bean au client. En particulier cette vue est indépendante de la plateforme de déploiement permettre la portabilité des beans sur différents serveurs EJB Contrat coté “packaging” (ejb-jar file) fournir un format de fichier standard pour “packager” les beans. Ce format doit être supporter par tous les outils liés aux EJB 10 Localiser le bean utilisation de JNDI Utiliser le bean utilisation de l’interface standard fournie par l’EB provider Enterprise Bean Contrat conteneur EBJ conteneur Home Interface (méthodes liées à la gestion du bean : create, remove, finder, ...) Remote Interface (méthodes de l’application) Le container implémente le mécanisme de délégation permettant de “faire suivre” l’appel au bean EJB serveur le client ne communique pas directement avec le bean mais avec le container Contrat parckaging Fichier ejb-jar 11 12 EJB Le contrat du “conteneur” Session beans L’EJB conteneur permet gestion du cycle de vie, gestion de l’état, sécurité, transaction distribuée, concurrence, extensibilité ces services appellent des méthodes fournies par le bean (callback methods) sont non persistant (short-lived) associé à un seul client un flot d’exécution est créé pour chaque appel de méthode Les conteneurs gèrent 2+1 types de beans propriétés et cycle de vie différent Session beans Entity beans Message driven beans plusieurs appels de méthodes en provenance du même client Sorte de sessions beans spécialisés dans les communications par échanges de messages stateless sessions bean pas de donnée interne, inutile de le rendre passif, peut être partagé par plusieurs clients stateful sessions bean sont détruits après un arrêt (ou une panne) de l’EJB serveur sont « transparents » aux transactions transmettent le contexte 13 14 Entity beans Cycle de vie d’un bean Représentent les données d’une base de données Le conteneur gère le cycle de vie d’un bean sont persistant (long-lived) la gestion de la persistance peut être faite par le bean (bean managed persistence) ou déléguée à son conteneur (container managed persistence) Il fournit administration du bean (‘Home implementation’) acceptent les accès multiples effectués par plusieurs clients gestion de la concurrence permet aux clients de créer, détruire et rechercher un objet EJB appelle les opérations correspondantes fournies par le bean (callbacks) gestion de l’état Activation Désactivation - Passivation le bean est chargé en mémoire peuvent participer à des transactions survivent aux pannes d’un serveur EJB les pannes sont cachées aux clients le conteneur peut sauvegarder l’état du bean 15 16 Cycle de vie d’un session bean stateless Cycle de vie d’un session bean stateful inexistant inexistant 1. 2. remove ejbRemove ejbRemove 1. 2. 3. 1. 2. 3. 4. create setSessionContext ejbCreate create newInstance setSessionContext ejbCreate ejbPassivate prêt prêt ejbActivate 17 Cycle de vie d’un entity bean passivé 18 Persistance Persistance gérée par le bean inexistant 1. 2. 1. 2. unsetEntityContext finalize newInstance setSessionContext le fournisseur de l’Entity Bean écrit les opérations d’accès aux données permettant de géré la persistance dans les callback appropriés (ejbCreate, ejbStore, ejbLoad, ejbFind ...) utilisation par exemple de JDBC ou d ’un SGF Persistance gérée par le conteneur 1. ejbCreate 2. ejbPostCreate (appelé par client) le fournisseur de l’Entity Bean utilise les services du conteneur (“container managed fields”) et précise le support utilisé pour la persistance le code d’accès à la base de donnée est délégué au conteneur En attente Dans les 2 cas ejbActivate (appelé par container) le conteneur est responsable de la cohérence entre l’état du bean et de l’état sauvegardé dans la base de données ejbPassivate prêt 1. ejbRemove 19 20 Transaction Bean’s transaction attribute Support de l’architecture XA (X/Open DTP architecture) extensions standards à JDBC 2.0 Java Transaction API (JTA) Modèle de transaction plat Pas de transaction imbriquées (nested) Gestion “déclarative” des transactions l’attribut transactionnel associé aux EBs est affecté soit lors de la phase d’implémentation du bean soit lors de son déploiement un bean peut aussi contrôler explicitement les transactions (JTA) un client peut aussi contrôler explicitement les transactions (JTA) Beans transaction Client’s transaction associated attribute transaction bean’s method TX_NOT_SUPPORTED none T1 none none TX_REQUIRED none T1 T1 T1 TX_SUPPORTS none T1 none T1 TX_REQUIRES_NEW none T1 T1 T2 TX_MANDATORY none T1 Error T1 TX_BEAN_MANAGED none T1 21 22 Gestion de la concurrence Sécurité Accès à plusieurs clients d’un entity bean La gestion de la sécurité est délégué au maximum au conteneur Spécification de la sérialisibilité Isolation level définis dans SQL Niveaux d’isolation Lecture sale Lecture non répétable Fantômes READ UNCOMMITED Oui Oui Oui READ COMMITED Non Oui Oui REPEATABLE READ Non Non Oui SERIALIZABLE Non Non Non objectif : simplifier la programmation du bean, améliorer la portabilité Le support de la sécurité est basé sur l’API sécurité de Java (javax.security) les méthodes liées à la sécurité peuvent être implémenté par le conteneur (javax.ejb.EJBContext interface) utilisation d’attributs de sécurité défini dans le descripteur du bean utilisé lors de la phase de déploiement runAsMode : CLIENT_IDENTITY, SPECIFIED_IDENTY, SYSTEM_IDENTITY RunAsIdentity : <identité> si SPECIFIED_IDENTITY Comme pour les transactions 2 modes Bean managed Container managed 23 24 Principaux bénéfices Un exemple de Bean L’exemple permet d’illustrer Le développement et le déploiement d’un bean Les mécanismes d’exécution Gestion d’un compte bancaire Composant persistant ¿ utilisation d’un Entity Bean Interface du Bean (vue par le client) ¿ Account.java 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 public interface Account extends EJBObject { public double getBalance() throws RemoteException; public void setBalance(double d) throws RemoteException; public String getCustomer() throws RemoteException; public void setCustomer(String c) throws RemoteException; } indépendants des applications Extensibilité du modèle 25 Architecture de l’application EJB home stub Spécification du bean entity bean “Account” gestion de la persistance gérée par le conteneur Le concepteur doit écrire le code suivant l’interface de gestion du bean - Home interface EJB Home object Client distant EJB object stub Ecriture d’un exemple conteneur IIOP IIOP EJB Compte Bancaire EJB Object 26 JDBC + XA JTM Espace d’adressage du client Espace d’adressage du conteneur l’interface d’accès à distance - Remote Interface La classe pour la gestion des clés d’accès aux différents comptes - Primary Key class (nécessaire uniquement pour les “entity beans”, encapsule le champ représentant la clé primaire d’un “entity bean” dans un objet) le code du bean 27 Account.java Oracle ou Instant DB RMI ext = extension de RMI afin de propager le contexte de la transaction comme un paramètre supplémentaire (ou utilisation de IIOP) AccountHome.java AccountBeanPK.java AccountBean.java le descripteur pour le déploiement 28 EJB Client/Serveur Processus de développement Home interface Développement d’un bean Ecrire / compiler le Primary Key class (pour un “entity bean”) Ecrire / compiler home et remote interfaces Ecrire / compiler l’implémentation du bean Construire le descripteur de déploiement (GenDD tool) Construire le fichier d’archive - jar file (packaging) Déploiement et exécution du bean Générer la classe d’interposition pour le conteneur Bull -> GenIC tool Etablir le fichier de propriété pour l’EJBServer Activer rmiregistry Activer l’EJBServer Exécuter le client Vue client de l’objet EJB Home (AccountHome.java) public interface AccountHome extends EJBHome { public Account create (int accno, String customer, double balance) throws RemoteException; public Account findByPrimaryKey (AccountBeanPK pk) throws RemoteException, FinderException; public Enumeration findLargeAccounts (double val) throws RemoteException, FinderException; } 29 30 Implémentation du Bean (1/2) Implémentation du Bean (2/2) class AccountBean implements EntityBean { protected EntityContext entityContext; public int accno public String customer; public double balance; public public public public public public public public public void void void void void void void void void ejbActivate() { ... } ejbPassivate() { ... } ejbCreate(...) { ... } ejbLoad() { ... } ejbStore() { ... } ejbRemove() { ... } setEntityContext(...) { ... } unsetEntityContext() { ... } ejbPostCreate(...) { ... } public double getBalance() throws RemoteException { return balance;} public void setBalance(double d) throws RemoteException { balance = balance + d;} public String getCustomer() throws RemoteException { return customer;} les deux upCalls ejbFindByPrimaryKey() et ejbFindLargeAccounts() sont généré uniquement si le conteneur gère la persistance 31 public void setCustomer(String c) throws RemoteException { customer = c;} 32 Creation des instances Home interface Méthodes de l’application Remote interface setBalance() Create(...) Begin newInstance() Account Home setEntityContext() Client Account Bean Client Account EJB Object setBalance() Account Bean ejbCreate(...) Account Ref commit Container 33 Gestion des transactions 34 Ecrire un client EJB Localiser le container du bean Le conteneur gère les transaction à l’aide des classes d’interposition qui sont générée automatiquement BullBean.java Si nécessaire, lier le bean au client preInvoke() { case TX_REQUIRES_NEW: clientTransaction=current.suspend(); Current.begin(); Utiliser le bean Libérer le bean postInvoke(){ case TX_REQUIRES_NEW: Current.commit(); Current.resume(clientTransaction); public void setBalance(double d){ BullBeanAccount.java this.preInvoke(); AccountBean.setBalance(d); this.postInvoke(); 35 36 Programmation du client Programmation d’un bean session Import tom.ejb.restaurant.*; Public class EJBClient { public static void main (String [] argv) { // récupérer le contexte JNDI javax.naming.Context initialContext = new javax.naming.InitialContext(); // récupérer la référence sur la Home interface RestaurantHome rh = initialContext.lookup(« RestaurantHome »); // créer un bean session Restaurant r = rh.Create(« Burger Heaven »), // appeler les méthodes du bean r.order(« cheeseburger »); // détruire le bean session r.remove(); } Créer l’interface ‘remote’ Doit étendre l’interface ‘javax.ejb.EJBObject’ Doit définir les méthodes métiers Créer l’interface ‘home’ Doit étendre l’interface ‘javax.ejb.EJBHome’ Doit définir les méthodes ‘create’ et ‘remove’ Implémentation de la méthode ‘create’ Est appelé par le conteneur lors de la création de l’objet Implémentation de l’interface ‘SessionBean’ ejbActivate() – appelé quand le bean est activé ejbPassivate() ejbRemove() setSessionContext(SessionContext ctx) - appelé par le container pour définir le contexte 37 38 Programmation d’un bean session Programmation d’un bean session Package tom.ejb.restaurant.server; Public class OrderBean implements SessionBean { private transient SessionContext ctx; private String order; // un bean peut avoir plusieurs méthodes create public void ejbCreate() throws Exception { // initiatialisation des variables d’instances } // méthodes métiers public boolean order(String order) { this.order = order; System.out.println(« order received for »+order); return true; } // ces méthodes sont requises par l’interface SessionBean public void ejbActivate() throws Exception{} public void ejbPassivate() throws Exception{} public void ejbDestroy() throws Exception{} public void setSessionContext(SessionContext ctx) throws Exception{this.ctx = ctx} Implémenter l’interface EntityBean ejbActivate() – appelé lors de l’activation ejbPassivate() ejbLoad() – appelé lorsque l’état est chargé depuis la base de donnée ejbStore() – appelé lors de l’opération inverse setEntityContext() – appelé lorsque l’instance a été créée unsetEntityContext() – appelé par le conteneur avant de supprimer l’instance ejbFind() – permet à un client de rechercher le bean Si nécessaire, implémenter les méthodes create() Créer l’interface remote Doit étendre l’interface ‘javax.ejb.EJBObject’ Créer l’interface home 39 40 Programmation d’un bean session Descripteur de déploiement Package tom.ejb.entity.server; Public class ExampleBean implements EntityBean { private transient EntityContext ctx; // la méthode ‘finder’ est générée lors du déploiement // un bean peut avoir plusieurs méthodes ‘create’ public void ejbCreate() throws Exception { } // méthodes métiers public boolean doSomething() { } // méthodes requises public void ejbActivate() throws Exception {} public void ejbPassivate() throws Exception {} public void ejbDestroy() throws Exception {} public void ejbLoad() throws Exception {} public void ejbStore() throws Exception {} public void setEntityContext(EntityContext ctx) throws Exception { this.ctx = ctx } public void unsetEntityContext() thows Exception { this.ctx = null } Account Deployment Descriptor Descripteur de déploiement (addendum) Si la persistance est gérée par le conteneur, le Bean fournisseur/installateur doit spécifier, dans l’environnement les propriétés du Bean le lien avec la base de données datasource.name jdbc_oracle1 db.TableName Account db.Field.accno accno db.Field.customer customer db.Field.balance balance la méthode de recherche du bean db.Finder.findLargeAccount AccountHome Remote interface Account Enterprise Bean AccountBean BeanHomeName “AccountHome1” ControlDescriptors TX_SUPPORTS Fichier xml 41 Home interface where balance > ? 43 Env. properties DataSource name ... ContainerManagedFields accno, customer, balance 42