Vous êtes sur la page 1sur 22

Plan

1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean

Enterprise Java Beans 3


Lionel Seinturier

1.4 Fonctionnalits avances


2. Services
3. Dploiement
4. Design patterns EJB

Universit des Sciences et Technologies de Lille


Lionel.Seinturier@lifl.fr

5. Web Services
6. Conclusion
15/10/07
EJB 3

Lionel Seinturier

EJB 3

1. Composant EJB

Lionel Seinturier

1. Composant EJB

Enterprise Java Bean (EJB)

Enterprise Java Bean (EJB)

Modle de composants pour le dveloppement d'applications d'entreprises

A server-side component that encapsulates the business logic of an application

sites web (de commerce en ligne, de travail collaboratif, communautaires, )


de systmes informations
d'applications de gestion

on se focalise sur la logique applicative


les services systmes sont fournis par le conteneur
la logique de prsentation est du ressort du client
Vocabulaire dans ce cours : bean = EJB = composant

traitement
prsentation

Types d'EJB

donne

Session
Entity
Message-Driven
client

serveur d'applications

: performs a task for a client


: represents a business entity object that exists
in persistent storage
: listener processing messages asynchronously

SGBD
Plusieurs versions : actuellement EJB 3 (depuis 2006)

EJB 3

Lionel Seinturier

EJB 3

Lionel Seinturier

1. Composant EJB

1. Composant EJB

EJB 3

EJB 3

succs Java EE en gnral

Passage EJB 2 vers EJB 3

mais

tude ralise par Oracle sur l'application AventureBuilder

trop compliqu, lourd, contraignant


concepts objets (hritage, typage, polymorphisme, ) difficilement exploitables
mapping objet/relationel limit
trop de codage XML pnible

passage EJB 2 vers EJB 3


utilisation des annotations et de la gnricit Java 5
pour simplifier l'criture des beans
viter autant que faire se peut l'crire d'XML
http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/

EJB 3

Lionel Seinturier

EJB 3

1. Composant EJB

Lionel Seinturier

1. Composant EJB

Annotations

Annotations

mcanisme standard dans le langage Java depuis version 5 (1.5)


ide similaire aux commentaires Javadoc
informations attaches des lments de programme (classe, mthode, attributs, )
pour ajouter de l'information sur cet lment
ex : dclarer mthode distante, dclarer attribut persistant,

chaque annotation est un type (au mme titre qu'une classe ou qu'une interface)
dfini dans un package (ex. : javax.ejb.Stateless)
les annotations existantes peuvent tre utilises
de nouvelles annotations peuvent tre dfinies par le programmeur
nouveau mot cl Java 5 : @interface

@Identificateur

ventuellement des paramtres : @Identificateur(name=value,...)


ventuellement plusieurs annotations par lments

Pour + d'informations, voir par ex. :


http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html

Exemple utilisation annotations :


@Resource(name="myDB", type=javax.sql.DataSource.class)
@Stateful
public class ShoppingCartBean implements ShoppingCart {
...
}

EJB 3

Lionel Seinturier

EJB 3

Lionel Seinturier

1. Composant EJB

1. Composant EJB

Enterprise Java Bean

Enterprise Java Bean


machine 2

machine 2

machine 1

EJ Bean

EJ Bean

Remote
interface

P
RMI-IIO

Remote
interface

Local
interface

client
local

client
distant

Chaque EJ Bean fournit 1 interface d'accs distant

+ ventuellement 1 interface d'accs local ( partir EJB 2.0)

les services (mthodes) offerts par le bean ces client

les services offerts par le bean ses clients locaux


les mmes (ou d'autres) que ceux offerts distance
optimisation

EJB 3

Lionel Seinturier

EJB 3

10

1.1 Session Bean

Lionel Seinturier

1.1 Session Bean


Dfinition
Session Bean : reprsente un traitement (services fournis un client)

1.
2.
3.
4.
5.

Dfinition
Dveloppement
Client local
Client distant
Stateful session bean

1. Stateless session bean


- sans tat
- ne conserve pas dinformation entre 2 appels successifs
- 2 instances qqconques dun tel bean sont quivalentes
- 1 instance par invocation
2. Stateful session bean
- avec un tat (en mmoire)
- aka servlet/JSP session
- mme instance pendant toute la dure d'une session avec un client
- 1 instance par client

EJB 3

11

Lionel Seinturier

EJB 3

12

Lionel Seinturier

1.1 Session Bean

1.1 Session Bean

Dveloppement

Dveloppement

1 interface (ventuellement 2 : Local + Remote) + 1 classe

Classe

Interface

annotation @javax.ejb.Stateless ou @javax.ejb.stateful

annotations @javax.ejb.Local ou @javax.ejb.Remote


import javax.ejb.Stateless;
@Stateless
public class CalculatriceBean implements
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)
}

