Vous êtes sur la page 1sur 11

Introduction

Les Enterprise Java Beans


(version 3)
Gal Thomas gael.thomas@lip6.fr Universit Pierre et Marie Curie Master Informatique M2 Spcialit SAR

Enterprise Java Bean (EJB) : Modle de composants pour le dveloppement d'applications d'entreprises Modle de programmation
!! Par objet rparti !! Par envoie de message SGBD

Client lger

La plateforme composant base sur Java Ne gre pas lhtrognit Largement influenc par RMI

Client Riche

SGBD
2008-2009 Master SAR - M2 MDOC - Introduction 2

Introduction
Client lger : navigateur Web HTTP Serveur WEB

Introduction
Enterprise Java Bean (EJB) A server-side component that encapsulates the business logic of an application
JEE
Service Transaction: JTA/JTX

Service Nommage : JNDI

On se focalise sur la logique applicative


Service BD : JDBC

Client lourd

Conteneur WEB

!!Les services systmes sont fournis par le conteneur !!La logique de prsentation est du ressort du client !!Les enterprise beans sont portables d'un serveur d'application un autre

Service de transport : IIOP, RMI ou autre

But : simplifier le dveloppement modulaire dapplications rparties


Base De Donne
3 2008-2009 Master SAR - M2 MDOC - Introduction 4

Cache Conteneur EJB Conteneur EJB

2008-2009

Master SAR - M2 MDOC - Introduction

Introduction
EJB : un composant
!!Uniquement Java !!Dcrit en xml ou par annotation Java

Introduction
Trois types d'EJB Session : effectue une tche pour un client
!!Avec tat : un tat spcifique par client !!Sans tat : pas dtat spcifique
(partag entre clients ou non, dpend de limplmentation)

Conteneur EJB : la plateforme composant dfinie par SUN


!!Uniquement Java !!Programmation rpartie !!Orient vers les serveurs dentreprise !!Dynamiquement adaptable !!Liaison par appel de mthode et par envoie de message !!Outils de gnration dynamique de souches et squelettes !!Nombreux services systmes
Transaction, nommage, persistance, cycle de vie, transport
2008-2009 Principe des Systmes Informatiques Avanc 5

Entity : reprsente une entit mtier persistante


!!Associ un tuple dune base de donne !!Gestion transparente de la persistance

Message-Driven : un changeur de messages asynchrones


!!Session bean sans tat !!Activ lors de la rception de messages
2008-2009 Master SAR - M2 MDOC - Introduction 6

Les Session Beans (version 3)


Deux interfaces daccs :
!!Interface locale : invocation uniquement dans la mme JVM !!Interface distante : invocation distante

Les Session Beans (version 3)


Linterface : rien de particulier
package test; public interface HelloWorld { public void sayHello(); }

Un code mtier :

interface distante

!!Implantation des mthodes de linterface

Code Code Code mtier mtier mtier

interface locale

Machine Virtuelle Java

Le code mtier : des annotations


@Stateless(name="HelloWorld") @Remote(HelloWorld.class) public class HelloWorldBean implements HelloWorld { public void sayHello() { System.out.println("Hello, World!!!"); } }
7 2008-2009 Master SAR - M2 MDOC - Introduction 8

Diffrence par rapport RMI?


!!Gestion automatique du cycle de vie !!Facilit daccs aux autres services systmes !!Un bean par client

2008-2009

Master SAR - M2 MDOC - Introduction

Les Session Beans (version 3)


Quelques remarques : Nommage : chaque recherche renvoie une nouvelle instance
!! name : nom EJB du bean par dfaut : le nom de la classe !! mappedName : nom dans le service de nommage global (JNDI, voir cours suivant) Utile pour les clients lourds

Les Session Beans (version 3)


