Enterprise Java Beans (EJB)

Programming, Java, Software Architecture · lab

Voir tous les documents en programmation

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