import javax.ejb.Local;
@Local
public interface CalculatriceItf {
public double add(double v1,double
public double sub(double v1,double
public double mul(double v1,double
public double div(double v1,double
}

EJB 3

v2);
v2);
v2);
v2);

13

possibilit de nommer les beans :

Lionel Seinturier

EJB 3

1.1 Session Bean


Client local

CalculatriceItf {
{return v1+v2;}
{return v1-v2;}
{return v1*v2;}
{return v1/v2;}

@Stateless(name="foobar")

14

Lionel Seinturier

1.1 Session Bean


serveur d'applications

Client local

serveur d'applications

conteneur EJB

conteneur EJB

conteneur Web

conteneur Web

typiquement une servlet ou une JSP


colocalise sur le mme serveur que le bean
mcanisme dit "injection de dpendance"
1. la classe cliente dclare un attribut
du type de l'interface
annot @EJB
ventuellement @EJB(name="foobar")
2. le conteneur affecte (injecte) la rfrence du bean dans l'attribut

public class ClientServlet extends HttpServlet {


@EJB
private CalculatriceItf myBean;
public void service( HttpServletRequest req, HttpServletResponse resp) {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
double result = myBean.add(12,4.75);
out.println("<html><body>"+result+"</body></html>");
} }

appel de mthode en utilisant l'attribut

EJB 3

15

Lionel Seinturier

EJB 3

16

Lionel Seinturier

1.1 Session Bean

1.1 Session Bean

Client distant

Stateful Session Bean

Dclaration d'une interface @javax.ejb.Remote


Utilisation de @javax.ejb.Remote pour la classe du bean

@Remote(CalculatriceItf.class)
public class CalculatriceBean implements CalculatriceItf { ... }

1.
2.
3.

Rcupration de la rfrence vers l'annuaire JNDI


Recherche du bean dans l'annuaire
Appel des mthodes du bean

2 annotations principales

public class Client {


public static void main(String args[]) throws Exception {
javax.naming.Context ic = new javax.naming.InitialContext();
CalculatriceItf bean = (CalculatriceItf) ic.lookup("myCalculatrice");
double res = bean.add(3,6);
} }
EJB 3

17

instance du bean reste en mmoire tant que le client est prsent


expiration au bout d'un dlai d'inactivit
similaire session JSP/servlet
utilisation type
gestion d'un panier lectronique sur un site de commerce en ligne
rapport sur l'activit d'un client

Lionel Seinturier

@Stateful
@Remove

: dclare un bean avec tat

dfinit la mthode de fin de session


la session expire l'issu de l'excution de cette mthode

EJB 3

18

1.1 Session Bean

Lionel Seinturier

1.2 Entity Bean

Stateful Session Bean


1.
2.
3.
4.
5.
6.
7.

@Stateful
public class CartBean implements CartItf {
private List items = new ArrayList();
private List quantities = new ArrayList();
public void addItem( int ref, int qte ) { ... }
public void removeItem( int ref ) { ... }
@Remove
public void confirmOrder() { ... }
}

EJB 3

19

Lionel Seinturier

EJB 3

Dfinition
Dveloppement
Utilisation
Relation
Cl
Rgles de mapping EB - table
Autres annotations

20

Lionel Seinturier

1.2 Entity Bean

1.2 Entity Bean

Dfinition

Dveloppement

Reprsentation d'une donne manipule par l'application


donne typiquement stocke
dans un SGBD (ou tout autre
support accessible en JDBC)

EB

4 annotations principales

N om
Jo hn
A nne
M arcel

S o ld e
1 0 0 .0 0
1 5 6 .0 0
5 5 .2 5

annotations de classe
@Entity
@NameQuery

: dclare une classe correspondant un entity bean (EB)


: associe une requtre SQL cet EB

annotations de mthode getter ou d'attribut


@Id
: dfinit une cl primaire
@GeneratedValue : permet de dfinir un attribut dont la valeur est gnre
par le conteneur (ex. : entier auto-incrment)

correspondance objet tuple relationnel (mapping O/R)


possibilit de dfinir des cls, des relations, des recherches
avantage : manipulation d'objets Java plut que de requtes SQL
mis en oeuvre l'aide
d'annotations Java 5
de la gnricit Java 5
de l'API JPA (Java Persistence API)
EJB 3

21

Lionel Seinturier

EJB 3

22

1.2 Entity Bean

Lionel Seinturier

1.2 Entity Bean

Dveloppement

Dveloppement

@Entity
@NamedQuery(name = "allBooks", query = "select * FROM Book o")
public class Book {

public String getAuthor() { return author; }


public void setAuthor(String author) { this.author = author; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }

private long id;


private String author;
private String title;

public Book() {}
public Book(String author, String title) {
this.author = author;
this.title = title; }
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) { this.id = id; }

EJB 3

23

Lionel Seinturier

EJB 3

24

Lionel Seinturier

1.2 Entity Bean

1.2 Entity Bean

Utilisation

Utilisation

Notion Entity Manager

@Stateless
public class MyBean implements MyBeanItf {

le gestionnaire des entits


assure le passage entre les objets et les tables relationnelles du SGBD

@PersistenceContext
private EntityManager entityManager = null;
public void
Book b1
Book b2
Book b3

permet d'ajouter des enregistrements (INSERT)


permet d'effectuer des requtes (SELECT)
utilisation de java.util.List et de la gnricit Java 5 (List<Book>)

init() {
= new Book("Honore de Balzac","Le Pere Goriot");
= new Book("Honore de Balzac","Les Chouans");
= new Book("Victor Hugo","Les Miserables");

entityManager.persist(b1);
entityManager.persist(b2);
entityManager.persist(b3);

attribut de type javax.persistence.EntityManager


annot par @PersistenceContext

}
public List<Book> listOfBooks() {
return entityManager.createNamedQuery("allBooks").getResultList();
}
}

EJB 3

25

Lionel Seinturier

EJB 3

26

1.2 Entity Bean

Lionel Seinturier

1.2 Entity Bean

Relation

Relation

4 annotations correspondant aux cardinalits envisages entre entits

@Entity
@NamedQuery(name = "allAuthors",
query = "select * FROM Author o")
public class Author {

@OneToOne
@OneToMany
@ManyToOne
@ManyToMany

private long id;


private String name;
private Collection<Book> books;
public Author() { books = new ArrayList<Book>(); }
public Book(String name) { this.name = name; }
@OneToMany
public Collection<Book> getBooks() { return books; }
public void addBook( String title ) {
Book b = new Book(this,title);
getBooks().add(b); }
public void setBooks( Collection<Book> books ) {
this.books = books;
}

EJB 3

27

Lionel Seinturier

EJB 3

28

Lionel Seinturier

1.2 Entity Bean

1.2 Entity Bean

Relation

Relation

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

@Entity
@NamedQuery(name = "allBooks", query = "select * FROM Book o")
public class Book {
private long id;
private Author author;
private String title;

public String getName() { return name; }


public void setName(String name) { name = name; }

public Book() {}
public Book(Author author, String title) {
this.author = author;
this.title = title; }

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

EJB 3

29

Lionel Seinturier

EJB 3

30

1.2 Entity Bean

Lionel Seinturier

1.2 Entity Bean

Relation

Cl

@ManyToOne
@JoinColumn(name="Author_id")
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }

Chaque instance de bean peut tre identifie par une cl compose


classe fournie par le dveloppeur du bean
- implantant l'interface java.io.Serializable
- dfinissant les mthodes hashCode et equals

}
public class PersonnePK implements java.io.Serializable {
public String name; public String firstname;
public PersonnePK(String n,String p) { name=n; firstname=p; }
public PersonnePK() {}
public int hashCode() {
return name.hashCode() + firstname.hashCode();
}
public boolean equals(Object other) {
return /** name==other.name && firstname==other.firstname */;
} }
EJB 3

31

Lionel Seinturier

EJB 3

32

Lionel Seinturier

1.2 Entity Bean

1.2 Entity Bean

Cl

Rgles de mapping EB - table

Utilisation : annotation @IdClass

chaque classe de EB est mis en correspondance avec une table


par dfaut table avec mme nom que la classe
sauf si annotation classe
@Table(name="")

@Entity
@IdClass(PersonnePK.class)
public class Personne {

2 modes de dfinition des colonnes des tables


property-based access
: on annote les mthodes getter
field-based access
: on annote les attributs

private String name;


private String firstname;
public Personne() {}
public Book(String name, String firstname) {
this.name=name; this.firstname=firstname; }

exclusif (choisir)
1 colonne par field/property

@Id
public String getName() { return name; }
public void setName(String name) { this.name = name; }

par dfaut colonne avec mme nom que field/property


sauf si annotation
@Column(name="")

@Id
public String getFirstname() { return firstname; }
public void setFirstname(String fname) { this.firstname = fname; }
}
EJB 3

33

Lionel Seinturier

EJB 3

34

1.2 Entity Bean

Lionel Seinturier

1.2 Entity Bean

Rgles de mapping EB - table

Rgles de mapping EB - table

colonne de jointure
@JoinColumn(name="", referencedColumnName="")

table de jointure
@JoinTable

table de jointure
@JoinTable

@Entity
@Table(name="CATEGORIES")
class Category {
@Id
@Column(name="CATEGORY_ID")
protected long categoryId;

@Entity
@Table(name="ITEMS")
public class Item {
@Id
@Column(name="ITEM_ID")
protected long itemId;
@ManyToMany(mappedBy="items")
protected Set<Category> categories
...
}

@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;
...
}
EJB 3

35

Lionel Seinturier

EJB 3

36

Lionel Seinturier

1.2 Entity Bean

1.2 Entity Bean

Autres annotations

Autres annotations

@Enumerated : dfinit une colonne avec des valeurs numres


EnumType : ORDINAL (valeur stocke sous forme int), STRING

@SecondaryTable

public enum UserType {STUDENT, TEACHER, SYSADMIN};


@Enumerated(value=EnumType.ORDINAL)
protected UserType userType;

@Lob

: donnes binaires

@Embeddable et @Embedded

@Lob
protected byte[] picture;

@Temporal
: dates
TemporalType :

: embarque les donnes 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;

DATE (java.sql.Date), TIME (java.sql.Time)


TIMESTAMP (java.sql.Timestamp)

@Embedded
private Address adresse;

@Temporal(TemporalType.DATE)
protected java.util.Date creationDate;
EJB 3

: mapping d'un EB plusieurs tables

@Entity
@Table(name="USERS")
@SecondaryTable(name="USER_PICTURES"
pkJoinColumns=@PrimaryKeyJoinColumn(name="USER_ID"))
public class User { ... }

37

Lionel Seinturier

EJB 3

1.3 Message-driven Bean

38

1.3 Message-driven Bean

Message-driven bean (MDB)

Caractristiques

Interaction par envoi message asynchrone (MOM : Message-Oriented Middleware)

- consomme des messages asynchrones


- pas d'tat ( stateless session bean)
- toutes les instances d'une mme classe de MDB sont quivalentes
- peut traiter les messages de clients

prog.
client

dpose
message

Bote
lettres

retrait
message

prog.
serveur

Quand utiliser un MDB

CORBA COSEvent
2 modes

Queue

viter appels bloquants


dcoupler clients et serveurs
besoin de fiabilit : protection crash serveurs

Topic

Vocabulaire : producteur/consommateur

- n vers 1 (queue)
- n verrs m (topic)

EJB 3

Lionel Seinturier

39

Lionel Seinturier

EJB 3

40

Lionel Seinturier

1.3 Message-driven Bean

1.3 Message-driven Bean

Concepts
MDB

Producteur

bas sur les specs Sun Java Messaging Service (JMS)

java.sun.com/jms

ConnectionFactory
fabrique pour crer des connexions vers queue/topic
Connection
une connexion vers queue/topic
Session
intervalle de temps pour l'envoi de messages dans queue/topic
peut tre rendue transactionnelle
similitude avec les notions de sessions JDBC, Hibernate,

public class MyProducerBean {


@Resource(name="jms/QueueConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(name="jms/ShippingRequestQueue")
private Destination destination;

Cration d'une connexion


Cration d'une session
(* : ventuellement plusieurs sessions par conn.)
Cration d'un message associ un destinataire
Envoi du message
Fermeture session
Fermeture connexion

EJB 3

41

Lionel Seinturier

// l'id de la queue

public void produce() {


Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE)
MessageProducer producer = session.createProducer(destination);

Processus
1.
2.
3.
4.
5.
6.

// l'id de la factory

ObjectMessage message = session.createObjectMessage();


ShippingRequest request = new ShippingRequest(item,address,amount);
message.setObject(request);
producer.send(message);
session.close();
connection.close();
} }
EJB 3

42

1.3 Message-driven Bean

1.4 Fonctionnalits avances

Consommateur

Timer bean

MDB = classe
- annote @MessageDriven
- implantant interface MessageListener
- mthode void onMessage(Message)

Un bean permettant de dclencher des actions priodiquement


@Timeout
: mthode excute chance du timer
profil de mthode
: void <methodname>( javax.ejb.Timer timer )
@Resource
: attribut de type javax.ejb.TimerService
utilisation des mthodes de TimerService pour crer des timers
createTimer( long duration, java.io.Serializable info );
createTimer( long initialDuration, long period, java.io.Serializable info );

@MessageDriven(name="ShippingRequestProcessor",
activationConfig={
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destinationName",
propertyValue="jms/ShippingRequestQueue")})
public class MyConsumerBean implements MessageListener {

public class PlaceBidBean {


@Resource TimerService ts;
public void addBid(Bid bid) { ts.createTimer(1000,25000,bid); }

public void onMessage(Message message) {


ObjectMessage objectMessage = (ObjectMessage) message;
ShippingRequest request = (ShippingRequest) objectMessage.getObject();
...
} }
EJB 3

43

Lionel Seinturier

Lionel Seinturier

@Timeout
public void monitorBid( Timer timer ) {
Bid bid = (Bid) timer.getInfo(); ...
} }
EJB 3