Utilisation dun Session Bean partir dun autre Session Bean
public interface Test { public void test(); } @Statefull(mappedName = "Test@Remote ) @Remote(Test.class) public class TestBean implements Test { @EJB(name="HelloWorld") HelloWorld hw; public void test() { hw.sayHello(); } }

Interfaces daccs :
!! @Remote : indique linterface externe, plusieurs interfaces possibles !! @Local : indique linterface interne, plusieurs interfaces possibles !! Par dfaut : @Remote des interfaces directes

Avec ou sans tat :


!! Bean sans tat (@Stateless) : tat indpendant du client (attention, partage possible) !! Bean avec tat (@Statefull) : tat propre chaque Bean
2008-2009 Master SAR - M2 MDOC - Introduction 9

2008-2009

Master SAR - M2 MDOC - Introduction

10

Les Session Beans (version 3)


Utilisation dun Session Bean partir dun client Lourd
public static void main(final String[] args) throws Exception { Context ic = new InitialContext(); Test test = (Test)initialContext.lookup("Test@Remote"); test.test(); }

Les Session Beans (version 3)


Injection de ressources
!!Accs dautres objets enregistrs dans le service de nommage
@Statefull(mappedName = "Test@Remote") @Remote(Test.class) public class TestBean implements Test { @Resource(mappedName= "jdbc_1") Object o; }

InitialContext : service de nommage (voir cours JNDI) Le client ne peut utiliser que le nom JNDI, pas le nom du Bean Lancer le client : dans un conteneur client (avec Jonas : jclient au lieu de java)

Remarque : jdbc_1 est le nom par dfaut donn au gestionnaire de connexions vers la base de donne sous Jonas (voir cours JDBC)

2008-2009

Master SAR - M2 MDOC - Introduction

11

2008-2009

Master SAR - M2 MDOC - Introduction

12

Les Session Beans (version 3)


Suppression de Session Bean : Explicite aprs linvocation dune mthode marque @Remove
@Remove void del() { System.out.println("Va tre supprim"); }

Les Session Beans (version 3)


Interception des changements dtat du cycle de vie
@PostConstruct public void initialise() { initialise le Bean } @PreDestroy public void detruit() { destruction du Bean } @PrePassivate public void avantSwap() { Bean va tre mis en swap } @PostActivate public void apresSwap() { Bean vient dtre recharg }

Fonction destroy() : appele juste avant toute suppression


!!Aprs un appel explicite une mthode marque @Remove !!Lors du dchargement du Bean Attention : @Remove void destroy() { } ! fonction appele deux fois! ! Bug
2008-2009 Master SAR - M2 MDOC - Introduction 13

2008-2009

Master SAR - M2 MDOC - Introduction

14

Les Session Beans (version 3)


Interception de mthodes mtier
Utile pour debuggage, monitoring, changement de paramtres, volution dAPI

Les Session Beans (version 3)


Compilation : javac classique
Ajouter le .jar javaee dans le classpath

Mthode @AroundInvoke :
!!Invoque la place de toute mthode mtier !!Sauf si elle est annote @ExcludeClassInterceptors
@AroundInvoke public Object intercept(InvocationContext ic) throws Exception { System.out.println("*** intercept la mthode '" + ic.getMethod().getName() try { return invocationContext.proceed(); } } finally { System.out.println("*** fin"); } }
2008-2009 Master SAR - M2 MDOC - Introduction 15

Packaging : dans un fichier .jar classique


/test/HelloWorld.class /test/HelloWorldBean.class /test/Test.class /test/TestBean.class

Dploiement (sous Jonas) : copie dans le rpertoire deploy

2008-2009

Master SAR - M2 MDOC - Introduction

16

Les Entity Bean (version 3)


Entity Bean = tuple dune base de donne Entity Bean : POJO
(Plain Old Java Object) !!Champs du POJO = colonne dune table

Les Entity Bean (version 3)


Exemple de base
@Entity @Table(name = "FILMS") public class Film implements java.io.Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(final String name) { this.name = name } }

API des Entity Bean : JPA (Java Persistance API)


Unification des APIs Hibernate, TopLink

Gestion (quasi-)transparente de la persistance

2008-2009

Master SAR - M2 MDOC - Introduction

17

2008-2009

Master SAR - M2 MDOC - Introduction

18

Les Entity Bean (version 3)


@Basic ou rien : indique quun champs est persistant Tous les champs sont persistants
Changer le nom de la colonne de la BD : @Column(name="nomBD") int nomJava;

Les Entity Bean (version 3)


Les jointures entre EntityBean Cardinalit des relations :
!!1-1 !!1-n (ex. : une commande contient n lignes) !!n-1 (ex. : plusieurs ligne de commandes peuvent concerner le mme produit) !!n-n (ex. : un cours comporte +sieurs tudiants qui suivent +sieurs cours) Dnomination : OneToOne, OntToMany, ManyToOne, ManyToMany

Table associe au tuple : @Table(name="FILMS")


Pas ncessaire de de mettre tous les champs de la table

Cl primaire obligatoire : type primitif ou compos


@GeneratedValue(strategy=?) : indique comment sont gnrs les cls Auto, Identity, Sequence, Table

Principe : un unique propritaire de la relation


Propritaire : tuple qui possde la cl externe

2008-2009

Master SAR - M2 MDOC - Introduction

19

2008-2009

Master SAR - M2 MDOC - Introduction

20

Les Entity Bean (version 3)


Exemple de jointure : un film est jou dans des salles
create table FILMS ( id integer primary key auto_increment, name VarChar(256) ); create table SALLES_PROG ( id integer primary key auto_increment, salle_id integer, film_id integer, foreign key (salle_id) references SALLES(id), foreign key (film_id) references FILMS(id) );

