introduction aux ejb
TRANSCRIPT
Par Oussama IDRISSI OUKILIPar Oussama IDRISSI OUKILI
ProblèmeConstruire des applications pour
entreprisesSuresSécuriséesSupportant la montée en charge (scalable)DisponiblesFavorisant la réutilisationMaintenables et extensiblesPour moins cher
MoyenUtiliser une architecture distribuéePlusieurs tiers
Les clients (front end)Les sources de données (back end)Un ou plusieurs tiers entre eux pour
Implanter les nouveaux services Intégrer les différentes sources de données Masquer la complexité de l’entreprise aux clients
Architecture à composants distribuésPermettent la construction d’applications
multi-tiersObjectif
Simplifier la création d’application à base d’objets distribués.
Promouvoir la programmation par composant pour le coté serveur
Composant logicielDoit permettre la construction de logiciel
par compositionExporte des propriétés et des méthodesPeut être configuré de façon externe
Un composant peut être réutilisable à différent degré
Composants connus :COM/DCOMJava BeansEnterprise Java BeansComposants Corba
Objet distribué (rmi)
Middleware Explicite
transfer(Account account1, Account account2, long amount) {
// 1: Call middleware API to perform a security check
// 2: Call middleware API to start a transaction// 3: Call middleware API to load rows from the
database// 4: Subtract the balance from one account, add
to the other// 5: Call middleware API to store rows In the
database// 6: Call middleware API to end the transaction}
Architecture 3-tiers
Les solutions existantesMicrosoft DNA (Distributed interNet
Applications Architecture)Windows NT + DCOM + MSMQ (message
queue) + MTS (transactions) + Wolfpack (clustering) + IIS (web server)+ MMC (administration et déploiement)
Sun J2EE (spécification)OMG Corba (specification) et les composants
Corba.
J2EEDéfinit une architecture standard incluant
Un modèle de programmation (application multi-tiers, client légers)
Une plate-forme (ensemble de spécifications et de politiques requises)
Un ensemble de test de compatibilitéUne implantation de référence
Architecture d’une application J2EE
La plateforme J2EEEJB : définit la façon dont les composant doivent être écrit et
le contrat qu’ils doivent respecter avec le serveur d’application
RMI : communication inter procédés JNDI : service de nommage JDBC : connection vec les bases de données JTA : service de transaction JMS : service de messagerie JSP : servlet et Java Server Page adapté à la construction de
composant réseau Java IDL : permet l’intégration avec d’autres langages (en
particulier à travers CORBA) JavaMail Connectors : intégration à des systèmes d’information
existantXML
Les Enterprise JavaBeansSpécification d’une architecture permettant
la création d’applications distribuées2 versions
1.1 : la plus courante 3.0 : la plus récente
Implantations de la spec : BEA WebLogic, Jonas, Borland Appserver, IBM
Websphere, Jboss (open source)
Composant développé pour être exécuté sur un serveur d’EJBNe pas confondre avec un java bean
Les Enterprise JavaBeans
Objectifs des EJBFournir une plate-forme standard pour la
construction d’applications distribuées en Java
Simplifier l’écriture de composants serveurs
PortabilitéConsidérer le développement, le
déploiement et l’exécution des applications
Division des responsabilitésLe fournisseur de bean
Produit les composants métierLe fournisseur de conteneur EJB
Fournit l’environnement permettant l’exécution des beans
Le fournisseur de serveur EJBFournit l’environnement d’exécution pour un
ou plusieurs conteneursL’assembleur d’applicationLe déployeur (installateur)L’administrateur
Les Enterprise BeansComposants qui peuvent être déployés dans un
environnement multi-tiers et distribué.Exposent une interface qui peut être appelé par
ses clientsConfigurés de façon externeL’interface et l’implantation du bean doivent être
conforme à la spécification EJBLes clients peuvent être
Un servlet Une applet Un autre bean
Les Enterprise Beans
Les types de BeansSession Beans : contiennent la logique métier
de l’applicationStateful session beanStateless session bean
Entity Beans : contiennent la logique de gestion des données persistantes
Message bean : contiennent la logique orientée message
Session BeanFournit un service à un clientDurée de vie limitée à celle du clientEffectue des calculs ou des accès à une base
de donnéePeut être transactionnelNon recouvrablePeuvent être sans état ou conversationnel
(stateless ou stateful)
Exemple de Session beanpublic class CartBean implements SessionBean {
String customerName; Vector contents; public void ejbCreate(String person) throws CreateException {
… initialisation du bean }// business method public void addBook(String title) { … // code de la méthode} public void removeBook(String title) throws BookException {… } public Vector getContents() {…}
// methodes appelées par le conteneur public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {}}
L’interfaceL’interface décrit le contrat avec les clients
public interface Cart extends EJBObject { public void addBook(String title) throws RemoteException; public void removeBook(String title) throws BookException,
RemoteException; public Vector getContents() throws RemoteException;
}
La factoryDéfinit les méthodes permettant de créer, trouver
et détruire des objets EJB
public interface CartHome extends EJBHome { Cart create(String person) throws RemoteException, CreateException; }
Le descripteur de déploiementFournit les informations nécessaires au déploiement dans
le conteneur et pour la configuration des intercepteurs<enterprise-beans>
<session>
<display-name>CartEJB</display-name>
<ejb-name>CartEJB</ejb-name>
<home>CartHome</home>
<remote>Cart</remote>
<ejb-class>CartBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
Déploiement (suite) <assembly-descriptor> <method-permission> <role-name>user<role-name/> <method> <ejb-name>CartEJB</ejb-name> <method-intf>Remote</method-intf> <method-name>getContents</method-name> <method-params /> </method></method-permission><container-transaction> <method> <ejb-name>CartEJB</ejb-name> <method-intf>Remote</method-intf> <method-name>getContents</method-name> <method-params /> </method> <trans-attribute>Required</trans-attribute> </container-transaction></assembly-descriptor></ejb-jar>
Le clientpublic class CartClient { public static void main(String[] args) {
Context initial = new InitialContext(); // context JNDI CartHome home = initial.lookup("java:comp/env/ejb/SimpleCart");
// Recherche de l’interface de la factory
// Creation de l’objet session Cart shoppingCart = home.create("Duke DeEarl« xs);
// appel de quelques business méthodes shoppingCart.addBook("The Martian Chronicles"); Vector bookList = new Vector(); bookList = shoppingCart.getContents();
shoppingCart.removeBook("Alice in Wonderland");
// suppression de l’objet session shoppingCart.remove();}
Les entity beansImplantation d’objets métiers persistants
(client, compte,…)Persistance gérée par
Les conteneurs (CMP)Le bean lui-même (BMP)
Le conteneur gère également les transactions et la sécurité pour le composant.
Utile pour gérer les accès concurrents à des données persistantes.
Exemple d’entity bean (CMP)public class BookEJB implements
javax.ejb.EntityBean { public String author; public String titlel; public int price; private EntityContext context;
public String getTitle() {return title;} public String getAuthor() {return author;}; public int getPrice() {return price;} public void setPrice(int _price) {price=_price;}
public String ejbCreate (String _author, String _title) throws CreateException {author=_author;title=_title;price=0;return null;
}
…
…// Méthodes requises par le conteneur public void ejbPostCreate(String
_author,String _title) { } public void ejbRemove() { } public void ejbLoad() { } public void ejbStore() {}
public void setEntityContext(EntityContext context) {
this.context = context;}
public void unsetEntityContext() {context=null; }
public void ejbActivate() { } public void ejbPassivate() { }}
Home interfacepublic interface BookHome extends EJBHome {
public Book create(String id, String url) throws RemoteException, CreateException;
public Book findByPrimaryKey (String id) throws RemoteException, FinderException;
public Collection findAll() throws RemoteException, FinderException;
Public Collection findByAuthor(String author) throws RemoteException, FinderException;
}
Interface de l’Entity Beanpublic interface Book extends EJBObject {
public String getAuthor() throws RemoteException; public String getTitle() throws RemoteException; public int getPrice() throws RemoteException; public void setPrice(int mode) throws RemoteException;
}
Le descripteur de l’entity bean
<entity> <display-name>Book</display-name> <ejb-name>Book</ejb-name> <home>BookHome</home> <remote>Book</remote> <ejb-class>BookEJB</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>False</reentrant> <cmp-field><field-name>title</field-name></cmp-field> <cmp-field><field-name>author</field-name></cmp-field> <cmp-field><field-name>price</field-name></cmp-field>
<primkey-field>title</primkey-field> <query> <description></description> <query-method> <method-name>findByAuthor</method-name>
<method-params><method-param>java.lang.String</method-param></method-params>
</query-method> <ejb-ql>select distinct object(b) from Book b where b.author=?1</ejb-
ql> </query></entity>
Message Driven Bean (ejb2.0)Intégration des EJB et de JMSInteractions asynchronesUtilisé pour réagir à des messages JMSStateless beanUne seule méthode dans l’interface
onMessage()
Exemple de message bean <message-driven>
<ejb-name>ValueContainerListener</ejb-name> <ejb-class>hero.container.ValueContainerListener</ejb-class>
<message-selector>JMSType='ValueContainer'</message-selector> <transaction-type>Container</transaction-type> <ejb-ref>
<description>Value Container Home</description> <ejb-ref-name>ejb/valuecontainer</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type>
<ejb-link>ValueContainer</ejb-link> <home>hero.container.ValueContainerHome</home> <remote>hero.container.ValueContainer</remote>
</ejb-ref> <message-driven-destination> <destination-type>javax.jms.Topic</destination-type> <subscription-durability>NonDurable</subscription-durability> </message-driven-destination> </message-driven>
DéploiementCréation d’un paquetage contenant
Les classes des beansLe fichier de descriptionLes fichiers de configuration spécifique au
serveurD’autres librairies
Mise en place dans le serveur (outils spécifique ou déploiement à chaud)
Intérêt des EJBSimplicité de l’écriture des composants
Mais le design est plus complexePortabilité des composants
A l’exception des adaptations des serveursRéutilisation/Composition
Il faut quand même programmerIndépendance par rapport aux vendeurs
Bénéfices d’un serveur d’EJBGestion automatisée des stocks de
ressourcesGestion automatisée du cycles de vie des
composantsGestion de la concurrenceScalabilitéFonctionnalités déclarativesDisponibilité et tolérance aux pannesModèle d’objet distribué…
Limites actuelles (variables selon les serveurs)
Maturité de la spécification, des technologies,…Moins vrai depuis la version 2.0
Performances ?Environnements de développementComplexité du designExpérience des développeurs
Bibliographie et sources des schémas J2EE Specification
Java.sun.com/products/j2eeEnterprise Java Beans Specification 1.1 et 2.0
Java.sun.com/products/ejbMastering Enterprise JavaBeans and the Java 2 Platform
Enterprise Edition – Ed Roman – Wiley Computer publishing 1999
www.theserverside.com java.sun.com/j2ee/tutorialwww.jboss.org (serveur Open Source)Support de cours de Didier Donsez (université de
Valenciennes) J2EE blueprints (java.sun.com)Mastering Enterprise JavaBeans II – Ed Roman -
(www.theserverside.com)