44

Lionel Seinturier

1.4 Fonctionnalits avances

1.4 Fonctionnalits avances

Intercepteurs

Intercepteurs

Permettent d'implanter des traitements avant/aprs les mthodes d'un bean


- influence de l'AOP (voir AspectJ, JBoss AOP, )

public class PlaceBidBean {


@Interceptors(MyInterceptor.class)
public void addBid( Bid bid ) {
... }
}

@Interceptors
: les mthodes devant tre interceptes
@AroundInvoke
: les mthodes d'interception
profil de mthode
Object <methodname>( javax.interceptor.InvocationContext ctx ) throws Exception

public class MyInterceptor {


@AroundInvoke
public Object trace( InvocationContext ic ) throws Exception {
// ... code avant ...

InvocationContext

java.lang.reflect.Method m = ic.getMethod();
Object bean = ic.getTarget();
Object[] params = ic.getParameters();
// ventuellement modif. paramtre avec ic.setParameters(...);

permet d'obtenir des informations


(introspecter) sur les mthodes
interceptes
fournit une mthode proceed()
pour excuter la mthode
intercepte
EJB 3

Plusieurs mthodes dans des classes


peuvent tre associes MyInterceptor

Object ret = ic.proceed();

// Appel du bean (facultatif)

// ... code aprs ...


return ret; } }
45