Les Entity Bean (version 3)


Exemple de jointure Dans le Bean Film :
@OneToMany(mappedBy = "film", fetch=FetchType.EAGER, cascade=CascadeType.ALL) private List<SalleProg> salles; Champs De jointure chez le propritaire

Dans le bean SalleProg (propritaire) :


@ManyToOne @JoinColumn(name = "film_id") private Film film;

film_id : cl trangre ! propritaire : SALLES_PROG


2008-2009 Master SAR - M2 MDOC - Introduction 21 2008-2009 Master SAR - M2 MDOC - Introduction 22

Les Entity Bean (version 3)


Complment sur les jointures Fetch : faon de grer la jointure (aussi paramtre des @Basic)
!!FetchType.EAGER : au plus tt (ncessaire si Serializable) !!FetchType.LAZY : au plus tard (inutilisable avec Serializable)

Les Entity Bean (version 3)


Utilisation des EntityBeans : dans des SessionBeans LEntityManager : gestionnaire de persistance
public interface Cinema{ Film findFilm(int id); } @Stateless public class CinemaBean implements Cinema { @PersistenceContext private EntityManager em; }

Cascade : cascade des oprations entre les beans


!!CascadeType.ALL : toute opration propage !!CascadeType.MERGE : merge entre deux beans (voir + loin dans le cours) !!CascadeType.PERSIST : Film devient persistant ! List<SalleProg> aussi !!CascadeType.REFRESH : rechargement partir de la base !!CascadeType.REMOVE : suppression en cascade

2008-2009

Master SAR - M2 MDOC - Introduction

23

2008-2009

Master SAR - M2 MDOC - Introduction

24

Les Entity Bean (version 3)


Etat dun Entity Bean Attach : gr par lentity manager
Modification rpercute dans la BD !!Tout Entity Bean renvoy par lentity manager

Les Entity Bean (version 3)


LEntityManager : attachement et dtachement
!! void merge(Object entity) : synchronise ltat persistant du bean

Utilisable sur un bean dtach. Ne rattache pas le bean. Utile lorsque le Bean est modifi chez le client et renvoy au serveur.
!! void persist(Object entity) : rend lentit persistante et attache

Dtach : non gr par lentity manager


Modification non rpercute dans la BD !!Nouveau Bean !!Copie de Bean (aprs srialisation)

Utilisable sur un nouveau Bean (aprs un new)


