Les enterprises Java Beans…

publicité
Enterprise Java Beans
„ http://java.sun.com/products/ejb/index.html
Les enterprises Java Beans…
„ Architecture permettant la création d’applications réparties
selon l’architecture 3 parties
„
„
Michel RIVEILL
[email protected] - http://rangiroa.essi.fr/riveill
„
interface
traitement
persistance
„ Le composant de traitement est exécuté sur un serveur et
il est appelé par un client distant
Laboratoire I3S
„ REMARQUE :
„ Rien à voir avec les Java beans qui sont des composants
côté client
2
Enterprise JavaBeans
Enterprise Java Beans
„ Rendre une application
„ facile à développer, déployer et administrer
„ indépendamment de la plate-forme permettant son
exécution
„ EJB spécifications
„ = définition d’une architecture pour construire une
application en Java dont la partie serveur est construite à à
l’aide de composants appelé Entreprise Beans (EB)
„
„
„
Architecture = ensemble d’interfaces
„ Caractéristiques principales des EB
„ « écrit une fois, s’exécute partout »
„ composants « serveurs » spécialisés écrits en Java
Un EB (EnterpriseBean) n’est pas spécifique de la plateforme dans laquelle il est utilisé
Le déploiement d’un EB se fait sans recompilation ou
modification du code source
„
„
JavaBeans = composants clients visuels
c.f. objets métiers de CORBA
„ EJB est la partie centrale de la plate-forme
3
4
Plate-forme Enterprise Java
Architecture de serveur EJB
Composants Java beans
Client HTML
SGBD
relationnel
Serveur EJB
HTTP Serveur
WEB
servlet
RMI (JRMP, IIOP)
RMI
Client CORBA
Composants Enterprise Java Beans
IIOP
(c++, Java, VB, …)
Plate-forme EJB
(Conteneur + Serveur)
JMS
JTA
JDBC
JNDI
...
Client Java
EB
container
EB
container
RMI
SQL XQ
OQL XQ
SGBD
objet
Application, Applet
...
Plate-forme Serveur (Unix, NT) + JVM + JDK
Client DCOM
RPC DCOM
JTM
ActiveX
5
EJB
Caractéristiques principales
6
EJB
Modèle d’exécution
„ L’architecture EJB identifie les éléments suivants :
„ composants logiciels ou beans (EB),
„ conteneurs,
„ serveurs,
„ clients.
„ Les conteneurs isolent les beans du client et d’une
implémentation spécifique d’un serveur
„
Rappel : les beans sont dans la partie serveur
„ Conteneurs et serveurs implémentent les mécanismes de
bas niveau utilisés par les applications
„
transactions, persistance, gestion mémoire, …
7
8
EJB
Caractéristiques principales
EJB
Les différents rôles
„ EJB s’intéresse aux activités liées au développement, au
déploiement et à l’exécution d’une application
„ EJB définit différents rôles associés aux différentes parties
intervenant dans la production d’une application
„ EJB définit des contrats associés à un bean
„
„
Fournisseur d’EB
Enterprise Bean (EB)
Assembleur d’application
Ces contrats sont passés entre le conteneur et les clients qui
utilisent le bean.
=> ce sont des règles (obligations) qui doivent être
respectées par le fournisseur de l’EB et de conteneur
Application
L’installateur
Développement
de l’application
Déploiement
et exécution
Fournisseur de conteneur EJB
Fournisseur de serveur EJB
Conteneu
r
Serveur
Développement
du serveur
EJB
Produit
Utilise
9
EJB
Le contrat coté client
EJB contrats
„ Fournir un modèle de
développement uniforme
pour les applications qui
Contrat
utilisent les composants EB
„ Contrat coté client
client client
„
„
Contrat coté conteneur
„
„
fournir une vue uniforme
du bean au client. En
particulier cette vue est
indépendante de la plateforme de déploiement
permettre la portabilité des
beans sur différents
serveurs EJB
Contrat coté “packaging”
(ejb-jar file)
„
fournir un format de fichier
standard pour “packager”
les beans. Ce format doit
être supporter par tous les
outils liés aux EJB
10
„ Localiser le bean
„ utilisation de JNDI
„ Utiliser le bean
„ utilisation de l’interface standard fournie par l’EB provider
Enterprise
Bean
„
Contrat
conteneur
EBJ conteneur
„
Home Interface (méthodes liées à la gestion du bean : create,
remove, finder, ...)
Remote Interface (méthodes de l’application)
„ Le container implémente le mécanisme de délégation
permettant de “faire suivre” l’appel au bean
„
EJB serveur
le client ne communique pas directement avec le bean mais
avec le container
Contrat
parckaging
Fichier ejb-jar
11
12
EJB
Le contrat du “conteneur”
Session beans
„ L’EJB conteneur permet
„ gestion du cycle de vie, gestion de l’état, sécurité,
transaction distribuée, concurrence, extensibilité
„ ces services appellent des méthodes fournies par le bean
(callback methods)
„ sont non persistant (short-lived)
„ associé à un seul client
„ un flot d’exécution est créé pour
„ chaque appel de méthode
„
„ Les conteneurs gèrent 2+1 types de beans
„ propriétés et cycle de vie différent
„
Session beans
Entity beans
„
Message driven beans
„
„
„
plusieurs appels de méthodes en provenance du même
client
„
ƒ Sorte de sessions beans spécialisés dans les communications par
échanges de messages
stateless sessions bean
pas de donnée interne, inutile de le rendre passif, peut être
partagé par plusieurs clients
stateful sessions bean
„ sont détruits après un arrêt (ou une panne) de l’EJB
serveur
„ sont « transparents » aux transactions
„
transmettent le contexte
13
14
Entity beans
Cycle de vie d’un bean
„ Représentent les données d’une base de données
„ Le conteneur gère le cycle de vie d’un bean
„ sont persistant (long-lived)
„ la gestion de la persistance peut être faite par le bean (bean
managed persistence) ou déléguée à son conteneur
(container managed persistence)
„ Il fournit
„ administration du bean (‘Home implementation’)
„
„
„ acceptent les accès multiples effectués par plusieurs
„
clients
„
gestion de la concurrence
permet aux clients de créer, détruire et rechercher un objet EJB
appelle les opérations correspondantes fournies par le bean
(callbacks)
gestion de l’état
„
Activation
„
Désactivation - Passivation
ƒ le bean est chargé en mémoire
„ peuvent participer à des transactions
„ survivent aux pannes d’un serveur EJB
„ les pannes sont cachées aux clients
ƒ le conteneur peut sauvegarder l’état du bean
15
16
Cycle de vie d’un session bean stateless
Cycle de vie d’un session bean stateful
inexistant
inexistant
1.
2.
remove
ejbRemove
ejbRemove
1.
2.
3.
1.
2.
3.
4.
create
setSessionContext
ejbCreate
create
newInstance
setSessionContext
ejbCreate
ejbPassivate
prêt
prêt
ejbActivate
17
Cycle de vie d’un entity bean
passivé
18
Persistance
„ Persistance gérée par le bean
„
inexistant
„
1.
2.
1.
2.
unsetEntityContext
finalize
newInstance
setSessionContext
le fournisseur de l’Entity Bean écrit les opérations d’accès aux
données permettant de géré la persistance dans les callback
appropriés (ejbCreate, ejbStore, ejbLoad, ejbFind ...)
utilisation par exemple de JDBC ou d ’un SGF
„ Persistance gérée par le conteneur
1. ejbCreate
2. ejbPostCreate
(appelé par client)
„
„
le fournisseur de l’Entity Bean utilise les services du conteneur
(“container managed fields”)
et précise le support utilisé pour la persistance
ƒ le code d’accès à la base de donnée est délégué au conteneur
En attente
„ Dans les 2 cas
ejbActivate
(appelé par container)
„
le conteneur est responsable de la cohérence entre l’état du
bean et de l’état sauvegardé dans la base de données
ejbPassivate
prêt
1.
ejbRemove
19
20
Transaction
Bean’s transaction attribute
„ Support de l’architecture XA (X/Open DTP architecture)
„ extensions standards à JDBC 2.0
„ Java Transaction API (JTA)
„ Modèle de transaction plat
„ Pas de transaction imbriquées (nested)
„ Gestion “déclarative” des transactions
„ l’attribut transactionnel associé aux EBs est affecté
„
„
„
„
soit lors de la phase d’implémentation du bean
soit lors de son déploiement
un bean peut aussi contrôler explicitement les transactions
(JTA)
un client peut aussi contrôler explicitement les transactions
(JTA)
„
Beans transaction
Client’s transaction
associated attribute
transaction
bean’s method
„
TX_NOT_SUPPORTED
none
T1
none
none
„
TX_REQUIRED
none
T1
T1
T1
„
TX_SUPPORTS
none
T1
none
T1
„
TX_REQUIRES_NEW
none
T1
T1
T2
„
TX_MANDATORY
none
T1
Error
T1
„
TX_BEAN_MANAGED
none
T1
21
22
Gestion de la concurrence
Sécurité
„ Accès à plusieurs clients d’un entity bean
„ La gestion de la sécurité est délégué au maximum au
conteneur
„ Spécification de la sérialisibilité
„ Isolation level définis dans SQL
„
Niveaux d’isolation
Lecture sale
Lecture non
répétable
Fantômes
READ
UNCOMMITED
Oui
Oui
Oui
READ COMMITED
Non
Oui
Oui
REPEATABLE
READ
Non
Non
Oui
SERIALIZABLE
Non
Non
Non
objectif : simplifier la programmation du bean, améliorer la
portabilité
„ Le support de la sécurité est basé sur
„ l’API sécurité de Java (javax.security)
„ les méthodes liées à la sécurité peuvent être implémenté par
le conteneur (javax.ejb.EJBContext interface)
„ utilisation d’attributs de sécurité défini dans le descripteur du
bean utilisé lors de la phase de déploiement
„
„
runAsMode : CLIENT_IDENTITY, SPECIFIED_IDENTY,
SYSTEM_IDENTITY
RunAsIdentity : <identité> si SPECIFIED_IDENTITY
„ Comme pour les transactions 2 modes
„ Bean managed
„ Container managed
23
24
Principaux bénéfices
Un exemple de Bean
„ L’exemple permet d’illustrer
„ Le développement et le déploiement d’un bean
„ Les mécanismes d’exécution
„ Gestion d’un compte bancaire
„ Composant persistant ¿ utilisation d’un Entity Bean
„ Interface du Bean (vue par le client) ¿ Account.java
„ Application complexe “facile” à écrire
„ gestion des transaction de manière déclarative
„ gestion de la persistance
„ gestion intégré de la sécurité
„ gestion de la répartition
„ La plate-forme et le bus logiciel (middleware) sont
public interface Account extends EJBObject {
public double getBalance()
throws RemoteException;
public void
setBalance(double d)
throws RemoteException;
public String getCustomer()
throws RemoteException;
public void
setCustomer(String c)
throws RemoteException;
}
indépendants des applications
„ Extensibilité du modèle
25
Architecture de l’application
EJB home stub
„ Spécification du bean
„ entity bean “Account”
„ gestion de la persistance gérée par le conteneur
„ Le concepteur doit écrire le code suivant
„ l’interface de gestion du bean - Home interface
EJB Home object
Client
distant
EJB object stub
Ecriture d’un exemple
conteneur
IIOP
IIOP
EJB
Compte
Bancaire
EJB Object
26
„
„
JDBC + XA
JTM
Espace d’adressage du client
Espace d’adressage du conteneur
l’interface d’accès à distance - Remote Interface
„
La classe pour la gestion des clés d’accès aux différents
comptes - Primary Key class (nécessaire uniquement pour
les “entity beans”, encapsule le champ représentant la clé
primaire d’un “entity bean” dans un objet)
„
le code du bean
„
„
„
27
Account.java
„
Oracle ou
Instant DB
RMI ext = extension de RMI afin de propager le contexte de la transaction comme un
paramètre supplémentaire (ou utilisation de IIOP)
AccountHome.java
AccountBeanPK.java
AccountBean.java
le descripteur pour le déploiement
28
EJB Client/Serveur
Processus de développement
Home interface
„ Développement d’un bean
„ Ecrire / compiler le Primary Key class (pour un “entity bean”)
„ Ecrire / compiler home et remote interfaces
„ Ecrire / compiler l’implémentation du bean
„ Construire le descripteur de déploiement (GenDD tool)
„ Construire le fichier d’archive - jar file (packaging)
„ Déploiement et exécution du bean
„ Générer la classe d’interposition pour le conteneur Bull ->
GenIC tool
„ Etablir le fichier de propriété pour l’EJBServer
„ Activer rmiregistry
„ Activer l’EJBServer
„ Exécuter le client
„ Vue client de l’objet EJB Home (AccountHome.java)
public interface AccountHome extends EJBHome {
public Account create
(int accno, String customer, double balance)
throws RemoteException;
public Account findByPrimaryKey (AccountBeanPK pk)
throws RemoteException, FinderException;
public Enumeration findLargeAccounts (double val)
throws RemoteException, FinderException;
}
29
30
Implémentation du Bean (1/2)
Implémentation du Bean (2/2)
class AccountBean implements EntityBean {
protected EntityContext entityContext;
public int
accno
public String
customer;
public double
balance;
public
public
public
public
public
public
public
public
public
void
void
void
void
void
void
void
void
void
ejbActivate() { ... }
ejbPassivate() { ... }
ejbCreate(...) { ... }
ejbLoad() { ... }
ejbStore() { ... }
ejbRemove() { ... }
setEntityContext(...) { ... }
unsetEntityContext() { ... }
ejbPostCreate(...) { ... }
public double getBalance() throws RemoteException
{ return balance;}
public void setBalance(double d) throws
RemoteException
{ balance = balance + d;}
public String getCustomer() throws RemoteException
{ return customer;}
„ les deux upCalls ejbFindByPrimaryKey() et
ejbFindLargeAccounts() sont généré uniquement si le conteneur
gère la persistance
31
public void setCustomer(String c) throws
RemoteException
{ customer = c;}
32
Creation des instances
Home interface
Méthodes de l’application
Remote interface
setBalance()
Create(...)
Begin
newInstance()
Account
Home setEntityContext()
Client
Account
Bean
Client
Account
EJB Object
setBalance()
Account
Bean
ejbCreate(...)
Account Ref
commit
Container
33
Gestion des transactions
34
Ecrire un client EJB
„ Localiser le container du bean
Le conteneur gère les transaction
à l’aide des classes d’interposition
qui sont générée
automatiquement
BullBean.java
„ Si nécessaire, lier le bean au client
preInvoke() {
case TX_REQUIRES_NEW:
clientTransaction=current.suspend();
Current.begin();
„ Utiliser le bean
„ Libérer le bean
postInvoke(){
case TX_REQUIRES_NEW:
Current.commit();
Current.resume(clientTransaction);
public void setBalance(double d){
BullBeanAccount.java
this.preInvoke();
AccountBean.setBalance(d);
this.postInvoke();
35
36
Programmation du client
Programmation d’un bean session
Import tom.ejb.restaurant.*;
Public class EJBClient {
public static void main (String [] argv) {
// récupérer le contexte JNDI
javax.naming.Context initialContext = new
javax.naming.InitialContext();
// récupérer la référence sur la Home interface
RestaurantHome rh = initialContext.lookup(«
RestaurantHome »);
// créer un bean session
Restaurant r = rh.Create(« Burger Heaven »),
// appeler les méthodes du bean
r.order(« cheeseburger »);
// détruire le bean session
r.remove();
}
„ Créer l’interface ‘remote’
„ Doit étendre l’interface ‘javax.ejb.EJBObject’
„ Doit définir les méthodes métiers
„ Créer l’interface ‘home’
„ Doit étendre l’interface ‘javax.ejb.EJBHome’
„ Doit définir les méthodes ‘create’ et ‘remove’
„ Implémentation de la méthode ‘create’
„ Est appelé par le conteneur lors de la création de l’objet
„ Implémentation de l’interface ‘SessionBean’
„ ejbActivate() – appelé quand le bean est activé
„ ejbPassivate()
„ ejbRemove()
„ setSessionContext(SessionContext ctx) - appelé par le
container pour définir le contexte
37
38
Programmation d’un bean session
Programmation d’un bean session
Package tom.ejb.restaurant.server;
Public class OrderBean implements SessionBean {
private transient SessionContext ctx;
private String order;
// un bean peut avoir plusieurs méthodes create
public void ejbCreate() throws Exception {
// initiatialisation des variables d’instances
}
// méthodes métiers
public boolean order(String order) {
this.order = order;
System.out.println(« order received for »+order);
return true;
}
// ces méthodes sont requises par l’interface SessionBean
public void ejbActivate() throws Exception{}
public void ejbPassivate() throws Exception{}
public void ejbDestroy() throws Exception{}
public void setSessionContext(SessionContext ctx) throws
Exception{this.ctx = ctx}
„ Implémenter l’interface EntityBean
„ ejbActivate() – appelé lors de l’activation
„ ejbPassivate()
„ ejbLoad() – appelé lorsque l’état est chargé depuis la base
de donnée
„ ejbStore() – appelé lors de l’opération inverse
„ setEntityContext() – appelé lorsque l’instance a été créée
„ unsetEntityContext() – appelé par le conteneur avant de
supprimer l’instance
„ ejbFind() – permet à un client de rechercher le bean
„ Si nécessaire, implémenter les méthodes create()
„ Créer l’interface remote
„ Doit étendre l’interface ‘javax.ejb.EJBObject’
„ Créer l’interface home
39
40
Programmation d’un bean session
Descripteur de déploiement
Package tom.ejb.entity.server;
Public class ExampleBean implements EntityBean {
private transient EntityContext ctx;
// la méthode ‘finder’ est générée lors du déploiement
// un bean peut avoir plusieurs méthodes ‘create’
public void ejbCreate() throws Exception {
}
// méthodes métiers
public boolean doSomething() {
}
// méthodes requises
public void ejbActivate() throws Exception {}
public void ejbPassivate() throws Exception {}
public void ejbDestroy() throws Exception {}
public void ejbLoad() throws Exception {}
public void ejbStore() throws Exception {}
public void setEntityContext(EntityContext ctx) throws
Exception { this.ctx = ctx }
public void unsetEntityContext() thows Exception { this.ctx =
null }
Account
Deployment
Descriptor
Descripteur de déploiement (addendum)
„ Si la persistance est gérée par le conteneur, le Bean
fournisseur/installateur doit spécifier, dans
l’environnement les propriétés du Bean
le lien avec la base de données
ƒ
ƒ
ƒ
ƒ
ƒ
„
datasource.name jdbc_oracle1
db.TableName
Account
db.Field.accno
accno
db.Field.customer customer
db.Field.balance
balance
la méthode de recherche du bean
ƒ db.Finder.findLargeAccount
AccountHome
Remote interface
Account
Enterprise Bean
AccountBean
BeanHomeName
“AccountHome1”
ControlDescriptors
TX_SUPPORTS
Fichier xml
41
„
Home interface
where balance > ?
43
Env. properties
DataSource name
...
ContainerManagedFields
accno, customer,
balance
42
Téléchargement