Lionel Seinturier

EJB 3

Plan

46

Lionel Seinturier

2. Services
Serveur d'application

1. Composant EJB
1.1 Session Bean
1.2 Entity Bean

Services fournis
cycle de vie
transaction
nommage
scurit

1.3 Message Driven Bean


1.4 Fonctionnalits avances
2. Services
3.
4.
5.
6.

EJB 3

par rapport CORBA : services intgrs ds le dpart la plate-forme

Dploiement
Design patterns EJB
Web Services
Conclusion

47

Lionel Seinturier

EJB 3

48

Lionel Seinturier

2.1 Cycle de vie

2.1 Cycle de vie

Service de cycle de vie des beans

Cycle de vie d'un session bean

Passivation dinstances

Stateful

sauvegarde temporaire du bean


lorsque le conteneur a besoin de mmoire
Pooling dinstances

Le conteneur peut dcider


de "passiver" le bean
sauvegarde de son tat
en gnral politique least recently used

- pour des raisons de performances, le conteneur peut instancier moins


de beans quil ny a de client
plusieurs clients partagent un mme bean

Stateless
mme diagramme d'tats sauf pas de passivation

EJB 3

49

Lionel Seinturier

EJB 3

2.1 Cycle de vie

50

2.1 Cycle de vie

Annotation cycle de vie d'un session bean

