Vous êtes sur la page 1sur 24
Formation J2EE Partie III (Composant métier: EJB3.0)
Formation J2EE
Partie III
(Composant métier: EJB3.0)
Ahmed JEMAL Email : Riadh BEN HALIMA Email : jmlhmd@gmail.com riadh.benhalima@enis.rnu.tn
Ahmed JEMAL
Email :
Riadh BEN HALIMA
Email :
jmlhmd@gmail.com
riadh.benhalima@enis.rnu.tn

Plan

Introduction

Composant EJB

EJB2.0

EJB3.0

Session Bean

Injection de dépendance (IoC)

Entity Bean (JPA)

Message Driven Bean

Web Service EndPoint

Intercepteurs

Composant web

Web Service EndPoint  Intercepteurs  Composant web 2 Introduction : Limites des objets distribués et

2

Introduction : Limites des objets distribués et extensibilité

Extension du serveur par un nouvel objet :

arrêt et recompilation du serveur, redémarrage des clients (même ceux qui n’utilisent pas l’extension)

Extension des interfaces ou des implémentations

arrêt et recompilation du serveur et/ou

arrêt et recompilation des clients (même ceux qui n’utilisent pas l’extension)

Le développeur gère lui-même :

le cycle de vie des objets (au niveau des factories)

chaque instance = une variable, une case d ’un tableau, etc

tous les services externes à son application (persistance, nommage,…) (au niveau de l’objet applicatif)

nommage,…) (au niveau de l’objet applicatif) 3 Introduction : Programmation orientée composant  La

3

Introduction : Programmation orientée composant

La Programmation orientée-composants est la combinaison de :

L’aspect fonctionnel de la programmation orientée objets,

L’aspect non-fonctionnels:

Gestion de cycle de vie

Gestion de la persistance

Gestion de déployement

avec l'extensibilité comme objectif

[source]: Clemens Szyperski. Component-Oriented Programming, A Refined Variation on Object-Oriented Programming. [The Oberon Tribune,Vol 1, No 2, December 1995]. http://www.oberon.ch/resources /component_software/cop.html

[The Oberon Tribune,Vol 1, No 2, December 1995]. http://www.oberon.ch/res ources /component_software/cop.html 4

4

Introduction : Prog. orientée objet vs. prog. orientée composant

Programmation orientée objets =

polymorphisme +

quelque liaison dynamique (« some Late Binding ») +

une certaine abstraction des informations («some Information Hiding») :

Tous les mécanismes offerts au niveau développement : encapsulation, protection (public/private/protected)

héritage

Programmation orientée composants =

polymorphisme +

liaison dynamique systématique (« really Late Binding ») +

vraie abstraction des informations («real Information Hiding») :

Au niveau utilisation

sûreté et sécurité (safety) : au niveau utilisation

[source]: Clemens Szyperski. Component-Oriented Programming,A Refined Variation on Object-Oriented Programming. [The Oberon Tribune,Vol 1, No 2, December

1995].http://www.oberon.ch/resources/component_software/cop.html

5 Introduction : Le composant : une nouvelle entité de

5

Introduction : Le composant : une nouvelle entité de programmation

Déf [1]:

Une entité autonome (Boite noire) de code logiciel composée de ses propres données et logique avec des connexions ou des interfaces bien définies et exposées à la communication.

Elle est conçue pour usage répété (Réutilisation) lors du développement d’applications avec ou sans personnalisation.

[1]: Edward Cobb. CORBA Components:The Industry’s First Multi-Language Component Standard. Document omg/00-06-01 (CCM Tutorial). http://www.omg.org

Déf [2]:

Un composant logiciel est un code qui implante un ensemble bien défini d’interfaces. C’est un gros morceau de logiciel gérable. Les composants ne sont pas des applications entières. Ils ne peuvent pas s’exécuter seuls. Ils sont utilisés, plutôt, comme des morceaux de puzzles pour résoudre un problème plus large.

[2] : Ed Roman. Mastering the Entreprise Java Beans. John Wiley & Sons Inc. 1999

the Entreprise Java Beans. John Wiley & Sons Inc. 1999 6 Introduction : Le génie logiciel

6

Introduction : Le génie logiciel orienté composant : Ing, Prod,…

Fournisseur de 1 Utilisateur final composant Construire un 4 Maintenir composant l’application Construire une
Fournisseur de
1
Utilisateur final
composant
Construire un
4
Maintenir
composant
l’application
Construire une
Déployer le
application
système
Assembleur
Déployeur
Administrateur
d’applications
Fournisseur de
2
3
conteneur/serveur
7

Les bases communes aux modèles composants émergeants

Cycle de développement et intervenants:

Développement des composants (Ingénierie):

pas de phase d’intégration finale

Développement des applications (Production):

par assemblage de composants

Architecture des composants:

Interfaces multiples

Connexions

Infrastructure :

Conteneur

Services de base : transaction, sécurité, événement, persistance

 Infrastructure :  Conteneur  Services de base : transaction, sécurité, événement, persistance 8

8

Définition: Composant J2EE

Composant J2EE

–“A J2EE component is a self-contained functional software unit that is assembled into a J2EE application with its related classes and files and that communicates with other components.” [Sun]

Trois types de composants dans J2EE

Composants clients : client standalone, client web, applet

Composants Web : Servlet, JSP

Composants Business : Enterprise Java Beans (EJB)

JSP  Composants Business : Enterprise Java Beans (EJB) 9 Définition: Composants Business (Enterprise Java Beans)

9

Définition: Composants Business (Enterprise Java Beans)

EJB

“Written in the Java programming language, an Enterprise Bean is a server-side component that encapsulates the business logic of an application.” [Sun]

Un composant autonome du coté serveur qui encapsule la logique métier de l’application

on se focalise sur la logique applicative (fonctionnels)

les services systèmes (non-fonctionnels) sont fournis par le conteneur

la logique de présentation est du ressort du client

 la logique de présentation est du ressort du client 10 Objectifs des EJB  Fournir

10

Objectifs des EJB

Fournir un modèle standard pour la construction d’applications distribuées en Java

Développement (Ing./Prod.)

Déploiement

Exécution

Simplifier l’écriture de composants serveurs

Portabilité (Java, inter-conteneurs)

serveurs  Portabilité (Java, inter-conteneurs) 11 Type de composants EJB  Types d'EJB  Session

11

Type de composants EJB

Types d'EJB

Session : assure une tâche au client.

Entity : représente un composant métier qui est enregistré d’une manière permanente.

Message-Driven : se base sur la notification par des messages asynchrones

d’une manière permanente.  Message-Driven : se base sur la notification par des messages asynchrones 12

12

Composants EJB (1/2)

Enterprise Java Bean (EJB)

Modèle de composants pour le développement d'applications d'entreprises

Présentation

Traitement

d'entreprises Présentation Traitement Serveur d’applications (Objets métiers=EJB) Client
d'entreprises Présentation Traitement Serveur d’applications (Objets métiers=EJB) Client

Serveur d’applications (Objets métiers=EJB)

Traitement Serveur d’applications (Objets métiers=EJB) Client léger Données Composants EJB (2/2) Assurer la
Traitement Serveur d’applications (Objets métiers=EJB) Client léger Données Composants EJB (2/2) Assurer la

Client léger

Données

Composants EJB (2/2)

