Services de Gestion du Cycle de Vie

Transcription

Services de Gestion du Cycle de Vie
Introduction
But : optimisation et contrôle des ressources occupées par un
Session Bean
Services de Gestion
du Cycle de Vie
Instanciation de moins de Bean qu’il y a de client
!!Optimisation de la mémoire et des ressources
!!Optimisation en vitesse des méthodes de création
!!Résistance aux attaques de déni de service
Gaël Thomas
[email protected]
Notion de pool de Bean
!!Ensemble d’instances de Beans en mémoire
!!Instances réutilisées pour servir plusieurs clients
!!Moins de Bean en mémoire que de clients requis à un instant donné
Université Pierre et Marie Curie
Master Informatique
M2 – Spécialité SAR
2008-2009
Introduction
Objet d’interposition EJB (anciennement EJBObject)
!!Proxy pour le bean dans le conteneur
!!Intercepte les requêtes entrantes et sortantes
Serveur WEB
Service de transport : IIOP, RMI ou autre
Cache
2008-2009
Conteneur EJB
Master SAR - M2 MDOC - Introduction
Principe : toute requête est interceptée avant d’arriver au Bean
Service BD : JDBC
Conteneur WEB
Service Transaction: JTA/JTX
Service Nommage : JNDI
JEE
Conteneur EJB
2
Mise en œuvre
Client léger : navigateur Web
HTTP
Client
lourd
Master SAR - M2 MDOC - Introduction
But poursuivi :
!!Partage de bean de session sans état
!!Mise dans zone de swap de bean de session avec état
Base
De
Donnée
3
2008-2009
Master SAR - M2 MDOC - Introduction
4
Mise en œuvre
Mise en œuvre
Objet d’interposition : graphe d’héritage/implantation
Objet d’interposition : recherche et allocation
Service de
résolution de noms
Interface du
Bean
implante
1. Recherche
du bean
implante
implante
Squelette de
l’objet d’interp.
Classe du
Proxy
Service de
Gestion du cycle de vie
3. Allocation
hérite
Classe de
L’objet d’interp.
Proxy
(client)
Classe du
Bean
2. Délégation
par référence
3. Allocation/utilisation
Objet
d’interposition
implante
Généré à la demande
Chez le client
2008-2009
Générés au
Chargement du Bean
Par le conteneur
Master SAR - M2 MDOC - Introduction
5
2008-2009
Mise en œuvre
6
Toute stratégie admissible!
Service de
Gestion du cycle de vie
3. Recherche de Bean
Proxy
Objet
(client) 2. Délég d’interposition 5. Délég
!!Une instance de Bean par client si Statefull
!!Jamais deux invocations en // (pour tout Session Bean)
4. Allocation/
Association
Dans la suite : proposition d’implantation (largement retenue)
Instance du
Bean
!!Utilisation de pool de threads, de pools de Beans
!!Gestion d’un cache
implante
implante
2008-2009
Master SAR - M2 MDOC - Introduction
Implantation d’un service de Gestion de vie
!!Délégation (étape 2) : gestion de la répartition
!!Délégation (étape 5) : gestion du cycle de vie
Client
Conteneur
Mise en œuvre
Objet d’interposition : invocation
1. Invocation
Interface du
Bean
Client
Interface du
Bean
Master SAR - M2 MDOC - Introduction
Conteneur
7
2008-2009
Master SAR - M2 MDOC - Introduction
8
Gestion de la Concurrence
Cycle de vie des Beans sans état
Rappel : gestion de la concurrence dans les intergiciels
Session Bean sans état : un ensemble (pool) de Bean Partagés
!!1 thread par requêtes
!!Pool de thread dynamique (borne maximale) par Bean
!!Un Bean par requête en cours : simplifie la gestion de la concurrence
!!Un unique intercepteur ou n intercepteurs
(choisit une instance + 1 thread pour une requête)
Thread 1
Thread 2
Bean 1
Bean 2
Intercepteur
bean 1
Intercepteur
bean 2
!!Ajustement de la taille du pool en fonction du nombre de requêtes en //
Thread 3
Exemple : pool de deux Beans avec trois clients
Thread oisif
Proxy client 1
connexion
Mémoire centrale
Serveur
Bean 1 pour client 2 (thread 1)
Thread de réception
Proxy client 2
Intercepteur
Bean 2 pour client 3 (thread 2)
req en cours
Clients
Proxy bean 1
2008-2009
Proxy client 3
Proxy bean 2
Master SAR - M2 MDOC - Introduction
9
2008-2009
Cycle de vie des Beans sans état
Master SAR - M2 MDOC - Introduction
Exemple : trois clients, deux beans en mémoire, un bean swappé
Initié par conteneur
(augmentation taille pool)
Proxy bean 1
Initié par bean
(fin invocation de méthode)
Méthode métier
Method Run
Proxy bean 2
Initié par client
(invocation de méthode)
Mémoire centrale
Conteneur
Intercepteur 1
Bean 1
Intercepteur 2
Bean 2
Master SAR - M2 MDOC - Introduction
Zone de swap
Intercepteur 3
Proxy bean 3
2008-2009
10
!!1 Bean unique par client
!!Gestion d’un fichier d’échange (swap)
!!Limite le nombre de Bean présent en mémoire à chaque instant
!!Meilleurs passage à l’échelle en nombre de clients
ejb.destroy() Class.newInstance()
Fin méthode métier
Bean 4 oisif
Session Bean avec état
Does Not Exist
Method Ready
Bean 3 oisif
Cycle de vie des Beans avec état
Cycle de vie d’un Session Bean sans état
Initié par conteneur
(diminution taille pool
ou déchargement unité
déploiement )
Conteneur
11
2008-2009
Bean 3
Master SAR - M2 MDOC - Introduction
12
Cycle de vie des Beans avec état
Cycle de vie des Entity Beans
Cycle de vie d’un Session Bean avec état
Cycle de vie d’un Entity Bean
Invocation client
Timeout conteneur
expiré
Throws system
exception
Does Not Exist
ejb.destroy(),
timeout
Fin méthode métier
Code métier du Bean
2008-2009
Class.newInstance()
Method Ready
Recharge la dernière
version de la base
Recherche de bean
Par client
passivation
Méthode métier,
ejb.destroy(),
timeout
Méthode métier
Inséré dans la base de
données
em.persist()
Conteneur manque
De mémoire
em.refresh()
Attached
Passive
em.merge()
Synchronisation entre copie
et base de données
Timeout conteneur
expiré
Method Run
Created
Bean copié
Detached
Bean sérialisé vers un
autre client
Invocation client
Master SAR - M2 MDOC - Introduction
13
2008-2009
Chargement de classe dans JEE
Master SAR - M2 MDOC - Introduction
14
Chargement de classe dans JEE
Chargement de classe et mise à jour des EJB
Pourquoi définir de nouveaux chargeurs de classes
Un chargeur de classe charge de nouvelles classes
dynamiquement dans la machine virtuelle
Pour décharger et mettre à jour des classes à l’exécution
!! OSGi™, JEE, Web Component, CCM, Corba, RMI…
Pour chercher des classes absentes du CLASSPATH
Évite de charger toutes les classes au démarrage
!! URLClassLoader, AppletClassLoader…
!! Optimise le nombre de classes chargées
Exemple : les classes d’exceptions ne sont chargées que si elles sont utilisées
!! Permet de choisir dynamiquement les classes chargées en fonction du contexte
Exemple : la classe d’encodage des caractères chargées dépend de l’alphabet
utilisé sur la machine locale
!! Permet de construire des serveurs d’applications
Pour modifier le bytecode des classes au chargement
!! Décryptage, décompactage (jar files…)
!! Insertion d’aspects (JAC, JBoss AOP, EasyBeans…)
!! Manipulation direct de bytecode (Javassist, Bcel, asm…)
Pour vérifier le bytecode
!! Signature, vérification de type, sécurité…
2008-2009
Principe des Systèmes Informatiques Avancé
15
2008-2009
Principe des Systèmes Informatiques Avancé
16
Chargement de classe dans JEE
Chargement de classe dans JEE
Un chargeur de classe charge une classe à partir de son nom de façon
unique
!! Gère le chargement d’un ensemble de classes
!! Gère les packages associés
!! Gère l’accès aux ressources (images etc…) associés aux classes
!! ClassLoader.loadClass(String name, boolean resolve)
!! Class.forName(String name, boolean initialise, ClassLoader parent)
Remarques
Un chargeur de classe est une instance d’une classe qui hérite de la classe
java.lang.ClassLoader
!! Une classe possède un chargeur de classes et ne peut pas en changer
!! Une classe est identifiée de manière unique par son nom et son chargeur
!! Une même classe peut être chargée dans plusieurs chargeurs de classes
Un chargeur de classe possède un chargeur parent sauf le chargeur initial (qui
charge rt.jar/core.jar)
Fonctionnement par défaut :
!! loadClass : cherche d’abord dans le chargeur parent
Évite de charger plusieurs fois java.lang.Object
!! findClass : cherche dans le CLASSPATH uniquement (loader applicatif)
Deux méthodes principales :
!! loadClass(String) : cherche une classe parmi les classes déjà chargées
!! findClass(String) : construit une nouvelle classe en mémoire
2008-2009
Principe des Systèmes Informatiques Avancé
Tout chargement est effectué dans le même chargeur de la classe qui
initie le chargement, sauf avec les méthodes
17
2008-2009
Chargement de classe dans JEE
Principe des Systèmes Informatiques Avancé
Chargement de classe dans JEE
Délégation par héritage : délégation vers le parent réussi
Délégation par héritage : délégation vers le parent ratée
findClass(java.io.File.getName())
findClass(maClass.getName())
Chargeur initial
loadClass(java.io.File.getName())
Chargeur initial
<java.io.File, initial>
loadClass(maClass.getName())
Mon chargeur
loadClass(java.io.File.getName())
2008-2009
null
findClass(maClass.getName())
Mon chargeur
<java.io.File, initial>
Principe des Systèmes Informatiques Avancé
18
loadClass(maClass.getName())
19
2008-2009
<maClass, Mon chargeur>
Principe des Systèmes Informatiques Avancé
20
Chargement de classe dans JEE
Chargement de classe dans JEE
Arbre de délégation au démarrage
Délégation par héritage : chargement multiple
findClass
ClassLoader Bootstrap ou initial (natif et intégré à la VM)
!! Charge les classes de démarrage (rt.jar/core.jar/glibj.jar)
!! Pas de vérification de bytecode au chargement (rt.jar distribué avec la JVM)
Chargeur initial
loadClass
findClass
null
loadClass
!! Sa référence est null
null
sun.misc.Launcher$ExtClassLoader (extension) (écrit en Java)
findClass
!! Charge les classes des jarfiles présents dans le répertoire des extensions standards
C1
loadClass("X")
C2
<X, C1>
loadClass("X")
!! Pas de vérification de bytecode au chargement
!! Son parent est le ClassLoader initial
sun.misc.Launcher$AppClassLoader (application ou système) (écrit en Java)
<X, C2>
!! Charge les classes et les jarfiles du CLASSPATH
!! Vérification du bytecode au chargement
<X, C1> et <X, C2> sont deux classes différentes
!! Sa référence est donnée par ClassLoader.getSystemClassLoader()
Peuvent avoir des bytecodes identiques, mais pas nécessairement!
2008-2009
Principe des Systèmes Informatiques Avancé
!! Son parent est le ExtClassLoader
21
2008-2009
Chargement de classe dans JEE
Principe des Systèmes Informatiques Avancé
22
Chargement de classe dans JEE
Un objet n’est libéré que si il n’est plus référencé
! Une classe n’est libérée que si elle n’est plus référencée
Mise en œuvre difficile
Un chargeur de classe possède une table de hash de toutes les classes
qu’il a chargé
! Une classe n’est libérée que si son chargeur est libéré
Une classe peut être libérée pourvu que son chargeur ne soit plus
référencé
•! Un objet référence sa classe
•! La classe référence son chargeur de classe
•! Le chargeur de classe référence toute les classes qu’il a chargé
Pour libérer une classe il faut s’assurer qu’il n’existe plus aucune référence vers une
des instances d’une des classes gérées par le chargeur de classe
Solution proposée par les serveurs d’application JEE
Impossibilité de partager du code et/ou des objets "
! Une classe peut être mise à jour dynamiquement
2008-2009
Principe des Systèmes Informatiques Avancé
23
2008-2009
Principe des Systèmes Informatiques Avancé
24
Chargement de classe dans JEE
Chargement de classe dans JEE
Le chargeur de classe (1/2)
Le chargeur de classe (2/2)
public class Test extends ClassLoader {
private String name;
public Class findClass(String name) throws … {
try {
File file = new File("titi", name + ".class");
InputStream is = new FileInputStream(file);
int length = (int)file.length();
byte b[] = new byte[length];
is.read(b);
// We can modify or verify the bytecode from b
return defineClass(name, b, 0, length);
} catch(Exception e) {
throw new ClassNotFoundException(name);
}
}
public Test(String name) { this.name = name; }
public void finalize() {
System.out.println("Destroy all classes"); }
public String toString() {
return "ClassLoader<" + name + ">"; }
public static void main(String args[]) throws Exception {
(new Test("one")).
loadClass("Titi").getDeclaredMethod("f").invoke(null);
(new Test("two")).
loadClass("Titi").getDeclaredMethod("f").invoke(null);
System.gc(); }
2008-2009
Principe des Systèmes Informatiques Avancé
25
2008-2009
Chargement de classe dans JEE
Principe des Systèmes Informatiques Avancé
26
Chargement de classe dans JEE
La classe chargée par notre nouveau chargeur
La classe chargée explicitement dans notre chargeur
public class Titi {
public static int a = 0;
class Toto {
public Toto() {
System.out.println("-- ClassLoader tree --");
// champs static : 1 par loader
public static void f() {
System.out.println("In f, a is " + a++);
new Toto();
// chargement d’une sous-classe
} }
for(ClassLoader
cur=getClass().getClassLoader();
cur!=null; cur=cur.getParent())
System.out.println("
" + cur);
System.out.println("
primordial");
}
}
2008-2009
Principe des Systèmes Informatiques Avancé
27
2008-2009
Principe des Systèmes Informatiques Avancé
28
Chargement de classe dans JEE
Chargement de classe dans JEE
Chargement de classe et visibilité dans JEE
Chargement de classe dans les serveurs d’application EJB
Pas spécifié, dépend du vendeur!
Services systèmes : visibilités des classes mutualisé
En général : un chargeur de classe par unité de déploiement
(pour approfondir, voir cours OSGi)
Composants applicatifs : visibilité hiérarchique
Service de
Transaction
!!Un composant accède à tous les autres services systèmes
!!Un composant ne peut pas accéder aux autres composants
Service
EJB 2
Service
Déploiement
Unité Depl.
Des EJB
2008-2009
Master SAR - M2 MDOC - Introduction
29
2008-2009
Chargement de classe dans JEE
Service
EJB 2
Service
Déploiement
Service
Nommage
Service
EJB 3
Unité Depl.
Comp. Web
Principe des Systèmes Informatiques Avancé
30
Chargement de classe dans JEE
Problème : échange direct d’objets impossible dans la même VM…
Service de
Transaction
Service
Nommage
Conclusion :
même lors d’un appel local, il faut sérialiser/déserialiser les objets
Service
EJB 3
Remarque : l’échange direct d’objet devrait être proscrit
Unité Depl.
Des EJB
!!Composant A : donne un objet à composant B
!!Composant B : refuse de relâcher la référence vers l’objet B
!!L’unité de déploiement du composant A ne peut pas être libérée par la VM
!!Fuite de mémoire
Unité Depl.
Comp. Web
Échange direct
Film
?
Dans composants Web :
!!Si pas Film.class dans Unité Web ! NoClassDefFoundError
!!Si Film.class dans Unité Web ! <Unité EJB, Film> ! <Unité Web, Film>
! ClassCastException
2008-2009
Master SAR - M2 MDOC - Introduction
31
2008-2009
Master SAR - M2 MDOC - Introduction
32
Chargement de classe dans JEE
Chargement de classe dans JEE
Solution : l’application (.ear)
Service de
Transaction
Service
EJB 2
Comment répartir un .ear par l’exemple :
Service
Déploiement
Application
(.ear)
Service
Nommage
Application
(.ear)
Service
EJB 3
Trois composants X, Y, Z
!!X : composant EJB, utilise Y
!!Y : composant EJB, utilise X
!!Z : composant Web, utilise X
Librairies partagées
Fabriquer trois .ear différents en changeant les rôles
2008-2009
Composants
EJB
Composants
EJB
EJB de l’application
Composants
Web
Composants
Web
Servlets/JSP de l’application
Master SAR - M2 MDOC - Introduction
33
Conclusion
Gestion avancée du cycle de vie
Chaque conteneur fournit sa propre gestion
Problème de chargement de classe ! complexifie la répartition
2008-2009
Master SAR - M2 MDOC - Introduction
35
X
Y
Z
Application 1
EJB
Bibliothèque
Non
Application 2
Bibliothèque
EJB
Non
Application 3
Bibliothèque
Non
Web
2008-2009
Master SAR - M2 MDOC - Introduction
34