Cycle de vie d'un entity bean

Notifications de changement d'tat

Le conteneur EJB gre un pool d'instances de bean


Aprs instanciation, le bean est mis dans le pool

mthodes annotes du bean


profil : void <methodname>()
invoques juste avant le changement d'tat
permet au bean de fermer/ouvrir des ressources (connexions, fichiers, ) "proprement"
@PostConstruct
@PreDestroy
@PrePassivate
@PostActivate

Lionel Seinturier

il n'est pas associ aucune donne


mais est prt servir
create

: aprs la cration
: avant la destruction
: avant la passivation
: aprs l'activation

et remove invoques par le client

Toutes les autres mthodes


- implantes par le bean
- invoques par le conteneur

public class MyBean {


@PostConstruct
public void initialize() {
... }
... }

EJB 3

51

Lionel Seinturier

EJB 3

52

Lionel Seinturier

2.2 Transactions

2.2 Transactions

Service de transactions

Granularit des transactions

Assure des proprits ACID pour des transactions plates

Comment dmarquer (dlimiter) les transactions ?


Attribut transactionnel avec 6 valeurs

Exemple classique : un transfert bancaire (dbit, crdit)


atomicit
cohrence
isolation
durabilit

soit les 2 oprations s'effectuent compltement, soit aucune