Assurer la gestion : - du cycle de vie du bean -de l'accès au bean
Assurer la
gestion :
- du cycle de vie du bean
-de l'accès au bean
- de la sécurité d'accès
- des accès concurrents
- des transactions
d'accès - des accès concurrents - des transactions  Enterprise Java Bean (EJB) Serveur d’application

Enterprise Java Bean (EJB)

Serveur d’application

Conteneur d’EJB EJB EJB
Conteneur d’EJB
EJB
EJB
Conteneur d’EJB EJB EJB EJB
Conteneur d’EJB
EJB
EJB
EJB
d’EJB EJB EJB Conteneur d’EJB EJB EJB EJB Navigateur/ Application SGBD (Gestion de la persistance)

Navigateur/

Application

Conteneur d’EJB EJB EJB EJB Navigateur/ Application SGBD (Gestion de la persistance) Gestion de la persistance
Conteneur d’EJB EJB EJB EJB Navigateur/ Application SGBD (Gestion de la persistance) Gestion de la persistance
Conteneur d’EJB EJB EJB EJB Navigateur/ Application SGBD (Gestion de la persistance) Gestion de la persistance
Conteneur d’EJB EJB EJB EJB Navigateur/ Application SGBD (Gestion de la persistance) Gestion de la persistance

SGBD (Gestion de la persistance)

Gestion de la persistance pour < EJB2.1 (EJB3.0 :API Java Persistence)

pour < EJB2.1 (EJB3.0 :API Java Persistence) 13 14 Composants EJB1.0 Enterprise Java Bean Machine 1

13

pour < EJB2.1 (EJB3.0 :API Java Persistence) 13 14 Composants EJB1.0 Enterprise Java Bean Machine 1

14

Composants EJB1.0

Enterprise Java Bean

Machine 1 Machine 2 EJ Bean RemoteHome interface Client Remote distant interface
Machine 1
Machine 2
EJ Bean
RemoteHome
interface
Client
Remote
distant
interface

Chaque EJ Bean fournit 2 interfaces d'accès distant (EJB1.0)

Remote : les services "métiers" (méthodes) fournis par le bean

RemoteHome : l’interface de gestion du composant (création, recherche, destruction d'instances de bean)

recherche, destruction d'instances de bean ) 15 Composants EJB: Utilisation Chercher la référence de

15

Composants EJB: Utilisation

Chercher la référence de MyHome au près du JNDI JNDI 1 2 MyHome Client
Chercher la référence
de MyHome au près du
JNDI
JNDI
1
2
MyHome
Client
4 RMI-IIOP
4
RMI-IIOP
3
3

Enterprise Java Bean Home

Singleton (1 seule instance par bean)

Unique point d’accès au bean (jamais accès direct aux beans)

Recherche ou création de beans

Enregistrée dans le service de nommage (JNDI)

(Java Naming and Directory Interface)

ou création de beans  Enregistrée dans le service de nommage (JNDI) (Java Naming and Directory

16

Composants EJB2.0

Enterprise Java Bean

Machine 2 EJ Bean RemoteHome LocalHome interface interface Client distant Remote Local interface interface
Machine 2
EJ Bean
RemoteHome
LocalHome
interface
interface
Client
distant
Remote
Local
interface
interface

+ éventuellement 2 interfaces d'accès local (à partir d’EJB 2.0)

(i.e. pour composants hébergés dans le même conteneur meilleure performance)

les services "métiers" (méthodes) fournis par le bean

interface de gestion du composant

Local

LocalHome

bean  interface de gestion du composant Local LocalHome 17 Taxonomie des composants EJB 2.0 Style

17

Taxonomie des composants EJB 2.0 Style moniteur de transactions : Entreprise courte durée de vie,
Taxonomie des composants EJB 2.0
Style moniteur de transactions :
Entreprise
courte durée de vie, pas de clef,
relation 1-à-1 avec les clients, accès
explicite aux BD.
Exemple : Serveur E-commerce
Java Beans
Vue composant d’une colonne ou
d’un objet de base de données.
Peut avoir une longue durée de vie,
accès avec clef, stateful, 1-à-N
relation avec les clients.
Exemple: Client de E-commerce
Session
Entity
Beans
Beans
Message
Exemple: Agent
inventaire
Driven Beans
Stateless
Stateful
Container-
Self-
(sans état)
(avec état)
Managed
Managed
Exemple:
Notification
Explicitement via
Exemple: Shopping
asynchrone
Via le mapping
vers les services
JDBC
(Caddie)
18

Limites de la version EJB2.x

EJB2.0 : Complexe et lourd à mettre en œuvre

Création de plusieurs interfaces et classes (Bean, Local, RemoteHome,…)

Implémentation de méthodes callback généralement inutiles

L'interface de l'EJB doit hériter de EJBObject ou de EJBLocalObject

Chaque méthode de l'EJB doit lever l'exception RemoteException

Le descripteur de déploiement des EJB est obligatoire et complexe

L'appel d'un EJB par un client nécessite obligatoirement une utilisation de JNDI

obligatoirement une utilisation de JNDI  … 19 Objectif de la version EJB3.0  EJB3.0 :

19

Objectif de la version EJB3.0

EJB3.0 : Simplifier le développement et la mise en œuvre des EJBs

L’utilisation des interfaces n’est plus nécessaire = sans Home + interface métier est facultative (mais recommandée)

L'utilisation des annotations (le descripteur de déploiement est facultatif )

L'utilisation de POJO et de JPA pour les beans de type entity

L'injection de dépendances rend très facile l'obtention d'une instance d'une ressource gérée par le conteneur

rend très facile l'obtention d'une instance d'une ressource gérée par le conteneur  … 20

20

La spécification EJB3.0:

Spécification : JSR 175 (implantée >=jdk1.5)

Gestion de la persistance : API Java Persistence (au lieu du conteneur à partir de EJB3.0)

Intercepteur =~ AOP

Les classes et les interfaces des EJB 3.0 sont de simples POJO ou POJI

Les annotations:

Les annotations obligatoires : Spécification du type du bean

Toutes les annotations ont une valeur par défaut (Valeur typique d’utilisation)

Utilisation du descripteur de déploiement pour des besoins très particuliers

de déploiement pour des besoins très particuliers 21 Outils de travail  JDK (>jdk-1.5)  LINUX:

21

Outils de travail

JDK (>jdk-1.5)

LINUX: ./jdk-x.y-linux.bin (changer les droits d’accès en cas de besoin par la commande chmod 777 jdk-x.y-linux.bin)

Windows: Installer JDK

JBOSS (>jboss5)

LINUX: Copier et extraire jboss

Windows: Copier et extraire jboss

ANT (apache-ant-1.8.1)

LINUX: Copier et extraire ant

Windows: Copier et extraire ant

Ou Maven (apache-maven-2.2.1)

Copier et extraire ant  Ou Maven (apache-maven-2.2.1) 22 Configuration des variables d’environnement  LINUX

22

Configuration des variables d’environnement

LINUX

Ajouter les lignes suivantes dans le fichier bashrc (/home/<votre compte>/.bashrc), et puis exécuter le sous un shell:

export JBOSS_HOME=<chemin-JBOSS>/jboss-x.y

export JAVA_HOME=<chemin-JDK>/jdk-x.y

export PATH=$PATH:<chemin-JDK>/jdk-x.y/bin:<chemin-ANT> /apache-ant-x.y/bin (ou <chemin-MAVEN> /apache-maven-x.y/bin)

Windows

Ouvrir "Panneau de configuration"/Système/Avancé/"Variables d’environnement"

Ajouter les variables suivantes:

JBOSS_HOME=<chemin-JBOSS>

JAVA_HOME=<chemin-JDK>

PATH= %PATH%;<chemin-JDK>/bin;<chemin-ANT>/bin (ou <chemin-MAVEN> /apache-maven-x.y/bin)

(ou <chemin-MAVEN> /apache-maven-x.y/bin) 23 Mise en oeuvre  Pour lancer le serveur jboss, il faut

23

Mise en oeuvre

Pour lancer le serveur jboss, il faut procéder comme suit:

Lancer la commande run.sh (Linux: utiliser la commande source ou sh)/run.bat (Windows) située sous "$JBOSS_HOME/bin"

Pour compiler et déployer un EJB

Se placer dans le répertoire contenant le composant

Lancer la commande ant (cette commande est orientée par le fichier de configuration Build.xml) ou Maven (seulement pour EJB3.0, elle est orienté par le fichier de configuration pom.xml) pour compiler et déployer l’ejb.

Utiliser cette même commande avec l’option run pour lancer le client

Utiliser la commande ant clean pour vider le conteneur.

commande avec l’option run pour lancer le client  Utiliser la commande ant clean pour vider

24

ANT/MAVEN: Automatisation

Exécution d’une chaîne séquentielle de commandes indépendamment du système d’exploitation

Utilise une description XML de la chaîne (build.xml)

mkdir compile archive deploy
mkdir
compile
archive
deploy
run
run

Création des répertoires cibles (build et classes)

Compilation des sources

Création de l’archive (jar/war/ear)

Déploiement (Copie de l’archive dans le répertoire de déploiement)

Exécution

dans le répertoire de déploiement)  Exécution 25 La spécification EJB3.0: Les annotations  Type de

25

La spécification EJB3.0:

Les annotations

Type de l’EJB:

SessionBean : @Stateless, @Stateful

EntityBean: @Entity

MessageDrivenBean : @MessageDriven

Type d’accès:

@Remote : permet un accès à l'EJB depuis un client hors de la JVM

@Local : permet un accès à l'EJB depuis un client dans la même JVM que celle de l'EJB

Par défaut, l'interface d'appel est locale si aucune annotation n'est indiquée. (sans @Remote ou @Local)

Priorité (pour le conteneur):

 

Le descripteur de déploiement, (information centralisée)

Les annotations, (plus facile à mettre en œuvre)

Les valeurs par défaut.

26

26

EJB3.0 sans interfaces….!!!

Le conteneur peut générer l’interface pour le bean:

@ javax.ejb.Stateless

public class HelloBean

{

public String say_hello()

{

return "\n****Hello World****";

}

}

Non recommandé:

Les interfaces générées exposent par défaut toutes les méthodes de l'EJB

L'interface est utilisée par le client pour invoquer l'EJB

Le nom des interfaces générées utilise le nom de l'implémentation de l'EJB

Ce n’est pas réalisable sous JBOSS!!

de l'EJB Ce n’est pas réalisable sous JBOSS!! 27 Composants EJB3.0  Enterprise Java Bean 3.0

27

Composants EJB3.0

Enterprise Java Bean 3.0

Machine 2 Machine 1 EJ Bean Local interface Client Remote distant interface
Machine 2
Machine 1
EJ Bean
Local
interface
Client
Remote
distant
interface

Bean : La logique métier de l’EJB

Local/Remote : L’interface d’accès distant aux services métiers (méthodes) fournis par le bean

(Rq: pour un composant hébergé dans le même conteneur, l’interface Local offre de meilleure performance)

l’interface Local offre de meilleure performance) 28 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

