EJB
ENTERPRISE JAVA BEANS
DÉFINITION
EJB : Enterprise Java Beans
Les EJB sont des extensions des Java Beans : une technologie utilisée pour développer des composants Java réutilisables.
Un composant écrit en Java ➔ Une brique applicative s’exécutant côté
serveur,
➔ Objectif : construire des applications
distribuées
EJB est une architecture de composants
logiciels côté serveur pour la plateforme de développement J2EE.
DÉFINITION (SUITE)
JavaBean = Java (un café)+Bean (un grain de
café)
Un ensemble de grains de café permet la
fabrication de café. Chaque grain apporte sa contribution à l’arôme et à la saveur du café
JavaBean = Une classe Java indépendante qui
définit des propriétés (données) et des méthodes décrivant ses différents services. Un logiciel est conçu par assemblage des
services offerts par les JavaBeans.
Chaque JavaBean apporte sa contribution aux
traitements du logiciel.
PRÉSENTATION
Le but des EJB est de faciliter la création
d’applications distribuées pour les entreprises.
4
PRÉSENTATION
Les EJB sont parfaitement adaptés pour être intégrés dans une architecture trois tiers ou plus.
Dans une telle architecture, chaque tier
assure une fonction particulière :
➢ Le client « léger » assure la saisie et l'affichage des données sur le serveur,
➢ les objets métiers contiennent les
traitements. Les EJB sont spécialement conçus pour constituer de telles entités.
➢ Une base de données assure la
persistance des informations
SERVEUR D’APPLICATION / CONTENEUR D’EJB
- Un container EJB est un environnement d’exécution pour un composant EJB. - Un EJB s’exécute sur un container EJB. -Un container EJB s’exécute sur un serveur d’application - Rôle: o Encapsule un composant o Fournit des services de nommage, de gestion du cycle de vie, persistance, sécurité, transaction
PRÉSENTATION
Les EJB permettent de : ➢ Représenter des données manipulées par
l’application (EJB dit Entity),
➢ Proposer des services avec ou sans
conservation d’état entre les appels (EJB dit Session),
➢ Accomplir des tâches de manière asynchrone
(EJB dit Message Driven Bean).
7
DIFFÉRENTS TYPES D’EJB
Il existe trois types d’EJB : EJB Session: réalisation d’une tâche pour un client EJB Entity: modélisation d’une donnée persistance (Ex: lignes dans une table de BD) EJB Message Driven : réception de messages suite à un évènement
SESSION BEANS
Il existe différents types: - Stateless : sans état - Statefull : avec état - Singleton: Instance Unique
SESSION BEANS
- Stateless : sans état • Une instance est créée par le serveur pour
plusieurs connexions clientes.
• En cas de demandes simultanées, d'autres
instances sont créées.
• Ce type de bean ne conserve aucune donnée
dans son état.
SESSION BEANS
- Statefull : avec état • Création d’une instance pour chaque connexion
cliente.
• Ce type de bean peut conserver des données
Publicité
entre les échanges avec le client.
SESSION BEANS
- Singleton: Instance Unique • Création d’une instance unique quelque soit le
nombre de connexions.
• Autorise les accès concurrents
CYCLE DE VIE D’UN EJB SESSION
Stateful
▪create et remove invoquées par le client ▪Le conteneur peut décider de "passiver" le bean(sauvegarde temporaire du beanen cas de besoin de mémoire)
Stateless
▪ même diagramme d'états sauf pas de passivation
Inexistant
create
remove
Prêt
passivate
activate
Passif
UTILISATION D’UN EJB (1/2)
Chaque EJB fournit 2 interfaces d'accès
distant: ▪ Remote : les services "métiers" (méthodes) fournis par le bean ▪ RemoteHome : interface de gestion du composant (création, recherche, destruction d'instances de bean)
Le client doit :
▪ Localiser le Bean par JNDI ▪ Utiliser le Bean via RemoteHome et Remote
UTILISATION D’UN EJB (2/2)
+ éventuellement 2 interfaces d'accès local (à
partir EJB 2.0)
(i.e. pour clients hébergés dans le même conteneur → meilleure performance) ▪Local: Services "métiers" (méthodes) fournis par le Bean ▪LocalHome: Gestion du composant
PROCESSUS DE DÉVELOPPEMENT
1. Développement d’un Bean
Ecrire la RemoteHome interface Ecrire la Remote interface Ecrire l’implémentation (classe) du
bean
Compiler ces classes et interfaces
2. Déploiement du Bean
Construire le descripteur de
déploiement
Construire l’archive .jar
3. Utilisation du Bean
Ecrire, compiler et exécuter le client
(Servlet ou application Java ou
Applet)
16
DÉVELOPPEMENT D’UN EJB SESSION
Développement
▪2 interfaces + 1 classe
Interface Remote
▪services "métiers" fournis par le bean ▪extends javax.ejb.EJBObject
Interface RemoteHome
▪gestion du bean ▪extends javax.ejb.EJBHome
Classe Java
▪code des interfaces Remote et RemoteHome ▪implements javax.ejb.SessionBean
EXEMPLE: EJB CALCULATRICE INTERFACE D’UTILISATION (REMOTE) 32
package p; import javax.ejb.*; import java.rmi.*; public interface CalculatriceRemote extends
EJBObject {
public double add(double v1,double v2) throws
RemoteException;
public double sub(double v1,double v2) throws
RemoteException;
public double mul(double v1,double v2) throws
RemoteException;
public double div(double v1,double v2) throws
Publicité
RemoteException;
}
}
L'INTERFACE REMOTE
L'interface remote permet de définir les méthodes qui contiendront les traitements proposés par le bean. Cette interface doit étendre l'interface javax.ejb.EJBObject. Toutes les méthodes définies dans cette
interface doivent obligatoirement respecter les spécifications de RMI et déclarer qu'elles peuvent lever une exception de type RemoteException.
EXEMPLE: EJB CALCULATRICE INTERFACE DE CRÉATION (HOME)
package p; import javax.ejb.*; import java.rmi.*;
public interface CalculatriceRemoteHome
extends EJBHome {
public CalculatriceRemote create() throws RemoteException,
CreateException;
}
L'INTERFACE HOME
L'interface home permet de définir des
méthodes qui vont gérer le cycle de vie du bean. Cette interface doit étendre l'interface EJBHome.
La création d'une instance d'un bean se fait grâce à une ou plusieurs surcharges de la méthode create(). Chacune de ces méthodes renvoie une instance d'un objet du type de l'interface remote.
La ou les méthodes à définir dans l'interface
home dépendent du type d'EJB :
EXEMPLE: EJB CALCULATRICE CLASSE D’IMPLÉMENTATION package p; import javax.ejb.*; public class CalculatriceBean implements
SessionBean {
/* Méthodes de l'interface Remote */ public double add(double v1,double v2) {return
v1+v2;}
public double sub(double v1,double v2) {return v1-
v2;}
public double mul(double v1,double v2) {return
v1*v2;}
public double div(double v1,double v2) {return
v1/v2;}
/* Méthodes de l'interface RemoteHome */ public void ejbCreate() throws CreateException {} /* Méthodes de l'interface SessionBean */ public void ejbActivate() { } public void ejbPassivate() { } public void ejbRemove() { } public void setSessionContext(SessionContext sc){ } }
DÉPLOIEMENT D’UN EJB EXEMPLE
<enterprise-beans>
<session>
<ejb-name>MaCalculatrice</ejb-name>
<home>p.CalculatriceHome</home>
<remote>p.CalculatriceRemote </remote>
<ejb-class>p.CalculatriceBean </ejb-class>
<type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
EXEMPLE: EJB CALCULATRICE UTILISATION (CLIENT)
import javax.naming.*; import javax.ejb.*; public class Client { public static void main(String args [ ]) throws Exception {
JNDI: Récupération d’une référence sur le serveur de noms
Context ic = new InitialContext();
Recherche l’objet bean dont le nom a été attribué par JNDI
Object obj =
ic.lookup("java:global/ProjetEjb/MaCalculatrice");
CalculatriceRemoteHome home =
(CalculatriceRemoteHome)
Construction souche cliente pour l'accès (distant) à la Home
PortableRemoteObject.narrow(obj,CalculatriceRemoteHom
e.class);
CalculatriceRemote b = home.create();
double res = b.add(3,6); } }
Interface Home
Home
Client
Interface Métier:
Publicité
Composant
EJB 2
Implémentation du composant
Descripteur de déploiement
<resource-ref> <..name>jdbc/MyDS … <trans-attribute>Required
Logique métier … + Callbacks … + ic=new InitialContext(); o = ic.lookup( ‘’…’);
Conteneur EJB
25
EJB 3
Implémentation du composant
Client
Business Interface
Logique métier + Annotations déploiement EJB3 + Callbacks conteneur
Interface Métier:
Conteneur EJB
Simplification : 1 classe, 1 ou 2 interfaces - L’interface Home (cycle de vie) disparaît - Le descripteur de déploiement devient facultatif (remplacé par des annotations java dans le bean) -
26
EXEMPLE: EJB CALCULATRICE INTERFACE D’UTILISATION (REMOTE) SIMPLIFIÉE 32
package monpaquet.EJB; import javax.ejb.Remote;
@Remote public interface CalculatriceRemote
{
public double add(double v1,double v2);
public double sub(double v1,double v2) ;
public double mul(double v1,double v2) ;
public double div(double v1,double v2) ;
}
CLASSE EJB SIMPLIFIÉE
package monpaquet.EJB; import javax.ejb.*;
@Stateless public class CalculatriceBean implements
CalculatriceRemote {
/* Méthodes de l'interface Remote */ public double add(double v1,double v2) { return v1+v2;} public double sub(double v1,double v2) { return v1-v2;} public double mul(double v1,double v2) { return v1*v2;} public double div(double v1,double v2) { return v1/v2;}
}
EXEMPLE 1 (UTILISATION)
import javax.naming.*; import javax.ejb.*;
import monpaquet.EJB.*;
public class Client { public static void main(String args [ ]) throws Exception {
// Création du contexte
Context ic = new InitialContext();
// Recherche du bean enregistré avec JNDI Object obj = ic.lookup("
java:global/ProjetEjb/MaCalculatrice ");
// Récupération du bean réel CalculatriceRemote b = (CalculatriceRemote) obj;
// Appel méthode du Bean double res = b.add(3,6);
…
}
}
29
EXEMPLE 2 (AVEC ANNOTATION)
import monpaquet.EJB.*;
import javax.ejb.*;
public class Client { public static void main(String args [ ]) throws Exception {
// Injection d’un EJB
// Remplace l’utilisation implicite de JNDI @ EJB CalculatriceRemote b ;
// Appel méthode du Bean double res = b.add(3,6);
…
}
}
30