le solde d'un compte ne doit jamais tre ngatif
des transferts // doivent fournir le mme rsultat qu'en sq.
les soldes doivent tre sauvegards sur support stable

2 cas pour le bean appelant

Support compltement intgr au serveur EJB


Vritable + / aux middlewares style CORBA

EJB 3

- REQUIRED
- REQUIRES_NEW
- SUPPORTS
- NOT_SUPPORTED
- MANDATORY
- NEVER

soit il s'excute dans une transaction


soit il s'excute en dehors de tout contexte transactionnel

53

Lionel Seinturier

EJB 3

54

2.2 Transactions

2.2 Transactions

Granularit des transactions

Granularit des transactions

REQUIRED

REQUIRES_NEW

Appelant

EJB 3

Appel

Appelant

55

Lionel Seinturier

Appelant

Appel

Lionel Seinturier

EJB 3

Appel

Appelant

56

Appel

Lionel Seinturier

2.2 Transactions

2.2 Transactions

Granularit des transactions

Granularit des transactions

SUPPORTS

NOT_SUPPORTED

Appelant

Appel

EJB 3

Appelant

Appelant

Appel

57

Lionel Seinturier

Appel

EJB 3

Granularit des transactions

MANDATORY

NEVER

Appelant

Appelant

Appel

Erreur

EJB 3

59

Lionel Seinturier

2.2 Transactions

Granularit des transactions

Appel

Appel

58

2.2 Transactions

Appelant

Appelant

Appel

Appelant

Appel

Erreur

Lionel Seinturier

EJB 3

60

Lionel Seinturier

2.2 Transactions

2.2 Transactions

Dfinition des transactions

Dfinitions des transactions CMT

2 modes

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyBean implements MyBeanItf {

CMT (Container Managed Transaction)


BMT (Bean Managed Transaction)

: annotations
: API JTA

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transfert() {
try {
Account a1 = em.find(Account.class,"Bob");
Account a2 = em.find(Account.class,"Anne");
a1.credit(10.5);
a2.widthdraw(10.5);
}
catch( Exception e ) {
sc.setRollbackOnly();
} }

CMT
@TransactionManagement sur la classe
@TransactionAttribute(TransactionAttributeType.XXX)
sur les mthodes transactionnelles
o XXX est 1 des 6 attributs prcdents
toute la mthode est considre comme un bloc transactionnel
commit par dfaut en fin de mthode
appel setRollbackOnly() pour annuler
EJB 3

61

@PersistenceContext
private EntityManager em;
@Resource
private SessionContext sc; }
Lionel Seinturier

EJB 3

2.2 Transactions

62

2.2 Transactions

Dfinition des transactions

Dfinition des transactions

BMT

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyBean implements MyBeanItf {

dmarcation explicite avec begin/commit/rollback


avantage : possibilit granularit plus fine qu'en CMT

EJB 3

63

Lionel Seinturier

public void transfert() {


try {
ut.begin();
Account a1 = em.find(Account.class,"Bob");
Account a2 = em.find(Account.class,"Anne");
a1.credit(10.5);
a2.widthdraw(10.5);
ut.commit();
}
@PersistenceContext
catch( Exception e ) {
private EntityManager em;
ut.rollback();
@Resource
} }
private UserTransaction ut; }