28

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

EJB3.0: plus simple à développer

Inutile de lever l’exception RemoteException pour chaque invocation distance

Pas besoin d’implanter les méthodes relatives à la gestion

du cycle de vie du bean (ejbActivate, ejbLoad, ejbPassivate, ejbRemove)

Elles sont remplacées par des annotations facultatives

@Remove pour une méthode exécutée juste avant la suppression du bean

Chaque attribut de déploiement possède une valeur par défaut qu'il ne faut définir que si cette valeur ne répond pas au besoin.

définir que si cette valeur ne répond pas au besoin. 29 Dr. Ing. Riadh BEN HALIMA

29

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Session

BEN HALIMA [Architecture J2EE: EJB3 & JBoss] Session 30 Session EJB  “A session bean represents

30

Session EJB

“A session bean represents a single client inside the Application Server. To access an application that is deployed on the server, the client invokes the session bean’s methods.The session bean performs work for its client, shielding the client from complexity by executing business tasks inside the server.“ [Sun]

Développement: 2 interfaces + 1 classe

Interface Remote

Services "métiers" fournis par le bean

@javax.ejb.Remote

Interface Local

Services "métiers" fournis par le bean en local

@javax.ejb.Local

Classe Java (Bean)

Code des interfaces Remote et Local

@javax.ejb.Stateless (bean sans état)/@javax.ejb.Stateful (bean avec état)

Liaison au JNDI

 

"ejbName/local" pour l’interface Local

"ejbName/remote" pour l’interface Remote

31

31

Session EJB: L’interface Remote

Interface Remote

Services "métiers" fournis par le bean

Encapsule un attribut (utilisable avec l’annotation):

Attribut

Rôle

Class[] value Préciser la liste des interfaces distantes de l'EJB. Son utilisation est obligatoire si
Class[] value
Préciser la liste des interfaces distantes de l'EJB. Son
utilisation est obligatoire si la classe de l'EJB implémente
plusieurs interfaces différentes java.io.Serializable,
java.io.Externalizable, ou une des interfaces du package
javax.ejb (optionnel)

@ javax.ejb. Remote (value={HelloRemote.class}) //dans HelloBean.java // ou @Remote (HelloRemote.class) pour 1 seule interface remote

(value={HelloRemote.class}) //dans HelloBean.java // ou @Remote (HelloRemote.class) pour 1 seule interface remote 32

32

Session EJB : L’interface Local

Interface Local

Services "métiers" fournis par le bean

Encapsule un attribut (utilisable avec l’annotation):

Attribut

Rôle

Class[] value Préciser la liste des interfaces distantes de l'EJB. Son utilisation est obligatoire si
Class[] value
Préciser la liste des interfaces distantes de l'EJB. Son
utilisation est obligatoire si la classe de l'EJB implémente
plusieurs interfaces différentes java.io.Serializable,
java.io.Externalizable, ou une des interfaces du package
javax.ejb (optionnel)
@ javax.ejb.Local
public interface HelloLocal
{
String say_hello();
}
public interface HelloLocal { String say_hello(); } 33 Session EJB : Code fonctionnel du bean 

33

Session EJB : Code fonctionnel du bean

Class Java du SB

Code des méthodes de l'interface Remote (et Local)

Encapsule plusieurs attributs (utilisables avec l’annotation)

Attribut

Rôle

String name Nom de l'EJB (optionnel)
String name
Nom de l'EJB (optionnel)

String mappedName

Nom sous lequel l’interface Remote de l'EJB sera liée au JNDI. La valeur par défaut est le nom non qualifié de la classe (optionnel)

String description Description de l'EJB (optionnel)
String description
Description de l'EJB (optionnel)

@javax.ejb.Stateless (name="HelloBean") //(ou @javax.ejb.Stateful)

public class HelloBean implements HelloRemote, HelloLocal

