Cedric Dumoulin
(C) The Java EE 7 Tutorial
http://docs.oracle.com/javaee/7/tutorial/doc/
Webographie
The Java EE 7 Tutorial
http://docs.oracle.com/javaee/7/tutorial/doc/
Les slides de cette présentation sont des extraits de ce
tutorial
Qu’est-ce qu’un Enterprise Bean
(EJB)?
C’est un composant coté serveur
Il encapsule la logique métier d’une application
Il est écrit en Java (c’est une classe POJO)
Aussi appelé EJB (Enterprise Java Bean)
Avantages des EJB
Simplifie le développement de grande application
distribuées.
Le framework fournit les services de niveau systèmes
(sécurité, persistence, transaction, …)
L’EJB contient la logique métier
Le développeur se concentre sur la logique métier
Prône la séparation de la logique métier et de la présentation
du client
Les composants EJB sont portables
Construction d’application par assemblage de composants
Réutilisation
Dans quelle applications utiliser
des EJBs ?
Si votre application a au moins un de ces besoins:
Mise à l’echelle
l’application doit supporter un grand nombre de clients
L’application peut être distribuée sur plusieur machine
L’intégrité des données doit être assuré par des
transactions
Les EJB supportent les transactions (de façon relativement
transparente)
Plusieurs types de clients
La logique métier reste la même
Les différents types d’EJBs
Il existe 2 types
Les EJB session
Les Messages Driven Bean (MDB)
Qu’est-ce qu’un EJB Session ?
Un Bean Session encapsule la logique métier
C’est une classe Java POJO
Il peut être appelé programmatiquement par un client
(ie par un autre code)
Localement au container
A distance (remote)
Le client invoque les méthodes de l’EJB
L’EJB effectue la tâche demandé par le client
Il effectue la logique métier dans le serveur
Un EJB session n’est pas persistant.
3 types de Bean Session
Stateful Session Bean
L’état d’un objet est constitué des valeurs de ses variables
d’instance (ie ses attributs)
Ce bean maintient l’état des variables d’instance entre 2
appels, et ce pour un client
Stateless Session Bean
Ne permet pas de maintenir des valeurs de variables
Singleton Session Bean
Instancié une et une seule fois pour une application
Existe pout toute la durée de vie de l’application
StateFul Session Bean
Maintient un état conversationnel avec le client
N’a qu’un seul client
Maintient son état entre les appels de ce client
Se termine si le client se termine
Le contener maintient un Stateful par client
Stateless Session Bean
Pas d’état conversationnel avec le client
Le contener maintient un pool de Stateless Session
Bean
Le contener alloue un de ces bean au client
Un Stateless a un client à la fois.
réutilisation des instances
Peut avoir moins de stateless que de client
Quand utiliser un
Stateful Session Bean ?
The bean's state represents the interaction between
the bean and a specific client.
The bean needs to hold information about the client
across method invocations.
The bean mediates between the client and the other
components of the application, presenting a simplified
view to the client.
Quand utiliser un
Stateless Session Bean ?
Si vous voulez améliorer les performanes et que votre
bean à une des caractéristiques suivantes:
The bean's state has no data for a specific client.
In a single method invocation, the bean performs a
generic task for all clients.
For example, you might use a stateless session bean to send an
email that confirms an online order.
The bean implements a web service.
Quand utiliser un
Singleton Session Bean ?
State needs to be shared across the application.
A single enterprise bean needs to be accessed by
multiple threads concurrently.
The application needs an enterprise bean to perform
tasks upon application startup and shutdown.
The bean implements a web service.
Message Driven Bean (MDB)
C’est un bean permettant de traiter des messages de
façon asynchrone
Message == appel d’une méthode avec un paramètre
(le message).
Dans JEE, un MDB est un listener JMS (Java Messaging
Service)
Le message peut être envoyé
Par n’importe quel composant JEE
Par un client JMS
Par du code Java
Différence entre
MDB et Stateless Session Bean
Pas d’accès à travers une interface
A part ca, il se rapproche d’un Stateless:
MDB instances retain no data or conversational state for
a specific client.
All instances of a MDB are equivalent,
allowing the EJB container to assign a message to any MDB
instance.
The container can pool these instances to allow streams of
messages to be processed concurrently.
A single MDB can process messages from multiple
clients.
MDB
Un MDB peut contenir un état maintenu entre les
appels des clients
L’état est partagé entre les clients
Utile pour maintenir une connexion sur une ressource
(DB, file, mails, …)
Un client n’appelle pas directement la méthode du
MDB
Il faut passer par JMS (poster le message dans une file
d’attente)
Quand un message arrive dans la file, le contener
appel la méthode onMessage(…) du MDB
Caractéristiques d’un MDB
They execute upon receipt of a single client message.
They are invoked asynchronously.
They are relatively short-lived.
They do not represent directly shared data in the
database, but they can access and update this data.
They can be transaction-aware.
They are stateless.
Quand utiliser un MDB
Pour recevoir des messages de façon asynchrones
Pour assurer la reception d’un message
Le message peut être bufferiser par JMS
JMS assure que le message sera délivré, y compris en cas
de problème de connection
Accéder au Session Bean
Une session bean peut être accédé par
Une vue sans interface
Cad les methodes public du bean
Une (ou plusieurs )interface de domaine
Interface Java définissant les methodes exposées par le bean
L’implémentation interne du bean n’est pas accessible par
le client.
L’interface et la vue sans-interface permettent de bien
séparer l’utilisation du bean (vue client) de son
implémentation
Facilite la maintenance (peut changer l’implem)
faire attention lors de la conception de l’interface
Utiliser un bean dans un client
Un client peut obtenir une référence sur une instance
de bean
Par injection (utilisation d’annotation Java)
Par lookup JNDI
Un client ne doit pas instancier directement un bean
C’est le conteneur qui fait l’instanciation.
Qui supporte l’injection
Tous les clients fonctionnant dans un server JEE
JavaServer Faces web
JAX-RS web services,
other enterprise beans,
or Java EE application clients
Utiliser l’annotation javax.ejb.EJB
Sinon, utiliser un lookup avec JNDI
Syntaxe JNDI portable
Attention, certaines implementations JNDI ne supporte
pas cette syntaxe
Namespaces:
java:global, java:module, et java:app
Remote
java:global[/application name]/module name /enterprise bean
name[/interfacename ]
Local, dans le même module (le même war, jar, rar)
java:module/enterprise bean name/[interface name]
Locale, dans la même application (le même EAR)
java:app[/module name]/enterprise bean name [/interface
name]
Client local ou client remote?
Tight or loose coupling of related beans
Tight local
Loose remote
Type of client
Application , sur une autre machine remote
Sur la même machine local
Component distribution remote
Besoin de mise à l’échelle remote
Performance local
Details:
32.4.2 Deciding on Remote or Local Access
Si incertain remote
Peu aussi être local ET remote !
Client local
A local client has these characteristics.
■ It must run in the same application as the enterprise
bean it accesses.
■ It can be a web component or another enterprise bean.
■ To the local client, the location of the enterprise bean
it accesses is not transparent.
La vue sans interface et une vue local
Une interface @Local
@Local
public interface InterfaceName { ... }
@Local(InterfaceName.class)
public class BeanName implements InterfaceName { ... }
Accéder au Client Local
Par la vue sans interface
Utiliser la classe du bean
Ou JNDI
@EJB ExampleBean exampleBean;
ExampleBean exampleBean = (ExampleBean)
InitialContext.lookup("java:module/ExampleBean");
Par la vue domaine (interface locale)
Utiliser le nom de l’interface locale
Ou JNDI
@EJB Example example;
ExampleLocal example = (ExampleLocal)
InitialContext.lookup("java:module/ExampleLocal");
Client distant (remote)
Un client distant a les caractéristiques suivantes:
It can run on a different machine and a different JVM
from the EJB it accesses.
(It is not required to run on a different JVM.)
It can be a web component, an application client, or
another enterprise bean.
To a remote client, the location of the EJB is transparent.
The enterprise bean must implement a business
interface.
remote clients may not access an enterprise bean through a
no-interface view.
Créer un client remote
Soit décorer l’interface remote avec @Remote
@Remote
public interface InterfaceName { ... }
Soit décorer le bean
@Remote(InterfaceName.class)
public class BeanName implements InterfaceName { ... }
Communication client remote bean
Transparent pour le programmeur
Mais RMI derrière
Obtenir le bean remote
Par injection
Utiliser l’interface remote
@EJB
Example example;
Par lookup JNDI
Utiliser l’interface remote
ExampleRemote example = (ExampleRemote)
InitialContext.lookup("java:global/myApp/ExampleRemote");
Constitution d’un EJB
To develop an enterprise bean, you must provide the
following files:
■ Enterprise bean class: Implements the business methods of
the enterprise bean and any lifecycle callback methods.
■ Business interfaces: Define the business methods
implemented by the enterprise bean class. A business
interface is not required if the enterprise bean exposes a local,
no-interface view.
■ Helper classes: Other classes needed by the enterprise bean
class, such as exception and utility classes.
Packager les fichiers
Dans un EJB Jar
Ou dans le WAR (WEBINF/classes)
Convention de nommage
des classes
Cycle de vie d’un Stateful Session
Bean
Le système peut décider de « passiver » le bean
Pour récupérer des ressources
Peut utiliser des callback (par annotations)
Cycle de vie d’un Stateless Session
Bean
Pas de passivation
Car réutilisation par le conteneur
Cycle de vie d’un Singleton Session
Bean
Cycle de vie d’un
Message Driven Bean (MDB)
Voir chap 26 avaeetutorial7
More information on Enterprise
JavaBean
The Java EE 7 Tutorial
http://docs.oracle.com/javaee/7/tutorial/doc/
Enterprise JavaBeans 3.2 specification:
http://www.jcp.org/en/jsr/detail?id=345
Enterprise JavaBeans web site:
http://www.oracle.com/technetwork/java/ejb141389.html
Enterprise JavaBeans 3.2 specification project:
https://java.net/projects/ejb-spec/
Lectures
The Java EE 7 Tutorial
http://docs.oracle.com/javaee/7/tutorial/doc/
chap 1 à 5
chap 26 Enterprise Beans