Lionel Seinturier

EJB 3

64

Lionel Seinturier

2.3 Nommage

2.3 Nommage

JNDI (Java Naming and Directory Interface)

JNDI

1 unique API pour accder serveurs de nom


unification, simplification

URL JNDI

prfixe : schma

prfixe
schma

identifiant unique par type de serveurs de noms


spcifique chaque type de serveur de noms

Exemples
iiop://foo.com/x
ldap://localhost:389
java:comp/env

RMI-IIOP
LDAP

Type java:
serveur de noms en mmoire
accessible seulement dans le contexte mmoire des beans
stocke des rfrences vers des ressources fournies par J2EE aux beans
(ex accs lAPI JTA, rf. des interfaces locales, )
EJB 3

65

Lionel Seinturier

EJB 3

66

2.3 Nommage

Lionel Seinturier

Plan

JNDI
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean

Rcupration d'un point dentre vers JNDI


Context ic = new InitialContext();

le serveur de noms RMI-IIOP local

1.3 Message Driven Bean


1.4 Fonctionnalits avances
2. Services

Properties props = new Properties();


props.put( InitialContext.PROVIDER_URL, "iiop://host.com:1050" );
Context ic = new InitialContext(props);

un serveur de noms RMI-IIOP sur la machine host.com et le port 1050

3.
4.
5.
6.

Properties props = new Properties();