{

 

public String say_hello()

 

{

return "\n****Hello World****";

}

}

{ return "\n****Hello World****"; } } 34 Session Bean  Client  Le client utilise

34

Session Bean

Client

Le client utilise l’interface Remote lorsqu’il est exécuté dans un autre JVM que celle de l'EJB

import org.enis.ejb3.stateless.bean.HelloRemote; import javax.naming.InitialContext; public class Client

{

public static void main(String[] args) throws Exception

{

InitialContext ctx = new InitialContext(); HelloRemote hello = (HelloRemote) ctx.lookup("HelloBean/remote"); System.out.println(hello.say_hello());

}

}

Le client utilise l’interface Local lorsqu’il est exécuté dans la même JVM que celle de l'EJB. Ce type d'appel est le plus performant puisqu'il ne nécessite pas d'échanges réseaux et donc pas de mécanisme pour gérer ces échanges (sérialisation/désérialisation, RMI, etc.)

ces échanges (sérialisation/désérialisation, RMI, etc.) 35 Annotations intervenantes dans le cycle de vie (

35

Annotations intervenantes dans le cycle de vie (callbacks)

EJB Session sans état (Stateless)

Annotation

Rôle

@PostConstruct est invoquée après que l'instance soit créée et que les dépendances soient injectées
@PostConstruct
est invoquée après que l'instance soit créée et que les
dépendances soient injectées

@PreDestroy

est invoquée avant que l'instance de l'EJB ne soit supprimée ou détruite

Nb: Les annotations se trouvent dans le package javax.annotation.*

annotations se trouvent dans le package javax.annotation.* 36 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

36

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Annotations intervenantes dans le cycle de vie (callbacks)

EJB Session avec état (Stateful)

Annotation

Rôle

@PostConstruct est invoquée après que l'instance soit créée et que les dépendances soient injectées
@PostConstruct
est invoquée après que l'instance soit créée et que les
dépendances soient injectées

@PreDestroy

est invoquée avant que l'instance de l'EJB ne soit supprimée ou détruite. Elle s’exécute avant qu’une méthode annotée avec @Remove ne soit invoquée.

@Remove est invoquée avant que l'EJB ne soit retiré du conteneur
@Remove
est invoquée avant que l'EJB ne soit retiré du conteneur

@PostActivate

est invoquée après que l'instance de l'EJB ne soit désérialisée du disque. C'est l'équivalent de la méthode ejbActivate() des EJB 2.x

@PrePassivate est invoquée avant de l'instance de l'EJB ne soit sérialisée sur disque. C'est
@PrePassivate
est invoquée avant de l'instance de l'EJB ne soit
sérialisée sur disque. C'est l'équivalent de la méthode
ejbPassivate() des EJB 2.x

Nb: Les annotations se trouvent dans le package javax.annotation.*

annotations se trouvent dans le package javax.annotation.* 37 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

37

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire (1/3): Initiation

Compiler et exécuter la Session Stateless fournie par l’enseignant

Modifier la méthode say_hello(

)

en ajoutant un paramètre

d’entrée qui représente le nom du client.

public String say_hello(String s) {return "Bonjour "+s;}

Compiler et lancer le client.

Quelles sont les classes à modifier pour mettre en œuvre cette modification?

Etendre l’EJB par la méthode add( ):

public int add(int a, int b) {return a+b;}

Refaire les mêmes modifications avec la Session Stateful

Refaire les mêmes modifications avec la Session Stateful 38 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

38

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire (2/3): Maitrise

Le but de cette manipulation est de connaitre et comprendre la différence entre une session avec état (stateful) et une session sans état (stateless)

Modification à faire pour chaque EJB:

Ajouter un attribut dans la session initié à 0: (int a=0;)

Incrémenter et afficher cet attribut dans la méthode say_hello( ):

(a++;System.out.println("a = "+a);)

Expérimentation:

Lancer 5 clients qui invoquent la méthode say_hello(

fois. Noter le résultat obtenu.

) une seule

Lancer 5 clients que chacun invoque la méthode say_hello( fois (utiliser une boucle for). Noter le résultat obtenu.

Interpréter les résultats et conclure.

)

5

obtenu.  Interpréter les résultats et conclure. ) 5 39 Dr. Ing. Riadh BEN HALIMA [Architecture

39

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire (3/3): Développement

Développer le bean session stateless Calculatrice qui offre les méthodes suivantes :

double som(double x, double y)//somme

double mult(double x, double y)//multiplication

double sous(double x, double y)//soustraction

 double sous(double x, double y)//soustraction 40 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

40

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Injection de dépendance

Injection de dépendance 41 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] Les Injecteurs

41

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Les Injecteurs de dépendances

Création des injecteurs:

(1)Déclaration de ressources avec les annotations

(2)Injection des ressources par le conteneur au moment de l’instanciation du bean

Exemple de ressources:

Référence vers un autre EJB,

Contexte de transaction,

Contexte de persistance, etc.

Exemple d’annotations d’injection:

Injection d’un EJB (@EJB)

Injection de ressources (@Resource )