Film createFilm(String name) { Film film= new Film(); res.setName(name); em.persist(film); // attache le bean + rend persistant return film; // la copie est bien sr dtache }

2008-2009

Master SAR - M2 MDOC - Introduction

25

2008-2009

Master SAR - M2 MDOC - Introduction

26

Les Entity Bean (version 3)


Principales mthode dun EntityManager
!! Object find(Class cl, Object key) : Trouve un EntityBean partir de sa cl primaire !! boolean contains(Object entity) : Vrai si entity est attach lEntityManager !! Query createQuery(String qlString) : Cration dune requte dans le langage query language !! Query createNamedQuery(String name) : Cration dune requte nomme !! Query createNativeQuery(String sqlQuery) : Cration dune requte dans le langage SQL !! void remove(Object entity) : Supprime lentity de la base !! void refresh(Object entity) : Recharge le bean partir de la base
2008-2009 Master SAR - M2 MDOC - Introduction 27 2008-2009

Les Entity Bean (version 3)


Exemple dutilisation
Trouver un film partir de sa cl primaire :
public void findFilm(int id) { return em.find(Film.class, Integer.valueOf(id)); }

Supprimer un film :
public void removeFilm(int id) { em.remove(findFilm(id)); }

Master SAR - M2 MDOC - Introduction

28

Les Entity Bean (version 3)


Le langage Query Language : langage de requte proche de SQL
!!Slection partir du nom du Bean !!Paramtres indiqus par :nom-du-parm !!Positionnement des requtes dans lobjet Query !!Demande dune liste de rsultats partir de lobjet Query Exemple :
public Film findFilmByName(String name) { Query q = em.createQuery( "select f from Film where f.name = :fname"); q.setParameter("fname", name); List<Film> res = q.getResultList(); return res.size() == 0 ? null : res.get(0); }
2008-2009 Master SAR - M2 MDOC - Introduction 29

Les Entity Bean (version 3)


Requte nomme : dfinie avec le Bean
@Entity @Table(name = "FILMS") @NamedQueries({ @NamedQuery(name = "findAllFilms", query = "select f from Film f"), @NamedQuery(name = "findFilmByName", query = "select f from Film f WHERE f.name = :fname") }) public class Film implements java.io.Serializable {

Utilisation dans le SessionBean :


void findFilmByName() { Query q = em.createNamedQuery("findFilmByName");
2008-2009 Master SAR - M2 MDOC - Introduction 30

Les Entity Beans (version 3)


Interception des changements dtat du cycle de vie Autour de la cration (em.persist) :
!!@PrePersist !!@PostPersist

Les Entity Bean (version 3)


Le descripteur de dploiement
<persistence xmlns= "http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="entity" transaction-type="JTA"> <provider></provider> <jta-data-source>jdbc_1</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> </persistence>
2008-2009 Master SAR - M2 MDOC - Introduction 32

Lors du chargement partir de la base (em.find, Query.getResultList)


!!@PostLoad

Autour des mises jour (modification de champs, em.merge)


!!@PreUpdate !!@PostUpdate

Autour de la suppression (em.remove)


!!@PreRemove !!@PostRemove
2008-2009 Master SAR - M2 MDOC - Introduction 31

Les Messages Driven Bean (version 3)


Message driven Bean : interaction par messagerie
MOM : Message Oriented Middleware

Les Messages Driven Bean (version 3)


Principe des Message Driven Bean
!!Consomme des messages asynchrones !!Pas d'tat (toutes les instances d'une mme classe de MDB quivalentes) !!Peut traiter les messages de clients !!1 seule mthode mtier (onMessage)
! Paramtres imposs ! Pas de valeur de retour ! Pas d'exception

Deux modes de communication


!!N vers 1 : Queue !!N vers M : Topic

Message Driven Bean : repose sur la spcification JMS


JMS : Java Message Service

Quand utiliser un MDB


!!viter appels bloquants !!Dcoupler clients (producteurs) et serveurs (consommateurs) !!Besoin de fiabilit : protection crash serveurs

2008-2009

Master SAR - M2 MDOC - Introduction

33

2008-2009

Master SAR - M2 MDOC - Introduction

34

Les Messages Driven Bean (version 3)


La spcification JMS (java.sun.com/jms) Queue : file de discussion (un seul consommateur) Topic : sujet de discussion (diffusion) ConnectionFactory : usine connexions vers queue/topic Connection : connexion vers queue/topic Session :
!!Cration dmetteur et rcepteur !!Peut tre rendue transactionnelle

Les Messages Driven Bean (version 3)


Architecture Java Message Service
(pour le queue, remplacer Topic par Queue, Publisher par Sender, Subscriber par Receiver)
NameService JTCF monTopic TopicConnectionFactory TopicConnection TopicSession

TopicPublisher Message

Topic Message

TopicSubscriber

2008-2009

Master SAR - M2 MDOC - Introduction

35

2008-2009

Master SAR - M2 MDOC - Introduction

36

Les Messages Driven Bean (version 3)


Dveloppement dun Message Driven Bean
@MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "destination", propertyValue = "topic_rigolo"), @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Topic")}) public class Mdb implements MessageListener { public void onMessage(Message inMessage) { System.out.println(((TextMessage)msg).getText()); } }

Les Messages Driven Bean (version 3)


Exemple dmetteur (Bean)
@Resource(name="rigolo", mappedName="topic_rigolo") Topic topic; @Resource(name="factory", mappedName="JTCF") TopicConnectionFactory factory; TopicSession session; TopicPublisher sender; public void publish(String value) { TopicConnection tc = factory.createTopicConnection(); session = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); sender = session.createPublisher(topic); TextMessage msg = session.createTextMessage(); msg.setText("MDB: " + value); sender.publish(msg); }
37 2008-2009 Master SAR - M2 MDOC - Introduction 38

2008-2009

Master SAR - M2 MDOC - Introduction

Historique
Diffrence majeure entre version 2 et version 3 Prsence de Home (Usine) dans les Session Beans
!!Usine enregistre dans le service de nommage !!Obtention dun bean via lusine (home.create()) Difficile maintenir

Historique
Version 2 : beaucoup de XML

Version 3 : beaucoup dannotation


Maintenance simplifie Possibilit dutiliser du XML la place

Pas dEntityManager
!!Gestion de la persistance via la Home de lEntityBean (homeFilm.findByName("Les Vikings"))

Entity Bean non srializable


!!Pas de notion de DTO (Data Transfert Object) !!Entity Bean toujours attach
2008-2009 Master SAR - M2 MDOC - Introduction 39 2008-2009 Master SAR - M2 MDOC - Introduction 40

Conclusion
Enterprise Java Bean
!!Composants Java !!Programmation rpartie !!Facile mettre en uvre !!Trs bonne amlioration de lergonomie avec la version 3

Fonctionnement interne
!!Relativement compliqu (quatre cours pour ltudier!) !!Demande de bonnes base

2008-2009

Master SAR - M2 MDOC - Introduction

41

Vous aimerez peut-être aussi