props.put( InitialContext.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory" );
props.put( InitialContext.PROVIDER_URL, "..." );
Context ic = new InitialContext(props);

EJB 3

67

Lionel Seinturier

EJB 3

Dploiement
Design patterns EJB
Web Services
Conclusion

68

Lionel Seinturier

3. Dploiement

3. Dploiement

Packaging des applications

Descripteur XML du bean

1 application EJB = 1 archive .ear

Fichier XML (ejb-jar.xml) conforme une DTD dfinie dans les specs des EJB

- 1 descripteur XML de l'application


- 1 archive .war par web bean
- 1 archive .jar par bean

informations pour configurer et dployer le bean


46 balises
plates-formes fournissent des assistants pour sa cration

1 archive .war

<?xml version="1.0" encoding="ISO-8859-1"?>


<ejb-jar>
<description>Beans de gestion de compte bancaire</description>

- 1 descripteur XML du web bean


- JSP ou servlet.class
1 archive .jar
- 1 descripteur XML du bean
- les .class du bean
EJB 3

<enterprise-beans>
...
</enterprise-beans>

<!-- les beans de l'application -->

<assembly-descriptor>
...
</assembly-descriptor>

<!-- la configuration des services -->

</ejb-jar>
69

Lionel Seinturier

EJB 3

3. Dploiement

70

3. Dploiement

Exemple

Exemple (suite)

<entity>
<description>Bean correspondant un compte</description>
<ejb-name>Compte</ejb-name>

<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>Compte</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>

<home>mypkg.CompteRemoteHome</home>
<!-- les classes et interf. -->
<remote>mypkg.CompteRemoteInterface</remote>
<ejb-class>mypkg.CompteBean</ejb-class>
<prim-key-class>java.lang.String</prim-key-class>
<!-- Dfinition des attributs persistants -->
<persistence-type>Container</persistence-type>
<cmp-field> <field-name>nom</field-name> </cmp-field>
<cmp-field> <field-name>solde</field-name> </cmp-field>
<reentrant>False</reentrant>
</entity>

EJB 3

71

Lionel Seinturier

Lionel Seinturier

EJB 3

72

Lionel Seinturier

3. Dploiement

4. Design Patterns EJB

Outillage

Gabarit de conception (design pattern)

Exemple : deploytool
(Sun RI)

Problmes de codage rcurrents


- parcourir un arbre de donnes dont les noeuds sont typs
- maj une fentre en fonction de modifications sur des donnes (et vice-versa)
-
design pattern (DP) : solutions reconnues d'organisation du code

gnre les
descripteurs XML
dploie/retire
les applications

But
- amliorer la clart, la comprhension du code
- mettre en avant des lments d'architecture logicielle

EJB 3

73

Lionel Seinturier

EJB 3

4. Design Patterns EJB

74

4. Design Patterns EJB

DP Session facade

DP Session facade

Pb : nombreuses dpendances entre les clients et les beans

traitements effectus par la faade minimaux


essentiellement dlgation

Solution : prsenter aux clients une seule interface faade (stateless session bean)
Client

Facade

Compte

Lionel Seinturier

Transfert

ventuellement plusieurs faades sur un mme ensemble de beans


diffrentes vues

ajouterCompte
rechercherCompte
crediter
debiter
transferer

http://www.theserverside.com/cartoons/TalesFromTheServerSide.tss

EJB 3

75

Lionel Seinturier

EJB 3

76

Lionel Seinturier

4. Design Patterns EJB

4. Design Patterns EJB

DP Data Transfert Object

DP Data Transfert Object

Aussi connu sous le terme : Value Object


Pb : nombreux changes rseaux pour de simples get/set

Solution : transmettre une instance par valeur

Client

Client

Bean

DTO

Bean
getDTO

getNom
getNom

getPrenom

getPrenom

Rseau

Rseau

setNom

setNom

setPrenom

setPrenom

EJB 3

setDTO

77

Lionel Seinturier

EJB 3

4. Design Patterns EJB

78

Lionel Seinturier

5. Web Services

Autres DP

Web Services (WS)

application service
centraliser un processus mtier s'tendant sur +sieurs beans

Invocation de traitements distance via le Web


Solution d'interoprabilit entre systmes htrognes (par ex. Java EE .NET)
Repose sur HTTP / SOAP / XML / WSDL

composite entity
rassembler dans 1 seul EB les donnes persistantes de +sieurs EB

les mthodes fournies par les beans peuvent tre exposes comme des WS

transfert object assembler


aggregation de +sieurs DTO

@WebService : annotation pour la classe d'un bean


@WebMethod : annotation pour une mthode d'un bean accessible via un WS
@WebResult et @WebParam
: annotations pour les paramtres d'une WebMethod

service activator
invoquer des services de faon asynchrone

la plate-forme gnre le code (WSDL, stub, skeleton) ncessaire au fonctionnement WS

EJB 3

79

Lionel Seinturier

EJB 3

80

Lionel Seinturier

5. Web Services

5. Web Services

Exemple

Utilisation de WS

@WebService(targetNamespace="urn:UserService")
@Stateless
public class MyBean implements MyBeanItf {

@WebServiceRef

: rfrence un web service

public class MyClientBean {

@WebMethod
@WebResult(name="UserId")
public long addUser(
@WebParam(name="UserName") String name,
@WebParam(name="UserAge") int age )
{ ... }
}

@WebServiceRef(
wsdlLocation="http://localhost:8080/UserService/MyBean?WSDL")
private MyBeanItf service;
public void foo() {
long id = service.addUser("Bob",15);
} }

Accs (ex. myhost.com 8080) :


http://myhost.com:8080/UserService/MyBean/addUser?UserName=Bob&UserAge=15

EJB 3

81

Lionel Seinturier

EJB 3

6. Conclusion

82

Lionel Seinturier

6. Conclusion

EJB

Commerciaux

Approche intressante

WebSphere
IBM
www-306.ibm.com/software/webservers
WebLogic
BEA
www.weblogic.com
App Server
Borland
www.borland.com/appserver
iPortal
IONA
www.iona.com/products
Oracle, Sybase, HP, Fujitsu, ATG, Hitachi, Macromedia, SilverStream, ...

- prise en charge de services techniques par la plate-forme


- le composant se focalise sur le mtier
- packaging & dploiement ++

voir java.sun.com/javaee/overview/compatibility.jsp
Quelques critiques/pistes d'amliorations possibles

Open source

- "uniquement" Java
- domaine applicatif "limit" aux applications Java/Web
contrle/commande ? temps-rel ? embarqu ? CAO ? infographie ? ...
- dploiement sur un seul serveur la fois

EJB 3

83

Lionel Seinturier

Java EE 5 (Sun)
JOnAS (ObjectWeb)
JBoss (Red Hat)
Geronimo (Apache)
JFox
EJB 3

java.sun.com/javaee
jonas.objectweb.org
www.jboss.org
geronimo.apache.org
www.huihoo.org/jfox

84

Lionel Seinturier

6. Conclusion
Ressources
API Java EE 5
Tutorial Java EE 5 Sun

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

Livre Mastering Enterprise Java Beans, 3rd edition


http://www.theserverside.com/tt/books/wiley/masteringEJB/index.tss

EJB 3

85

Lionel Seinturier