d’un EJB (@EJB)  Injection de ressources (@Resource ) 42 Dr. Ing. Riadh BEN HALIMA [Architecture

42

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Injection d’un EJB (@EJB)

Accèder au l’EJB calculatrice à partir d’un autre EJB

@javax.ejb.EJB private CalculatriceRemote calculatrice;
@javax.ejb.EJB
private CalculatriceRemote calculatrice;

Connexion au JNDI et initialisation automatique de l’attribut calculatrice

private CalculatriceRemote calculatrice; @EJB(beanName="org.enis.gi3.injection.bean.Calcul atriceBean") public
private CalculatriceRemote calculatrice;
@EJB(beanName="org.enis.gi3.injection.bean.Calcul
atriceBean")
public void setCalculatrice(CalculatriceRemote c)
{calculatrice = c; }

Injection de la dépendance au niveau de la méthode

}  Injection de la dépendance au niveau de la méthode 43 Dr. Ing. Riadh BEN

43

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Injection de ressources

(@javax.annotation.Resource)  Exemples: Nom de la ressource au JNDI @Resource(mappedName="DefaultDS")
(@javax.annotation.Resource)
Exemples:
Nom de la
ressource au
JNDI
@Resource(mappedName="DefaultDS")
private javax.sql.DataSource ds;
@Resource
javax.ejb.SessionContext ctx;
@Resource
javax.ejb.UserTransaction ut;
@PersistenceContext
javax.persistence.EntityManager em;
44
Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

Développer le bean session stateful Shopping:

Attributs

String tabProduits[]

int tabQuantite[]

double tabPrix[]

double total

Méthodes:

public void achatproduit(String produit, int quantite, double prix) //ajout au caddie

public String listproduitachete() //retourne la liste des produits achetés

public boolean supproduit(String produit, int quantite) //supprime un produit du caddie

public double getTotal() // retourne le prix des produits dans le caddie (utiliser les méthodes offertes par l’EJB injecté Calculatrice)

public boolean payement(long rib) // affiche un message de réussite du payement du total

@javax.annotation.PostConstruct (une méthode qui affiche un message pour

(une méthode qui affiche un message pour 45 confirmer la création d’une nouvelle instance (

45 confirmer la création d’une nouvelle instance (nouveau client) du bean)

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] 46 Entity Dr. Ing. Riadh BEN HALIMA

46

Entity

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Définition

Représentation de données manipulées par l'application:

Enregistre les données dans un SGBD (ou tout autre support accessible en JDBC)

Assure une correspondance objet–tuple relationnel (mapping O/R)

Offre la possibilité de définir des clés, des relations, des recherches

Avantage :

Manipulation d'objets Java plutôt que de requêtes SQL

Mis en œuvre:

Annotations

JPA (Java Persistence API)

en œuvre:  Annotations  JPA (Java Persistence API) 47 Dr. Ing. Riadh BEN HALIMA [Architecture

47

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Développement

Annotation @Entity : déclare une classe correspondant à un entity bean (EB)

Chaque classe de l’EB est mise en correspondance avec une table:

par défaut, la table porte le nom que la classe

sauf si on spécifie le nom à travers l’annotation @Table(name="

")

Deux modes (exclusifs) de définition des colonnes des tables:

property-based access : on annote les méthodes getter

field-based access : on annote les attributs

Nom de la colonne

par défaut, la colonne porte le nom que field/property

sauf si on spécifie le nom à travers l’annotation @Column(name="

Clé primaire : annotation @Id

Types supportés:

")

Types primitifs (et leurs types Class correspondants): String, Date, etc.

Attribut transitoire (non persistant) : @javax.persistence.Transient

transitoire (non persistant) : @javax.persistence.Transient 48 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

48

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Développement

Entity Bean: Développement @Entity public class Livre implements java.io.Serializable { private long id; private String

@Entity

public class Livre implements java.io.Serializable {

private long id;

private String auteur;

private String titre;

public Livre() {}

public Livre(String auteur, String titre) {

this.auteur = auteur;

this.titre = titre; }

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

public long getId() { return id; }

public void setId(long id) { this.id = id; }

public String getAuteur() { return auteur; }

public void setAuteur(String auteur) { this.auteur = auteur; }

public String getTitre() { return titre; }

Livre - id: long -auteur: string -titre: string
Livre
- id: long
-auteur: string
-titre: string

public void setTitre(String titre) { this.titre = titre; } }
49

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Développement

Possibilité de définir des champs auto-incrémentés

annotation @GeneratedValue @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; }

GenerationType.AUTO : les numéros de séquence sont choisis automatiquement

GenerationType.SEQUENCE : un générateur de numéros de séquence est à fournir

: un générateur de numéros de séquence est à fournir 50 Dr. Ing. Riadh BEN HALIMA

50

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Gestionnaire d'entités

Entity Manager:

assure la correspondance entre les objets Java et les tables relationnelles

point d'entrée principal dans le service de persistance

permet d'ajouter et de supprimer des enregistrements

permet de créer et d'exécuter des requêtes

accessible via une injection de dépendance

attribut de type javax.persistence.EntityManager

annoté par @PersistenceContext

 annoté par @PersistenceContext 51 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

51

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Gestionnaire d'entités

Exemple Création de trois enregistrements l1, l2 et l3 dans la table des livres et suppression de l2

@Stateless public class MyBean implements MyBeanRemote {

@PersistenceContext

private EntityManager em; /* private/protected */ public void init()

{

 

Livre l1 = new Livre("Honore de Balzac","Le Pere Goriot"); Livre l2 = new Livre("Honore de Balzac","Les Chouans"); Livre l3 = new Livre("Victor Hugo","Les Miserables"); em.persist(l1);//Enregistrer l’instance l1 de l’entité d’une manière permanente

em.persist(l2);

em.persist(l3);

em.remove(l2); //Supprimer l’instance l2 de l’entité

}

// Supprimer l’instance l2 de l’entité } } 52 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

}

52

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Gestionnaire d'entités

Gestion de la persistance: persist(Object entity)

Em.persist(b1)

Recherche par clé primaire: find(Class entityClass, Object primaryKey)

Livre monLivre = em.find(Livre.class,12);

Retourne:

Livre si tout va bien

null si la clé n'existe pas dans la table

IllegalArgumentException si le 1 ier paramètre n'est pas une classe d'EB ou si le 2 ième paramètre ne correspond pas au type de la clé primaire

Suppression : remove(Object entity)

em.remove(b1)

Suppression : remove(Object entity )  em.remove(b1) 53 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

53

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Gestionnaire d'entités

Recherche par requête (dynamique)

Requête SELECT dans une syntaxe dite EJB-QL

Le mot clé OBJECT est utilisé pour désigner un résultat à retourner sous la forme d'un objet

Des paramètres nommés (préfixés par ":") sont utilisés pour configurer la requête

Query q = em.createQuery("select OBJECT(b) from Livre b where b.auteur = :au");

q.setParameter("au", "Honore de Balzac");

List<Livre> list = (List<Livre>) q.getResultList();

Méthode getSingleResult() pour récupérer un résultat unique et qui retourne NonUniqueResultException en cas de non unicité

retourne NonUniqueResultException en cas de non unicité 54 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

54

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Gestionnaire d'entités

Recherche par requête pré-compilée (statique)

Création d'une requête nommée attachée à l'EB

@Entity

@NamedQuery(name="Livres",query="select OBJECT(b) from Livre b")

public class Livre {

}

Query q = em.createNamedQuery("Livres");

List<Livre> list = (List<Livre>) q.getResultList();

Paramètres peuvent être spécifiés (voir transparent précédent)

Plusieurs requêtes nommées peuvent être définies

@Entity

@NamedQueries(

value={ @NamedQuery("q1","

public class Livre {

}

"),

@NamedQuery("q2","

")

}

Les autres méthodes sont décrites dans le docs de Java:

http://download-llnw.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

55 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

55

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Annotations intervenantes dans le cycle de vie (callbacks)

EJB Entity

Annotation

Rôle

@PrePersist

est invoquée juste avant que l’instance de l’entité ne soit créée dans la base de données.

@PostPersist

est invoquée juste après que l’instance de l’entité soit créée dans la base de données.

@PreRemove est invoquée juste avant que l’instance de l’entité ne soit supprimée de la base
@PreRemove
est invoquée juste avant que l’instance de l’entité ne soit supprimée de
la base de données.

@PostRemove

est invoquée juste après que l’instance de l’entité soit supprimée de la base de données.

@PreUpdate est invoquée juste avant que la base de données ne soit mise-à-jour
@PreUpdate
est invoquée juste avant que la base de données ne soit mise-à-jour

@PostUpdate

est invoquée immédiatement après que la base de données soit mise- à-jour

@PostLoad Invoquée juste après le chargement des données de la base de données et leur
@PostLoad
Invoquée juste après le chargement des données de la base de
données et leur association avec l’entité
de la base de données et leur association avec l’entité 56 Dr. Ing. Riadh BEN HALIMA

56

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Configuration

Configuration: $EntityFolder\META-INF\persistence.xml

Hypersonic: SGBD en Java inclus à JBoss
Hypersonic:
SGBD en Java
inclus à JBoss

<?xml version="1.0" encoding="UTF-8" ?>

- <persistence xmlns="

- <persistence-unit name="tempdb"> <jta-data-source>java:/DefaultDS</jta-data-source>

"

xmlns:xsi="

"

xsi:schemaLocation="

"

version="1.0">

xsi:schemaLocation=" " version="1.0"> - <properties> <property

- <properties> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>

A inclure dans le jar de l’EJB (à travers build.xml)

Build.xml
Build.xml
dans le jar de l’EJB (à travers build.xml) Build.xml 57 Dr. Ing. Riadh BEN HALIMA [Architecture

57

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

Développer le bean entity CompteBancaire qui est caractérisé par:

Un rib (clé primaire de type long qui s’auto-incrémente),

Un nom_client, et

Un solde du compte (double).

Utiliser le bean GestionCompte pour accéder aux fonctionnalités de création et de gestion des comptes (CompteBancaire)

de création et de gestion des comptes ( CompteBancaire ) 58 Dr. Ing. Riadh BEN HALIMA

58

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Relation

2 catégories principales : 1-n et n-n

1-n: [1 auteur peut avoir 1 ou plusieurs livres]

1

*

Livre - id: long - auteur: String - titre: String
Livre
- id: long
- auteur: String
- titre: String
Auteur - id: long - nom: String
Auteur
- id: long
- nom: String

1

@Entity public class Auteur { @Id

@GeneratedValue(strategy=GenerationType.AUTO) private long id; private String nom; @OneToMany private Collection<Livre> livres;

public Auteur () { livres = new ArrayList<Livre>(); } public Auteur (String nom) { this.nom = nom; livres = new ArrayList<Livre>();} public Collection<Livre> getLivres() { return livres; } public void setLivres( Collection<Livre> livres ) { this.livres=livres; }

Collection<Livre> livres ) { this.livres=livres; } } 59 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

}
59

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Relation

[Architecture J2EE: EJB3 & JBoss] Entity Bean: Relation 2 catégories principales : 1-n et n-n 1-n:

2 catégories principales : 1-n et n-n

1-n:

1

*

Livre - id: long - auteur: String - titre: String
Livre
- id: long
- auteur: String
- titre: String
Auteur - id: long - nom: String
Auteur
- id: long
- nom: String

1

@Entity

public class Livre {

@Id

private long id;

@ManyToOne

@JoinColumn(name="auteur_id")

private Auteur auteur;

private String titre;

public Livre() {}

public Livre(Auteur auteur, String titre) {

this.auteur = auteur;

this.titre = titre;

auteur. getLivres().add(this);}

public auteur getAuteur() { return auteur; }

public void setAuteur(auteur auteur) { this.auteur = auteur; }

public String getTitre() { return titre; }

public void setTitre(String titre) { this.titre = titre; }
60

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Relation

n-n:

@Entity public class Item { @Id @Column(name="ITEM_ID") protected long itemId; @ManyToMany(mappedBy="items")

protected Set<Category> categories; ….

}

@Entity public class Category { @Id @Column(name="CATEGORY_ID") protected long categoryId; @ManyToMany @JoinTable(name="CATEGORIES_ITEMS", joinColumns=

@JoinColumn( name="CI_CATEGORY_ID", referencedColumnName="CATEGORY_ID"), inverseJoinColumns= @JoinColumn( name="CI_ITEM_ID", referencedColumnName="ITEM_ID")) protected Set<Item> items; ….

}

protected Set<Item> items; …. } 61 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

61

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Autres annotations

@Embeddable et @Embedded : embarque les données d'une classe dans une table

@Embeddable

public class Address implements Serializable {

private String rue; private int codePostal; }

@Entity

public class User {

private String nom;

@Embedded // @EmbeddedId s’il s’agit d’une clé primaire (composée)

private Address adresse;

}

primaire (composée)  private Address adresse;  } 62 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

62

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Entity Bean:

Autres annotations

@IdClass : clé composée

public class PersonnePK implements Serializable {

private String prenom;

private String nom;

}

}

public PersonnePK() {

@Entity

@IdClass(PersonnePK.class)

public class Personne {

@Id

private String prenom;

@Id

private String nom;

private int taille;

}

 private String nom ;  private int taille;  } 63 Dr. Ing. Riadh BEN

63

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

Le bean ClientBanque contient les informations d’un client et le bean CompteBancaire englobe les données concernant un compte bancaire. Un client (ClientBanque) peut avoir 1 ou plusieurs comptes (CompteBancaire). Développer le bean ClientBanque, et adapter le bean CompteBancaire et GestionCompte comme indiqué dans le slide suivant.

et GestionCompte comme indiqué dans le slide suivant. 64 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

64

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

Le bean GestionCompte(session qui gère l’accès aux entités développées) possède les fonctionnalités suivantes :

void creer_Client_Banque(String cin, String nom, String prenom, String adresse) : Créer un client de la banque. Cette opération réalise dans un premier temps la vérification de l'existence de ce client à travers la méthode find(…) de l’EntityManager, le cas échéant elle affiche le message suivant : "Le client existe déjà!". Autrement, elle le crée et affiche "Création réussite!".

long ouverture_Compte_Bancaire(String cin, double montant) : Créer un compte tout en fournissant la cin du titulaire du compte et le montant à déposer pour initier le solde. Elle retourne le rib du nouveau compte créé. Cette opération réalise dans un premier temps la vérification de l'existence du titulaire du compte, le cas échéant elle affiche "Il faut créer l’entité ClientBanque avant de lui créer un compte !" et annule l’opération de création du compte.

void cloture_Compte_Bancaire(long rib) : Clôture le compte tout en spécifiant son rib.

void deposer_Argent(double montant, long rib) : Elle incrémente le solde du compte identifié par rib du montant déposé. Elle affiche le message "Compte inexistant!" si rib ne correspond à aucun compte.

boolean retrait_Argent(double montant, long rib) : Elle vérifie l’existence d’un compte identifié par rib. Si c’est le cas, elle vérifie que le solde est suffisant pour assurer le retrait (dans le cas contraire, elle retourne la valeur ‘false’), décrémente le solde du montant et renvoie la valeur ‘true’. Elle affiche le message "Compte inexistant!" si rib ne correspond à aucun compte.

double obtention_Solde(long rib) : Elle renvoie le solde du compte s’il existe.

Penser à :

Nettoyer le serveur manuellement

Arrêter le serveur

Vider le contenu du répertoire jboss\server\default\data (base de données)

Supprimer les fichiers (et non les répertoires) *.jar du répertoire: jboss\server\default\deploy

Nettoyer le serveur via la commande ant clean.db

Arrêter le serveur

Se placer dans le répertoire du bean (qui contient Build.xml)

Lancer la commande "ant clean.db" pour supprimer la base en relation avec le bean en cours

65 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] 66 Dr. Ing. Riadh

65

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] 66 Dr. Ing. Riadh BEN HALIMA [Architecture

66

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

 

Message Driven Bean:

Définition

 

MDB:“A message-driven bean is an enterprise bean that allows Java EE applications to process messages asynchronously. It normally acts as a JMS message listener, which is similar to an event listener except that it receives JMS messages instead of events.The messages can be sent by any Java EE component (an application client, another enterprise bean, or a web component) or by a JMS application or system that does not use Java EE technology.” [Sun]

 

MDB

JMS:“The Java Message Service is a Java API that allows applications to create, send, receive, and read messages.” [Sun]

 

MDB

 

Exécution suite à la réception d’un message

Asynchrone

Sans état, et relativement à courte durée de vie.

67 68

67

67 68

68

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean:

Architecture

Client : Une application qui envoie plusieurs messages au canal

MDBClass : Un message driven bean qui reçoit et

traite les messages reçus du canal d’une façon asynchrone.

les messages reçus du canal d’une façon asynchrone. 69 Machine 1 Envoie Msg Client Machine 2

69

Machine 1 Envoie Msg Client
Machine 1
Envoie
Msg
Client
Machine 2 MDBClass Conteneur EJB
Machine 2
MDBClass
Conteneur EJB

Reçoit

canal

Msg

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Type

Messagerie point-à-point (Queue)

Une application point-à-point est construite sur le concept de queues, expéditeurs et receveurs de messages. Chaque message est adressé à une queue spécifique et les clients de réception extraient les messages des queues établies. Les queues retiennent tous les messages envoyés à eux jusqu'à ce que les messages soient consommés ou jusqu'à ce que les messages expirent.

Messagerie publier/souscrire (Topic)

messages expirent.  Messagerie publier/souscrire (Topic)  Dans une application publier/souscrire, les clients

Dans une application publier/souscrire, les clients adressent des messages à un thème (topic), qui fonctionne comme un panneau d'affichage. Les expéditeurs et les receveurs sont généralement anonymes et peuvent dynamiquement publier ou souscrire à la hiérarchie des thèmes. Le système s'occupe de la distribution des messages arrivant des expéditeurs multiples d'un thème à ses abonnés multiples. Les thèmes retiennent les messages seulement le temps requis pour les distribuer aux abonnés (receveurs) actuels.

70

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Type

Queue (javax.jms.Queue)

Chaque message possède un seul consommateur.

L’expéditeur et le receveur d’un message n’ont pas une dépendance temporelle. Le receveur peut chercher le message même s’il n’était pas connecté lors de son envoi par un client.

Le receveur acquitte la réception du message.

client.  Le receveur acquitte la réception du message. 71 Client 1 Msg Produire Consommer Client

71

Client 1
Client 1
Msg Produire Consommer Client 2 Msg Queue Acquitter
Msg
Produire
Consommer
Client 2
Msg
Queue
Acquitter

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Type

Topic (javax.jms.Topic)

Chaque message peut avoir plusieurs consommateurs.

Les expéditeurs et les receveurs sont en dépendance temporelle (% au moment de l’inscription). Un client abonné à un topic ne peut consommer que les messages publiés après sa souscription. Le client doit être actif pour continuer la réception des messages.

doit être actif pour continuer la réception des messages. 72 Client 1 Souscrire Livrer Msg Topic

72

Client 1
Client 1
Souscrire Livrer Msg Topic Souscrire Livrer
Souscrire
Livrer
Msg
Topic
Souscrire
Livrer

72 Client 1 Souscrire Livrer Msg Topic Souscrire Livrer Client 2 Publier Msg Client 3 Dr.

Client 2

Publier

Msg
Msg

Client 3Livrer Msg Topic Souscrire Livrer Client 2 Publier Msg Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Exemple (1/3)

 Réception des messages Nom de la ressource au JNDI @MessageDriven(activationConfig = {
 Réception des messages
Nom de la
ressource au
JNDI
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destination", propertyValue="queue/exemple")
})
@Depends ("jboss.mq.destination:service=Queue,name=exempleMDB")
public class MDBClass implements MessageListener
Spécifique à
{
public void onMessage(Message recvMsg)
Jboss
{
String msg="";
try{ msg=((javax.jms.TextMessage)recvMsg).getText();
}catch (javax.jms.JMSException e) {System.out.println("Erreur de réception");}
System.out.println("Le message reçu est : " + msg);
}
}

D’autres attributs de l’annotation ActivationConfigProperty sont spécifiées dans le tutoriel J2EE, et le tutoriel Jboss.

spécifiées dans le tutoriel J2EE, et le tutoriel Jboss. 73 Dr. Ing. Riadh BEN HALIMA [Architecture

73

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Exemple (2/3)

Envoie des messages

public class Client

 

{

 

public static void main(String[] args) throws Exception

 

{

processMessage("queue/exemple");

}

private static void processMessage(String queueBinding) throws Exception

{

 

QueueConnection cnn = null;

QueueSender sender = null;

QueueSession session = null;

InitialContext ctx = new InitialContext(); Queue queue = (Queue) ctx.lookup(queueBinding); QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory"); cnn = factory.createQueueConnection(); session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); TextMessage msg = session.createTextMessage("Hello World"); sender = session.createSender(queue); sender.send(msg); System.out.println("Message envoyé avec succès à " + queueBinding); cnn.close();

 

}

}

à " + queueBinding); cnn.close();   } } 74 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

74

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Message Driven Bean Exemple (3/3)

Configuration: $MDBFolder\META-INF\Config-queue-service.xml

<?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=exempleMDB"> <attribute name="JNDIName">queue/exemple</attribute> <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> </mbean> </server>

A inclure dans le jar de l’EJB (à travers build.xml)

 A inclure dans le jar de l’EJB (à travers build.xml) 75 Build.xml Dr. Ing. Riadh
 A inclure dans le jar de l’EJB (à travers build.xml) 75 Build.xml Dr. Ing. Riadh

75

Build.xml

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Annotations intervenantes dans le cycle de vie (callbacks)

Bean-Orienté-Message (Message-driven bean)

Annotation

Rôle

@PostConstruct est invoquée après que l'instance soit créée et que les dépendances soient injectées
@PostConstruct
est invoquée après que l'instance soit créée et que les
dépendances soient injectées

@PreDestroy

est invoquée avant que l'instance de l'EJB ne soit supprimée ou détruite

l'instance de l'EJB ne soit supprimée ou détruite 76 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

76

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

Suite à l’invocation de la méthode payement(rib), le bean Shopp envoie un message contenant le montant à payer ainsi que le rib du client à une partie de confiance (TrustPayement). Ce dernier injecte le GestionCompte et débite le montant du solde du client correspondant. Implanter le MDB (TrustPayement) qui assure cette fonctionnalité.

le MDB (TrustPayement) qui assure cette fonctionnalité. 77 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

77

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Web Service Endpoint

[Architecture J2EE: EJB3 & JBoss] Web Service Endpoint 78 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

78

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Session EJB: Web service endpoint

Exposition d’un EJB sous forme d’un service web

WSDL/SOAP

JAX-WS API (implantation de SW avec JAXB)

Nécessités:

La classe doit être annotée avec @WebService (ou @WebServiceProvider)

La classe implantant le service web peut spécifier une interface d’accès au service SEI (Service Endpoint Interface) à travers l’élément endpointInterface de l’annotation @WebService

Les méthodes métiers de la classe implantant le service web doivent être déclarées public (et non static ou final)

Les méthodes métiers qui sont exposées au client du service web sont annotées avec @WebMethod

La classe implantant le service web doit implanter le constructeur par défaut

La classe implantant le service web doit être annotée avec @Stateless

le service web doit être annotée avec @Stateless 79 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

79

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Session EJB: Web service endpoint

Exemple : Code Bean

@javax.ejb.Stateless

@javax.jws.WebService(endpointInterface = "org.enis.ejb3.stateless.bean.HelloWS") public class HelloBean implements HelloRemote, HelloLocal

{

public HelloBean(){ }

public String say_hello()

{

return "\n****Hello World****";

}

}

{ return "\n****Hello World****"; } } 80 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

80

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Session EJB: Web service endpoint

Exemple : Interface du endpoint

@javax.jws.WebService

@javax.jws.soap.SOAPBinding(style = javax.jws.soap.SOAPBinding.Style.RPC) public interface HelloWS extends java.rmi.Remote

{

@javax.jws.WebMethod public String say_hello();

}

Session EJB: Web service endpoint

Exemple : Code du Client

import java.net.URL; import javax.xml.namespace.QName; import javax.xml.rpc.Service; import javax.xml.rpc.ServiceFactory; public class Client {

public static void main(String[] args) throws Exception

http://localhost:8080/jbossws/services (liste des services déployés)
http://localhost:8080/jbossws/services
(liste des services déployés)

{

(liste des services déployés) { URL url = new URL("http://l

URL url = new URL("http://localhost:8080/enis-ejb3-stateless- webservice/HelloBean?wsdl"); QName qname = new QName("http://bean.stateless.enis.gi3.org/", "HelloBeanService"); ServiceFactory factory = ServiceFactory.newInstance(); Service service = factory.createService(url, qname); HelloWS hello = (HelloWS) service.getPort(HelloWS.class); System.out.println(hello.say_hello());

}}

Attention:Vider l’extension du jdk (jdk/jre/lib/ext) afin d’éviter les conflits entre les packages!! Utiliser jdk1.5 avec les jars d’axis1 afin de lancer un client interactif.

81 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] 82 Dr. Ing. Riadh

81

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] 82 Dr. Ing. Riadh BEN HALIMA [Architecture

82

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire

 

Présenter les fonctionnalités de l’EJB GestionCompte en tant qu’un service web

 

Déployer le, et afficher son WSDL

 

Intercepteurs

Ajouter un client SOAP, et tester le.

Améliorer le client réalisé afin qu’il représente un accès distant pour le chef d’agence à l’aide d’une interface graphique Java.

 
83 84

83

83 84

84

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Les intercepteurs (1/3):

Fonctionnalités offertes

Intercepter l'invocation de méthodes pour exécuter des traitements @Interceptors et @AroundInvoke ou dans le descripteur de déploiement.

Effectuer des traitements avant et après l’exécution d’une méthode

Exemple

Journalisation (Log), traçage (tracing)

Mesurer le temps d’exécution d’une méthode d’un bean (voir exemple)

d’exécution d’une méthode d’un bean (voir exemple) 85 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

85

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Les intercepteurs (2/3):

Code de l’intercepteur import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; public
Code de l’intercepteur
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class IntercepteurTemps2Execution{
@AroundInvoke
public Object mesurer(InvocationContext ctx) throws Exception
{ System.out.println("*** Temps d’execution de la methode " +
+ ctx.getMethod().getName() +" ***");
long debut = System.currentTimeMillis();// temps de début d’exécution
try
{
return ctx.proceed();// exécution de la méthode
}
catch(Exception e)
{
throw e;
}
finally
{
long temps = System.currentTimeMillis() - debut;
String methode = ctx.getTarget().getClass().getName() + "." +
+
ctx.getMethod().getName() + "()";
System.out.println("*** L'invocation de la" + methode + " dure " + temps +
+ "ms ***");
}
}
}
86
Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Les intercepteurs (3/3):

Appliquer l’intercepteur

 La classe cible de l’intercepteur: import javax.ejb.Stateless; import javax.interceptor.Interceptors; @Stateless
 La classe cible de l’intercepteur:
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors({IntercepteurTemps2Execution.class})//pour toutes les méthodes du bean
public class HelloBean implements HelloLocal, HelloRemote
{
//@Interceptors ({IntercepteurTemps2Execution.class})//pour cette méthode du bean
public String say_hello()
{
return "\n****Hello World****";
}
}
87
Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Travail à faire (2/2)

Utiliser un client interactif au lieu de "ant run"

mettre tous les jars de "$JBOSS_HOME/client" au classpath, et lancer le client avec l’aide de la commande java

java –cp "%classpath%;%JBOSS_HOME%\client\jbossall-client.jar"

org.enis.ejb3.stateless.client.Client

Mesurer le temps de réponse de la méthode achatproduit() et total() du bean Shop (penser à utiliser un intercepteur)

total() du bean Shop (penser à utiliser un intercepteur) 88 Dr. Ing. Riadh BEN HALIMA [Architecture

88

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

89 Client web Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss] Composant web:

89

Client web

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Composant web: Servlet

La représentation du composant est sous forme d’une archive ‘.ear’ et non ‘.jar’

Ajout de descripteurs xml:

web.xml

application.xml

Ajout d’une page de démarrage pour l’appel du client web sous forme html ou jsp dans un nouveau répertoire indiquant le chemin du Web.

Ajout d’un client web sous forme d’une servlet.

Modification du build.xml

sous forme d’une servlet.  Modification du build.xml 90 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

90

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Description de la structure

ejbapp

EJB Session sans état

Webapp

Servlet

index.html

web.xml

Ear

application.xml

 index.html  web.xml  Ear  application.xml  ".ear" = ".jar " + ".war" +

".ear" = ".jar " + ".war" + application.xml

= ".jar " + ".war" + application.xml 91 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3

91

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Servlet:

Répertoire webapp

Servlet:

Injection de l’EJB

Exécution du traitement en servant des méthodes de l’EJB

index.html

Appel de la servlet

web.xml

Classe de la servlet

Injection de l’EJB

Exécution du traitement en se servant des méthodes de l’EJB

Nom et action de la servelt

Nom du fichier invoquant la servlet (index.html)

 Nom du fichier invoquant la servlet (index.html) 92 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

92

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Servlet:

Répertoire ear

Application.xml

Spécifier l’ejb

Spécifier le war

Travail à faire:

Tester l’exemple EJB3.0_Servlet

Exécution : http://localhost:8080/jboss-ejb3-webapp/index.html

Ajouter une Servlet sur l’exemple du Compte_Bancaire/Compte_Client qui permet d’afficher les détails du compte bancaire pour un client accèdant à distance à l’application.

pour un client accèdant à distance à l’application. 93 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE:

93

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Application de gestion bancaire

Intranet Guichetier Calculatrice CompteClient Stateless Stateless This image cannot currently be displayed. n 1
Intranet
Guichetier
Calculatrice
CompteClient
Stateless
Stateless
This image cannot currently be displayed.
n
1
This image cannot currently be displayed.
CompteBancaire
ClientBanque
Intranet
Chef d’agence
Entity
Entity
Shop
GestionCompte
Stateful
Acheteur
Stateful
Internet
TrustPayement
MDB
Serveur d’application
Client
TrustPayement MDB Serveur d’application Client 94 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

94

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Bibliographie

HALIMA [Architecture J2EE: EJB3 & JBoss] Bibliographie  Java EE Tutorial

Java EE Tutorial

http://java.sun.com/javaee/5/docs/tutorial/

doc/JavaEETutorial.pdf

JBoss EJB3 Tutorial

http://www.jboss.org/file-access/default/members/

jbossejb3/freezone/docs/tutorial/1.0.7/html/index.html

jbossejb3/freezone/docs/tutorial/1.0.7/html/index.html  Enterprise JavaBeans 3.0 95 Dr. Ing. Riadh BEN HALIMA

Enterprise JavaBeans 3.0

 Enterprise JavaBeans 3.0 95 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &
 Enterprise JavaBeans 3.0 95 Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 &

95

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]

Les Serveurs J2EE

Jboss de Red Hat

GlassFish de Sun (Oracle)

Websphere d’IBM

Netweaver de SAP

Sun (Oracle)  Websphere d’IBM  Netweaver de SAP 96 Dr. Ing. Riadh BEN HALIMA [Architecture

96

Dr. Ing. Riadh BEN HALIMA [Architecture J2EE: EJB3 & JBoss]