Intergiciel

et Construction d’Applications R´parties e
19 janvier 2007 Distribu´ sous licence Creative Commons : e http://creativecommons.org/licenses/by-nc-nd/2.0/fr/deed.fr

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

Introduction a l’intergiciel ` Patrons et canevas pour l’intergiciel Le mod`le de composants Fractal e Les services Web La plate-forme J2EE La plate-forme .NET La plate-forme dynamique de services OSGi

S. Krakowiak 1 S. Krakowiak T. Coupaye 2 , V.Qu´ma8 , L. Seinturier3 , J.-B. Stefani7 e M. Dumas4 , M.-C. Fauvet1 P. D´chamboux 2 e M. Riveill5 , A. Beugnard6 , D. Emsellem5 D. Donsez 1

2

Universit´ Joseph Fourier, Grenoble e France Telecom R&D 3 Universit´ Pierre et Marie Curie et INRIA e 4 Queensland University of Technology, Brisbane (Australie) 5 Universit´ de Nice - Sophia Antipolis e 6´ Ecole Nationale Sup´rieure des T´l´communications de Bretagne e ee 7 INRIA 8 CNRS et projet Sardes (LIG-INRIA)

1

Table des mati`res e
Pr´face e 1 Introduction a l’intergiciel ` 1.1 Pourquoi l’intergiciel ? . . . . . . . . . . . . . . . . 1.2 Quelques classes d’intergiciel . . . . . . . . . . . . 1.3 Un exemple simple d’intergiciel : RPC . . . . . . . 1.3.1 Motivations et besoins . . . . . . . . . . . . 1.3.2 Principes de r´alisation . . . . . . . . . . . e 1.3.3 D´veloppement d’applications avec le RPC e 1.3.4 R´sum´ et conclusions . . . . . . . . . . . . e e 1.4 Probl`mes et d´fis de la conception de l’intergiciel e e 1.4.1 Probl`mes de conception . . . . . . . . . . . e 1.4.2 Quelques principes d’architecture . . . . . . 1.4.3 D´fis de l’intergiciel . . . . . . . . . . . . . e 1.4.4 Plan de l’ouvrage . . . . . . . . . . . . . . . 1.5 Note historique . . . . . . . . . . . . . . . . . . . . Patrons et canevas pour l’intergiciel 2.1 Services et interfaces . . . . . . . . . . . . . . . . 2.1.1 M´canismes d’interaction de base . . . . . e 2.1.2 Interfaces . . . . . . . . . . . . . . . . . . 2.1.3 Contrats et conformit´ . . . . . . . . . . . e 2.2 Patrons architecturaux . . . . . . . . . . . . . . . 2.2.1 Architectures multiniveaux . . . . . . . . 2.2.2 Objets r´partis . . . . . . . . . . . . . . . e 2.3 Patrons pour l’intergiciel a objets r´partis . . . . ` e 2.3.1 Proxy . . . . . . . . . . . . . . . . . . . . 2.3.2 Factory . . . . . . . . . . . . . . . . . . . 2.3.3 Pool . . . . . . . . . . . . . . . . . . . . . 2.3.4 Adapter . . . . . . . . . . . . . . . . . . . 2.3.5 Interceptor . . . . . . . . . . . . . . . . . 2.3.6 Comparaison et combinaison des patrons 2.4 Adaptabilit´ et s´paration des pr´occupations . . e e e 2.4.1 Protocoles a m´ta-objets . . . . . . . . . . ` e 2.4.2 Programmation par aspects . . . . . . . . ix 1 1 6 8 8 9 12 14 15 15 16 18 19 19 21 21 22 24 25 29 29 33 35 35 37 38 39 40 41 42 42 44

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

2

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

ii

` TABLE DES MATIERES

2.5 3

2.4.3 Approches pragmatiques . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.4.4 Comparaison des approches . . . . . . . . . . . . . . . . . . . . . . . 47 Note historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 49 49 51 55 55 56 59 63 63 64 64 66 67 67 71 72 73 77 77 79 79 83 84 85 87 89 90 91 92 94 96 97 99 99 100 101

Le syst`me de composants Fractal e 3.1 Le mod`le Fractal : historique, d´finition e e 3.1.1 Composants Fractal . . . . . . . 3.1.2 Contrˆleurs . . . . . . . . . . . . o 3.2 Plates-formes . . . . . . . . . . . . . . . 3.2.1 Julia . . . . . . . . . . . . . . . . 3.2.2 AOKell . . . . . . . . . . . . . . 3.2.3 Autres plates-formes . . . . . . . 3.3 Fractal ADL . . . . . . . . . . . . . . . 3.3.1 Le langage extensible . . . . . . . 3.3.2 L’usine extensible . . . . . . . . . 3.3.3 Extension de Fractal ADL . . . . 3.4 Biblioth`ques de composants . . . . . . e 3.4.1 Dream . . . . . . . . . . . . . . . 3.4.2 Autres biblioth`ques . . . . . . . e 3.5 Comparaison . . . . . . . . . . . . . . . 3.6 Conclusion . . . . . . . . . . . . . . . .

et principes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

4

Les Services Web 4.1 Services Web : historique, d´finition, et principes . . . . . . . . e 4.2 Mod´lisation de services Web . . . . . . . . . . . . . . . . . . . e 4.2.1 Points de vue dans la mod´lisation de services . . . . . e 4.2.2 Relations entre points de vue . . . . . . . . . . . . . . . 4.3 Description de services Web . . . . . . . . . . . . . . . . . . . . 4.3.1 Description fonctionnelle et structurelle : WSDL . . . . 4.3.2 Description comportementale . . . . . . . . . . . . . . . 4.3.3 Description d’aspects non-fonctionnels : « WS-Policy » 4.4 Implantation de services Web . . . . . . . . . . . . . . . . . . . 4.4.1 SOAP (Simple Object Access Protocol) . . . . . . . . . . 4.4.2 Extensions de SOAP : sp´cifications WS-* . . . . . . . . e 4.4.3 Le d´bat SOAP vs. REST . . . . . . . . . . . . . . . . . e 4.4.4 Exemples d’implantations de SOAP . . . . . . . . . . . 4.4.5 Implantation a base d’un langage sp´cifique : BPEL . . ` e 4.5 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Fouille d’interface, test de conformit´ et adaptation . . . e 4.5.2 Transactions . . . . . . . . . . . . . . . . . . . . . . . . 4.5.3 S´lection dynamique . . . . . . . . . . . . . . . . . . . . e

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

5

La plate-forme J2EE 103 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.1.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.1.2 J2EE, pour quoi faire ? . . . . . . . . . . . . . . . . . . . . . . . . . . 104

` TABLE DES MATIERES

iii

5.2

5.3

5.4

5.5

5.6

5.7 6

5.1.3 Principes d’architecture . . . . . . . . . . . . . . . . . . . . . . . . . 105 5.1.4 Mod`les de programmation et conteneurs . . . . . . . . . . . . . . . 107 e 5.1.5 Les acteurs dans l’environnement J2EE : organisation des rˆles . . . 109 o 5.1.6 R´f´rences utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 ee Approche a composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 ` 5.2.1 Mod`le de composants . . . . . . . . . . . . . . . . . . . . . . . . . . 111 e 5.2.2 Empaquetage de composants et d’applications . . . . . . . . . . . . 112 5.2.3 Principes d’assemblage . . . . . . . . . . . . . . . . . . . . . . . . . . 114 5.2.4 D´ploiement d’application . . . . . . . . . . . . . . . . . . . . . . . . 116 e Applications r´parties et int´gration . . . . . . . . . . . . . . . . . . . . . . 118 e e 5.3.1 Appel de proc´dure a distance . . . . . . . . . . . . . . . . . . . . . 118 e ` 5.3.2 Communication asynchrone : JMS . . . . . . . . . . . . . . . . . . . 119 5.3.3 Connecteurs au standard JCA . . . . . . . . . . . . . . . . . . . . . 119 5.3.4 Connecteurs de base . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Gestion des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.4.1 Notion de transaction . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.4.2 Manipulation des transactions dans un serveur J2EE . . . . . . . . . 122 5.4.3 Mise en relation des composants J2EE avec le syst`me transactionnel 123 e Programmation de l’´tage de pr´sentation Web . . . . . . . . . . . . . . . . 123 e e 5.5.1 Principes d’architecture des composants de pr´sentation Web . . . . 124 e 5.5.2 Servlets : organisation de la pile protocolaire . . . . . . . . . . . . . 124 5.5.3 Servlets HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 5.5.4 JSP : construction de pages HTML dynamiques . . . . . . . . . . . 130 Programmation de l’´tage m´tier . . . . . . . . . . . . . . . . . . . . . . . . 132 e e 5.6.1 Principes d’architecture des composants m´tier . . . . . . . . . . . . 132 e 5.6.2 Composants de session . . . . . . . . . . . . . . . . . . . . . . . . . . 134 5.6.3 Composants r´actifs . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 e 5.6.4 Composants entit´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 e 5.6.5 Gestion des ´v´nements relatifs aux composants m´tier . . . . . . . 139 e e e Conclusion et perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 145 . 145 . 145 . 147 . 147 . 147 . 148 . 150 . 151 . 153 . 155 . 156 . 156 . 163

La plate-forme .NET 6.1 Historique, d´finitions et principes . . . . . . . e 6.1.1 G´n´ralit´ . . . . . . . . . . . . . . . . . e e e 6.1.2 Implantations . . . . . . . . . . . . . . . 6.2 Architecture g´n´rale et concepts . . . . . . . . e e 6.2.1 CLR . . . . . . . . . . . . . . . . . . . . 6.2.2 MSIL et JIT . . . . . . . . . . . . . . . 6.2.3 S´curit´ et d´ploiement des composants e e e 6.2.4 Composants .NET . . . . . . . . . . . . 6.2.5 Assemblage de composants .NET . . . . 6.2.6 Le langage C# . . . . . . . . . . . . . . 6.3 Applications distribu´es . . . . . . . . . . . . . e 6.3.1 Le canevas .NET Remoting . . . . . . . 6.3.2 Les services Web en .NET . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

iv

` TABLE DES MATIERES

6.4

6.5

6.6

6.7 7 La 7.1 7.2 7.3

6.3.3 L’Asynchronisme . . . . . . . . . . . . . . . . Composants et services techniques . . . . . . . . . . . 6.4.1 Acc`s aux donn´es . . . . . . . . . . . . . . . . e e 6.4.2 S´curit´ . . . . . . . . . . . . . . . . . . . . . . e e 6.4.3 Transaction . . . . . . . . . . . . . . . . . . . . Exemple : Mise en œuvre d’une application compl`te . e 6.5.1 Architecture g´n´rale . . . . . . . . . . . . . . e e 6.5.2 Impl´mentation et d´ploiement des services . . e e 6.5.3 Client du service .NET Remoting (3) . . . . . . 6.5.4 Implementation du Service WEB (6) . . . . . 6.5.5 Ecriture du client du Service web . . . . . . . . Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.1 .Net et les langages a objets . . . . . . . . . . . ` 6.6.2 Compositions multi-langages en .Net . . . . . . 6.6.3 Quelques ´l´ments de performances . . . . . . . ee 6.6.4 La plate-forme .NET 2.0 et Indigo : nouveaut´s e Conclusion . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . a ` .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . venir . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

167 168 169 170 173 175 175 176 180 181 182 183 183 185 187 190 192 195 195 196 197 198 201 203 204 205 205 207 210 212 215 215 217 218 222 225 227 229 229 230 230 231

plate-forme dynamique de services OSGi Introduction . . . . . . . . . . . . . . . . . . . . . . . . . Motivations . . . . . . . . . . . . . . . . . . . . . . . . . La plate-forme de d´ploiement et d’ex´cution de services e e 7.3.1 Conditionnement et d´ploiement des applications e 7.3.2 Service . . . . . . . . . . . . . . . . . . . . . . . . 7.4 Programmation des services OSGi . . . . . . . . . . . . 7.4.1 Activation . . . . . . . . . . . . . . . . . . . . . . 7.4.2 Enregistrement de services . . . . . . . . . . . . . 7.4.3 Courtage et liaison de services . . . . . . . . . . 7.4.4 Interception des demandes de liaison . . . . . . . 7.4.5 Ev´nements et observateurs . . . . . . . . . . . . e 7.4.6 Mod`les de composants . . . . . . . . . . . . . . e 7.5 Services Standard . . . . . . . . . . . . . . . . . . . . . . 7.5.1 Http Service . . . . . . . . . . . . . . . . . . . . 7.5.2 Wire Admin . . . . . . . . . . . . . . . . . . . . 7.5.3 UPnP Device Driver . . . . . . . . . . . . . . . . 7.6 Conclusion et Perspectives . . . . . . . . . . . . . . . . . Conclusion

. . . . . . . . Java . OSGi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

8

Annexes A Les Services Web en pratique A.1 Pr´ambule . . . . . . . . . . . e A.2 Beehive et Axis . . . . . . . . A.3 D´ploiement d’un service . . e A.4 D´ploiement d’un client . . . e

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

` TABLE DES MATIERES

v

A.5 Un service avec une op´ration param´tr´e, et un client . . . e e e A.6 Perfect Glass Inc. et l’entrepˆt . . . . . . . . . . . . . . . . o A.6.1 Version 1 : param`tres simples . . . . . . . . . . . . e A.6.2 Version 2 : param`tres complexes . . . . . . . . . . . e A.7 Composition de services . . . . . . . . . . . . . . . . . . . . A.7.1 Composition a base d’op´rations bi-directionnelles . ` e A.7.2 Composition a base d’op´rations uni-directionnelles ` e A.8 Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.8.1 Arborescence de webserv prat 1/ . . . . . . . . . . A.8.2 Code du service TimeNow . . . . . . . . . . . . . . . A.8.3 Code du client ClientTimeNow . . . . . . . . . . . . A.8.4 Code du service Hello . . . . . . . . . . . . . . . . . A.8.5 Code du client ClientHelloInParam . . . . . . . . . A.8.6 Code du programme qDemandeeLocal . . . . . . . . A.8.7 Code du programme EntrepotLocal . . . . . . . . . A.8.8 Code des proc´dures de Saisie . . . . . . . . . . . . e A.8.9 Code du client ClientHelloObjet . . . . . . . . . . A.8.10 Code de la classe Personne . . . . . . . . . . . . . . B .NET en pratique B.1 Les outils a utiliser . . . . . . . . . . . . . . . . . . . ` B.2 Architecture de l’application “Cartes de Visite” . . . B.3 Les objets m´tiers . . . . . . . . . . . . . . . . . . . e B.4 La couche d’acc`s aux donn´es . . . . . . . . . . . . e e B.5 La couche m´tier . . . . . . . . . . . . . . . . . . . . e B.6 Premi`res manipulations en C# . . . . . . . . . . . . e B.6.1 Construire le diagramme UML . . . . . . . . B.6.2 G´n´rer les fichiers de documentation . . . . e e B.6.3 Compilation du code . . . . . . . . . . . . . . B.6.4 Utilisation de la r´flexivit´ . . . . . . . . . . . e e B.6.5 S´rialisation binaire et XML . . . . . . . . . e B.7 La couche de stockage physique des donn´es . . . . . e B.8 Acc`s direct a la base de donn´es par un client l´ger e ` e e B.9 La couche d’acc`s aux donn´es . . . . . . . . . . . . e e B.10 La logique m´tier : AnnuaireService.dll . . . . . . . . e B.11 Utilisation depuis un client local . . . . . . . . . . . B.12 Publications des services . . . . . . . . . . . . . . . . B.12.1 Publication .NET Remoting . . . . . . . . . . B.12.2 Publication WEB Service . . . . . . . . . . . B.13 Utilisation de ces services . . . . . . . . . . . . . . . B.13.1 Par un client lourd . . . . . . . . . . . . . . . B.13.2 Par un client l´ger . . . . . . . . . . . . . . . e B.14 Pour poursuivre le TP . . . . . . . . . . . . . . . . . OSGI en pratique

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

232 233 233 233 234 234 234 235 235 236 237 237 238 239 239 240 241 242

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

245 . 245 . 246 . 247 . 247 . 248 . 249 . 249 . 249 . 251 . 251 . 252 . 254 . 254 . 256 . 257 . 257 . 258 . 258 . 259 . 260 . 260 . 261 . 262 265

C

. 267 267 267 268 268 269 270 274 278 E Joram : un intergiciel de communication asynchrone E. . . . . . . . . . . . 297 . . . . . . 283 . . . . . . . . . . . .4. . . . . . . . . . .6 Communication en mode Publish/Subscribe . . . . . . . . . . . .2 Fiabilit´ et haute disponibilit´ . . . . . . . . . ` E. . . . . . . . . 287 . . .5. . . . .3 Ce que JMS ne dit pas et ne fait pas . . . . . . . . . . . o e . . . . . . . . . . . .5. . E. . . . . 297 . . . . . . . .4 Objets JMS . . . . . . . . . . . . . . . .1 Introduction . . . . e e E. . . . . . . . . . . . . . . . . . . . . . . . . . . E. D. . .1 Introduction . 301 . . . . .0 . . . . . . . . . . . . . . . . . . . . . 305 . . . . . .1. . . . . . . . . . 289 . . . . . . 314 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 . o e D. . . . . . . . .1 Principes directeurs et choix de conception . . .1 Pr´liminaires . .3 Architecture de Joram . . . . . . . . . . . . . . . .4 Joram : fonctions avanc´es .4 Architecture distribu´e . . . . ee E. . 297 . . . . . . .2. . . . . . . . .1. . . . . 310 . . . . . . . . . . . . . . . . .1. . .1. . . . . . . . . . . 303 . . . . . e E. ee Speedo : un syst`me de gestion de la persistance e F. . . . . . . . . . . . . 310 . . E. . . . E. . . . . . . . .2. . .2 Architecture logique . . . . .2. . . 293 . . . . . . . . . . .4. . . .1 Logiciels n´cessaires . . . . . . E. . . . . . . . . 289 . .3 Test de l’installation . . . . . .7 R´f´rences . . . . . . . . . . . . . 308 . . 308 . . . . . . . . . . . . . . . . . e E. . . . . . . .2 Principales fonctions de Speedo . . . .5 Joram : une plate-forme JMS configurable . . . . . . . .4. . . . . . . . . . . o e D. . . . . . . . . . . . . . 287 . .1. .1. . .1 Les intergiciels a messages (MOM) . . . . .1 Qu’est-ce que Speedo ? . . . . . E. . . .3 Messages . . .2. .2. . . . . . . . . . . . . . . . .2 Contrˆleur objet fortement coupl´ . . . . . . . . .4 S´curit´ . . . . . . . . . . . . . . .3 Connectivit´ ´largie . . . . . . . . . . . . . . . .vi ` TABLE DES MATIERES D AOKell : une r´alisation r´flexive du mod`le Fractal e e e D.2. 288 . . . . . . . . . . . e E. . . . 283 . E. . . . . . 301 . . 293 . . . . . . . .1. . . . . .3 Contrˆleur de journalisation orient´ composant . . . . . . . . . . . . . . . . . . . . . . . . . . . . E. . . ` E. . . . . . .4. . .6 Conclusion . . . . . . . . . . . . . . . . . .3. . . . . F. . . . . . . . . .3 Architecture centralis´e . . . . . . . . . . . . . . . 284 .1. . . . . . . . . . . . D. . . . . . . . . . . . . . . .1 R´partition de charge . E. . . . . . . . . . . . . . . . e E.3. . ` E. . E. . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e E. . . . . . .2 Le mod`le de programmation JMS . . . . .3. . . 303 . .1 Les agents distribu´s . . . . . .4 Joram : une mise en œuvre d’un service de messagerie JMS E. E. . . . . . .1 Les abstractions de JMS . . . . . . .1 Contrˆleur objet faiblement coupl´ . . . . . .1. . . . . . . . . . . . . . . . . . .1. . . . . . . . . e E. . . . . . . . . . . . . . .5 Joram : bases technologiques . . . . . 305 . . . . . . . . . . . . . . .7 JMS par l’exemple . . .3 Restrictions actuelles . E.2. E. . . . . . . . . . . . . . . . . . . e E. . .2 JMS (Java Messaging Service) . . . . . .2 Joram : une plate-forme JMS a base d’agents . . . . . . . 317 317 317 318 320 F . . . . . 283 . . . . . . . .3. E. .2. . . . . . . . . 293 . . . . . . . . . . . . . . . . o e D. . . . . E. . . . . . . . e D. . . . . 308 . . . . . . F. . . . . . . . . . . .3. . . . . . . . . . . . . . . . . . F.2. . . . . . . . . . . . . . . e D.2 Principe de fonctionnement . . . . . . 290 . .2 Contrˆleur de journalisation orient´ objet . . . . .2 AOKell 2. . . . .5 Communication en mode Point a point . . . . . . . . . 291 .

.5 R´sultat complexe . . . . . . . . . . . . . .6. . . . . . F. . . . . . . . . . . . . . . . . . . . . . . . e F. . . . e F. . . . . . F. . . . . . . . . . . . . . . . . . . . . .` TABLE DES MATIERES vii F. . . . .6. . . . . .3 Chaine de production de programme . . . . . . . . . . .3 Projection d’attributs simples . . . . . . . . . . . . . . . .1 Classes et objets persistants . . . . . . . . . . . . . . .1 Phases de la production de programme . . . . . . . . . . . . e F. . . . . . . . . . . . . . . . . F. e F.4. . . . . . . . . . . . . . . . . . .6 Relations et coh´rence . .3. . . . . . .7 Fonctions avanc´es . . . . . . .2 Requˆtes pr´definies . . . . .7. .3 Int´gration JCA / JTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Utilisation de Ant . . . .7. . . . . . . . . . . . . . .4 Organisation du cours Speedo . . . . . . . . . . . . . . . . . . . . . . F. . . . . . . . . . . . . . . . . . . . . . . . . . . e F. . . . . . . . . . . . . . . . e F. e F. . . . . . . .5. .4 Cardinalit´ du r´sultat . .4. . . . . . . . . .5 Projection de relations multi-valu´es . . . . . . . .1 Projection des identifiants d’objet persistant F. . . .1 Aucune int´gration . . .1 Introduction . . . . F. . . . . . . . . . . . . . . . . . . F. . . . . . . . . . . . . . .4 Programmation d’objets Java persistants . . . e F. . .4. . e F. . . . . . . . . . . . . . . . . . . .2 Projection de la classe .6 Projection de liens d’h´ritage . . . . . . . . . .4. . . . . . . . . . . .6. .4. . .1. . . . . .6. . . . . . . . . . . . . . . . . . . . . . . . .1 Ex´cuter un programme utilisant Speedo . . . . . . . . .3 Filtre de requˆte . .6 Agr´gats et group by . . . G Infrastructure M2M pour la gestion de l’´nergie e Glossaire Bibliographie . . . . . e F. . . . . . . . . e F.5.5. . .6. . . F. F. .2. . . . . . . . . . . . . 320 320 321 322 323 323 324 326 326 329 332 335 337 338 339 342 342 345 346 349 350 352 353 353 355 356 356 359 362 366 366 366 367 367 369 371 373 .4. F. . . . . .4. . . . . . . . . . . . . . . . . . .2.7 Int´gration dans J2EE . . . . . . . . . . . F. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Projection vers une base de donn´es relationnelle . . . . . . . . . . . . . . . .6. . . . . . . . . .5 Requˆtes ensemblistes . . .2 Int´gration JTA . . e F. . . e e F. . . . . . F. . . . . . . . .4 Rendre un objet persistant . . . . . . . . . . . . e F. . . . . . . . . .3 Identifiants d’objet persistant . . . . . . . . .2 D´clinaison Speedo des principes JDO . . . .2 Utiliser le syst`me de persistance JDO . . . e F. . . . . . . . . . . . . . .5. . . . . .2 Gestion d’objets persistants avec JDO : les principes F. . .7. . . . . . . .5 D´truire un objet persistant . . . . . . . . . . . . . . . . . . . .5.5. . . . . . . . . e e F. . . . . . . . . . . . . . . . . . . . e F. . . .4 Projection de relations mono-valu´es . . . . .8 Conclusion et perspectives . . . . . . . . . . . . . . . . . . . . . . . . e F.3. . . . . . . . . . . . . . . . . . . . . . . . . . . e F. . e F. .

viii ` TABLE DES MATIERES .

composition. un rˆle analogue a celui d’un syst`me d’exploitation pour les o ` e applications centralis´es : il dissimule la complexit´ de l’infrastructure sous-jacente. En outre. les utilisateurs d’applications. Certaines illustrent la mise en œuvre concr`te des syst`mes e e e . est consacr´e a l’intergiciel. et de nombreux atee ` liers sp´cialis´s sont fr´quemment cr´´s sur des sujets d’actualit´. il fournit un ensemble e e de services communs. qui tient une place importante. Cette pr´sentation s’attache aux aspects are e chitecturaux : on n’y trouvera pas les d´tails de la derni`re version de tel ou tel produit. mais pr´sentent une certaine stabilit´. Le cycle de cette ´volution est rapide : chaque ann´e apporte une transformation e e significative du paysage des normes et des produits de l’intergiciel. une part substantielle de l’oue e vrage est constitu´e d’annexes. Middleware. Le domaine de la composition d’ape e ` plications. De nouveaux doe maines s’ouvrent. est pr´sent´ au travers de l’´tude d’un mod`le e e e e innovant issu de la recherche. il e e pr´sente une interface commode aux d´veloppeurs d’applications. les syst`mes embarqu´s. e e Pour faciliter la compr´hension des aspects communs. Malgr´ la rapidit´ de ces changements. pour celles-ci. sous la ` e e forme d’´tudes de cas des principaux standards du domaine et de leur mise en œuvre e pour la construction d’application r´parties. e e e ee e Le domaine de l’intergiciel est en ´volution permanente. Les consortiums et organisations diverses qui d´veloppent et promeuvent l’usage du logiciel libre tiennent e une place importante dans le monde de l’intergiciel. L’intergiciel joue e e aujourd’hui. ` e e e Cet ouvrage vise a pr´senter une vue d’ensemble des syst`mes intergiciels. a pris une place e centrale dans le d´veloppement des applications informatiques r´parties. Enfin. un chapitre initial pr´sente quelques principes e e g´n´raux de construction applicables a l’intergiciel. comme l’informatique ubiquitaire.Pr´face e Le domaine de l’intergiciel (middleware). Les acteurs de l’intergiciel sont nombreux et divers : les organismes de normalisation. il est possible de d´gager quelques principes are e e chitecturaux qui guident la conception et la construction de l’intergiciel et des applications qui l’utilisent. conditionnement e et d´ploiement des applications. apparu dans les ann´es 1990. chaque chapitre consacr´ a un stane e` dard ou a une plate-forme met en ´vidence le traitement sp´cifique de chacun de ces as` e e pects : architecture d’ensemble du syst`me. les syst`mes e e e mobiles. les produits doivent s’adapter et s’am´liorer. Ces principes sont eux-mˆmes d´velopp´s et enrichis grˆce aux r´sultats de e e e a e la recherche et a l’exp´rience acquise. les industriels du logiciel et des services. programmation. Pour illustrer des aspects techniques plus sp´cialis´s. Pour r´pondre a des besoins e e ` de plus en plus exigeants. Une conf´rence scientifique e e e e annuelle ACM-IFIP-Usenix. dont les r´sultats sont rapidement int´gr´s. ce domaine est l’objet d’une recherche active.

x ´ PREFACE pr´sent´s. e e e Chacun de ces aspects justifierait une ´tude de mˆme ampleur que celle ici pr´sent´e. aux concepteurs. e La forme et le contenu de ces ´coles se sont naturellement adapt´s pour suivre l’´volution e e e du domaine. et ObjectWeb [ObjectWeb 1999]. Autrans 1998. Scalagent Distributed Technologies. L’ouvrage ne couvre pas toutes les phases du cycle de vie des applications r´parties. e e e Nous tenons a remercier les organismes qui nous ont soutenus pour l’organisation ` d’ICAR 2006 : l’IMAG (Informatique et Math´matiques Appliqu´es de Grenoble). ` e e d´veloppeurs et utilisateurs d’applications r´parties. sans ˆtre requise. La e e pratique du langage Java. Les organisateurs d’ICAR 2006 No¨l De Palma (Institut National Polytechnique de Grenoble) e Sacha Krakowiak (Universit´ Joseph Fourier) e Jacques Mossi`re (Institut National Polytechnique de Grenoble) e . e Ce livre est issu d’une s´rie d’´coles d’´t´ organis´es sur le th`me de l’intergiciel et de la e e ee e e construction d’applications r´parties (Saint-Malo 1996. e L’accent est mis sur les m´thodes et les outils pour la construction de ces applications. Nous remercions ´galement les organismes d’appartenance e des organisateurs et intervenants d’ICAR 2006 : France Telecom R&D. Institut National Polytechnique de Grenoble. e L’ouvrage a b´n´fici´ d’interactions avec de nombreux coll`gues dont la liste serait e e e e trop longue pour n’oublier personne. Universit´ de Nice–Sophia e e Antipolis. Queensland University of Technology (Australie). Nous supposons que le lecteur a des connaissances g´n´rales de base dans e e le domaine des applications informatiques. Dani`le Herzog a assur´ avec efficacit´ le soutien logistique e e e de cette ´cole. 1999. D’autres donnent un aper¸u de syst`mes ou d’applications qui n’ont pas trouv´ e e c e e leur place dans le corps de l’ouvrage. Lille). Les e e annexes sont notamment inspir´es d’ateliers organis´s au cours de cette ´cole. Depuis 2003. facilite la lecture des exemples. Mentionnons n´anmoins. Daniel Hagimont (IRIT. INRIA. Toulouse) et Philippe Merle e e e (INRIA et LIFL. Ce livre reprend largement le contenu de l’´cole ICAR 2006. parmi les intervenants et e les organisateurs d’´coles pr´c´dentes. Sans avoir directement particip´ a la r´daction. 2003 et 2006). e e e e L’ouvrage s’adresse a toute personne int´ress´e par l’intergiciel. e Les phases ant´rieure (conception) et post´rieure (administration) ne sont pas abord´es. des syst`mes d’exploitation et des r´seaux. Alan Schmitt et Christophe Taton sont e` e intervenus dans ICAR 2006. ainsi qu’aux ´tudiants en informae e e tique (niveau Master ou ´cole d’ing´nieurs) et aux chercheurs d´sirant aborder le domaine e e e de l’intergiciel. l’´cole a pris le nom d’ICAR (Intergiciel et Construction d’Ape plications R´parties). consortium d´veloppant des syst`mes o e e intergiciels en logiciel libre. Universit´ Joseph Fourier. unit´ de recherche e de Rhˆne-Alpes). l’INe e RIA (Institut National de Recherche en Informatique et Automatique.

Ce processus d’int´gration e e e doit tenir compte des applications dites patrimoniales (en anglais : legacy). l’application doit ˆtre reprise telle quelle e e e car le coˆ t de sa r´´criture serait prohibitif. permet d’introduire les notions de base relatives aux syst`mes ine ` e tergiciels et les probl`mes que pose leur conception. qui ont ´t´ ee d´velopp´es avant l’av´nement des standards ouverts actuels. Les e br`ves ´tudes de cas qui suivent illustrent quelques situations typiques. e e e Une application patrimoniale ne peut ˆtre utilis´e qu’` travers une interface sp´cifi´e. Les entreprises et les organisations e construisent maintenant des syst`mes d’information globaux int´grant des applications juse e qu’ici ind´pendantes. Krakowiak (version du 19 janvier 2007 . a ´t´ un rˆve des e e ` e e ee ee e cr´ateurs de l’Internet. ainsi que des d´veloppements nouveaux. e ` e sur le mod`le de l’acc`s a l’´nergie ´lectrique ou aux t´l´comunications. u ee Le principe des solutions actuelles est d’adopter une norme commune. Transe ee e e former l’acc`s a l’information et aux ressources informatiques en un service omnipr´sent. Le chapitre se termine par une note e historique r´sumant les grandes ´tapes de l’´volution de l’intergiciel. e Dans leurs efforts pour relever ces d´fis. e e a e e et ne peut ˆtre modifi´e. e e et les principales classes d’intergiciel. les besoins auxquels elles r´pondent.org/licenses/by-nc-nd/ 2. ces objectifs e e ee e font encore partie aujourd’hui des d´fis pour le long terme. et mettent en e e ´vidence les principaux probl`mes et les solutions propos´es. Bien que des progr`s significatifs aient ´t´ enregistr´s.1 Pourquoi l’intergiciel ? Faire passer la production de logiciel a un stade industriel grˆce au d´veloppement de ` a e composants r´utilisables a ´t´ un des premiers objectifs identifi´s du g´nie logiciel. celui de l’appel de proc´dure a distance. non li´e a un e ` .10:31) Licence Creative Commons (http://creativecommons.0/fr/deed. les concepteurs et les r´alisateurs d’applications e e informatiques rencontrent des probl`mes plus concrets dans leur pratique quotidienne.Intergiciel et Construction d’Applications R´parties e c 2006 S.fr) Chapitre 1 Introduction ` l’intergiciel a Ce chapitre pr´sente les fonctions de l’intergiciel. L’analyse d’un exemple simple. La plupart du temps. e e e Exemple 1 : r´utiliser le logiciel patrimonial. e e e 1. et n´cessitent des environnements sp´cifiques. utilisent des outils « proe e e pri´taires ».

Un nombre croissant de syst`mes prend la e e e forme d’une collection d’´quipements divers (capteurs ou effecteurs) connect´s entre eux e e par un r´seau. ´galement appel´ courtier (en anglais broker ). Chacun de ces dispositifs remplit une fonction locale d’interaction avec le e monde ext´rieur. il faut d´velopper une enveloppe (en anglais wrapper ). Les syst`mes r´alisant ces tˆches s’appellent e ` e e e e a syst`mes de m´diation 1 . pour interconnecter diff´rentes applications. syst`mes de t´l´communications. Les proe tocoles sont r´alis´s par une couche logicielle qui fonctionne comme un bus d’´changes e e e entre applications. ` application patrimoniale interface propriétaire interface standard enveloppe (wrapper) application patrimoniale enveloppe (wrapper) composant nouveau interface standard “bus d’échange” inter-applications enveloppe (wrapper) composant nouveau application patrimoniale Figure 1. et interagit a distance avec d’autres capteurs ou effecteurs. L’ex´cution de ` ee e ces tˆches n´cessite l’acc`s a distance au mat´riel. Exemple 2 : syst`mes de m´diation. nous l’utilisons ici e e e . La norme sp´cifie des e e interfaces et des protocoles d’´change pour la communication entre applications. la collecte d’informations pour la facturation. a e e ` e e e et la r´action a des ´v´nements critiques. en utilisant les e protocoles normalis´s du courtier. les files de e messages. Pour int´grer une applie e e cation patrimoniale. la maintenance a distance.1 – Int´gration d’applications patrimoniales e Une application patrimoniale ainsi « envelopp´e » peut maintenant ˆtre int´gr´e avec e e e e d’autres applications du mˆme type et avec des composants nouveaux. les syst`mes a publication et abonnement (en anglais publish-subscribe). le t´l´chargement et l’installation de nouveaux services. On en e ` trouvera des exemples dans ce livre. Des exemples de courtiers sont CORBA. Des applie ` cations construites sur ce mod`le se rencontrent dans divers domaines : r´seaux d’ordinae e teurs. ` INTRODUCTION A L’INTERGICIEL langage particulier. le e traitement des signaux d’alarme. ´quipements d’alimentation ´lectrique permanente. l’´laboration de statistiques d’utilisation. la collecte et l’agr´gation de donn´es.2 CHAPITRE 1. e e e La gestion de tels syst`mes comporte des tˆches telles que la mesure continue des e a performances. e ee e e syst`mes d´centralis´s de production. l’enregistrement d’un journal. c’est-`-dire une e a couche logicielle qui fait le pont entre l’interface originelle de l’application et une nouvelle interface conforme a la norme choisie. e e 1 Ce terme a en fait un sens plus g´n´ral dans le domaine de la gestion de donn´es .

e e e e e Cette architecture repose sur une infrastructure fournissant un environnement de d´pe loiement et d’ex´cution pour les composants ainsi qu’un ensemble de services communs tels e que la gestion de transactions et la s´curit´. dans laquelle une application est compos´e de trois couches : entre trois ´tages (3-tier e e l’´tage de pr´sentation. e Un syst`me de communication adapt´ a ces exigences est un bus a messages. POURQUOI L’INTERGICIEL ? 3 administrateur administrateur routeur équipements en réseau Figure 1.2 – Surveillance et commande d’´quipements en r´seau e e L’infrastructure interne de communication d’un syst`me de m´diation doit r´aliser la e e e collecte de donn´es et leur acheminement depuis ou vers les capteurs et effecteurs. comme la d´tection e e e e e d’un signal d’alarme ou le franchissement d’un seuil critique par une grandeur observ´e. En outre. ` e e Exemple 3 : architectures a composants. les aspects propres a l’application sont organis´s comme un ensemble e e ` e de « composants ». unit´s de construction pouvant ˆtre d´ploy´es ind´pendamment. La communicae e tion est asynchrone et peut mettre en jeu un nombre variable de participants. une application pour un domaine e e dans le sens restreint indiqu´ e 2 La traduction correcte de tier est « ´tage » ou « niveau ». ou les « abonn´s » e e e e a un sujet sp´cifi´.1. Les destinataires d’un message peuvent ˆtre les membres d’un groupe pr´d´fini.2). et l’´tage de gestion de e e e bases de donn´es. Dans cet e e ´tage interm´diaire. se trouve un ´tage de e e e e traitement (business logic) qui r´alise les fonctions sp´cifiques de l’application. responsable de l’acc`s aux donn´es permanentes. La e communication est souvent d´clench´e par un ´v´nement externe. Les architectures actuelles a base de compo` sants logiciels reposent sur la s´paration des fonctions et sur des interfaces standard bien e d´finies. Le d´veloppement d’applications par ` e composition de « briques »logicielles s’est r´v´l´ une tˆche beaucoup plus ardue qu’on e ee a ne l’imaginait initialement [McIlroy 1968]. c’est-`-dire e e` ` a un canal commun auquel sont raccord´es les diverses entit´s (Figure 1. e . Une organisation r´pandue pour les applications d’entreprise est l’architecture a e e ` 2 ).1. responsable de l’interface avec le client.

etc. La fonction e oe ee du mandataire est d’adapter les caract´ristiques du flot de communication depuis ou vers e ` le client aux capacit´s de son point d’acc`s et aux conditions courantes du r´seau. e e e composants d’application interface des services spécifiques clients services spécifiques interface d’appel clients services communs (ex : transactions) interface des services communs base de données base de données Figure 1. ` INTRODUCTION A L’INTERGICIEL particulier (par exemple t´l´communications. de capacit´s de visualisation. avionique. de capacit´s ee e e locales de traitement. et on peut int´grer du code patrimonial dans des « enveloppes » qui e e exportent ces interfaces .). – elle facilite le passage a grande ´chelle. les capacit´s de traitement de ces deux e e couches peuvent ˆtre s´par´ment augment´es pour faire face a un accroissement de e e e e ` la charge. Des exemples de sp´cifications pour de tels environnements sont les Enterprise Javae Beans (EJB) et la plate-forme . sont tr`s importants. A e e e . etc. Les utilisateurs acc`dent e aux applications sur l’Internet via des ´quipements dont les caract´ristiques et les perfore e mances couvrent un spectre de plus en plus large. appel´e mandataire (en eee e anglais proxy) entre les clients et les serveurs. Un mandataire diff´rent peut ˆtre r´alis´ e e e e pour chaque classe de point d’acc`s cˆt´ client (t´l´phone.) peut utiliser une ee biblioth`que de composants d´velopp´s pour ce domaine.). – elle am´liore la portabilit´ et l’interop´rabilit´ en d´finissant des interfaces standard .4 CHAPITRE 1. ` e etc. On ne peut pas e e attendre d’un serveur qu’il adapte les services qu’il fournit aux capacit´s locales de chaque e point d’acc`s. finance. ´cran noir et blanc. un t´l´phone portable et un assistant personnel. e Exemple 4 : adaptation de clients par des mandataires. Entre un PC de haut de gamme. les ´carts de bande passante. les aspects g´n´riques et l’intendance ´tant pris en charge par les ` e e e services communs . examin´s dans la suite de ce livre.NET. en s´parant la couche d’application de la ` e e couche de gestion de bases de donn´es . On ne peut pas non plus imposer un format uniforme aux clients.3 – Un environnement pour applications a base de composants ` Cette organisation a les avantages suivants : – elle permet aux ´quipes de d´veloppement de se concentrer sur les probl`mes propres e e e a l’application. car cela e reviendrait a les aligner sur le niveau de service le plus bas (texte seul. assistant. e e e e e ainsi on peut r´utiliser un composant sur tout syst`me fournissant les interfaces e e appropri´es. La solution pr´f´r´e est d’interposer une couche d’adaptation.

sch´matis´e sur la Figure 1. permettre de r´utiliser e a e l’exp´rience et parfois le code. Les mandataires peuvent ˆtre h´berg´s sur des ´quipements d´di´s (Figure 1. qui e e r´alisent les fonctions suivantes : e 1.1. et de haut niveau aux ´quipes de e e d´veloppement et d’int´gration. Un exemple e e de mise en œuvre de l’adaptation par mandataires est d´crit dans [Fox et al. le pore e e tage et l’interop´rabilit´ des applications . le passage de la couleur aux niveaux de gris. e e e assurer l’ind´pendance vis-`-vis des langages et des plates-formes. fournir un ensemble de services communs r´alisant des fonctions d’int´rˆt g´n´ral. e e e e install´s au-dessus des syst`mes d’exploitation et des protocoles de communication. e e Cette couche interm´diaire de logiciel. e e 4. En cons´quence. e ee e e pour ´viter la duplication des efforts et faciliter la coop´ration entre applications. Clients Proxy l’Internet Serveurs Figure 1. cacher l’h´t´rogeneit´ des composants mat´riels. ou sur des e e e e e e serveurs communs. la r´utilisation. normalis´es. e e e e` e L’utilisation de l’intergiciel pr´sente plusieurs avantages dont la plupart r´sultent de e e la capacit´ d’abstraction qu’il procure : cacher les d´tails des m´canismes de bas niveau.5. des applications utilisent des logiciels de niveau interm´diaire. faciliter l’´volution des applications. la r´duction de la qualit´ des images pour prendre en compte e e e des capacit´s r´duites d’affichage. e e ` e e 2.4 – Adaptation des communications aux ressources des clients par des mandataires Des exemples d’adaptation sont la compression des donn´es pour r´agir a des variations e e ` de bande passante du r´seau. cacher la r´partition. le mandataire utilise ses propres ressources de stockage et de traitement. e Les quatre ´tudes de cas qui pr´c`dent ont une caract´ristique commune : dans chacun e e e e des syst`mes pr´sent´s.1. est d´sign´e par e e e e e le terme g´n´rique d’intergiciel (en anglais middleware). Un intergiciel peut ˆtre a usage e e e ` g´n´ral ou d´di´ a une classe particuli`re d’applications.4). 1998]. on e e e . pour faciliter la construction. POURQUOI L’INTERGICIEL ? 5 cet effet. c’est-`-dire le fait qu’une application est constitu´e de parties e a e interconnect´es s’ex´cutant a des emplacements g´ographiquement r´partis . e e 3. des syst`mes d’exploitation et des ee e e e protocoles de communication utilis´s par les diff´rentes parties d’une application . fournir des interfaces uniformes.

on peut assurer des bornes pour des facteurs de performance tels que la gigue ou la latence. e 1. tout ou partie des entit´s communicantes e e peuvent changer de place. et la configuration du r´seau ne change e ` e pas (ou bien ces changements sont des op´rations peu fr´quentes.6 CHAPITRE 1.5 – Organisation de l’intergiciel peut esp´rer r´duire le coˆ t et la dur´e de d´veloppement des applications (l’effort ´tant e e u e e e concentr´ sur les probl`mes sp´cifiques et non sur l’intendance). Dans un syst`me de communication fixe. e e e 1. y come pris pendant le d´roulement des applications. e e e ` Dans un syst`me de communication mobile. ces bornes ne peuvent e ˆtre garanties. prenant en e e e e e compte les propri´t´s de l’infrastructure de communication. l’architecture d’ensemble des ee applications. ` INTRODUCTION A L’INTERGICIEL Application API standard API standard Application API standard Application Intergiciel API spécifique Système d’exploitation API spécifique Système d’exploitation Système de communication API spécifique Système d’exploitation Figure 1.2 Quelques classes d’intergiciel Les syst`mes intergiciels peuvent ˆtre class´s selon diff´rents crit`res. Un syst`me de commue e nication est dit synchrone si on peut garantir une borne sup´rieure pour le temps e . e e e Un inconv´nient potentiel est la perte de performances li´e a la travers´e de couches e e ` e suppl´mentaires de logiciel. L’utilisation de techniques intergicielles implique par ailleurs e de pr´voir la formation des ´quipes de d´veloppement. Dans certains syst`mes de communicae e e e tion. et se connecter ou se d´connecter dynamiquement. Caract´ristiques pr´visibles ou impr´visibles. les interfaces fournies. e 2. N´anmoins. L’infrastructure de communication souse jacente a un intergiciel est caract´ris´e par plusieurs propri´t´s qui permettent une ` e e ee premi`re classification. pr´vues a l’avance). les entit´s come e municantes r´sident a des emplacements fixes. Caract´ristiques de la communication. car les facteurs de performance d´pendent de la charge de dispositifs e e partag´s tels que les routeurs ou les voies de transmission. Topologie fixe ou variable. et am´liorer leur portae e e e bilit´ et leur interop´rabilit´. dans beaucoup de situations pratiques.

Les applications g´r´es par les syst`mes intergiciel sont e e ee e habituellement d´compos´es en parties. e ee Des exemples. en utilisant la r´servation pr´alable de e e e ressources. les composants et e les agents. e e e qui se distinguent par leur d´finition. ou diffuseur (´metteur d’information) et abonn´ (r´cepteur d’information). e ou omnipr´sents [Weiser 1993]. leurs propri´t´s.2. Ces participants peuvent avoir des rˆles pr´d´finis e o e e tels que client (demandeur de service) et serveur (fournisseur de service). Ces appareils utilisent la communication sans fil. Architecture et interfaces. Celles-ci peuvent prendre diff´rentes formes. ou P2P). C’est le cas de syst`mes de communication qui comprennent e e des appareils mobiles (dits aussi nomades) tels que les t´l´phones mobiles ou les asee sistants personnels. e L’impr´visibilit´ des performances du syst`me de communication rend difficile la tˆche e e e a de garantir aux applications des niveaux de qualit´ sp´cifi´s L’adaptabilit´. si cette borne ne peut ˆtre ´tablie. pr´visible. illustr´s dans la suite de ce livre. est la qualit´ e` e ` e principale requise de l’intergiciel dans de telles situations. Interfaces de fourniture de service. e e e 3 . selon les besoins . appartiennent a cette cat´gorie. la classe (variable. – Variable. comme les ape e e plications critiques en temps r´el. une telle organisation est dite pair a pair (en o e ` anglais peer to peer. QUELQUES CLASSES D’INTERGICIEL 7 de transmission d’un message .1. chacun pouvant indiff´remment assumer e e un rˆle diff´rent. Plusieurs crit`res permettent de caract´riser l’architecture e e d’ensemble d’un syst`me intergiciel. qui est sujette a ` des variations impr´visibles de performances. et leur mode d’interaction. le syst`me est dit e e e asynchrone 3 . pr´visible) est vide. e – Fixe. et ont ici un sens diff´rent de celui vu e e Dans un syst`me r´parti. le terme asynchrone indique g´n´ralement en outre qu’on ne peut fixer de e e e e borne sup´rieure au rapport des vitesses de calcul sur les diff´rents sites (cela est une cons´quence du e e e caract`re impr´visible de la charge sur les processeurs partag´s). Les participants e e e peuvent aussi se trouver au mˆme niveau. e e ` e Avec les techniques actuelles de communication. Les environnements dits ubiquitaires. 2. aussi bien pour les r´seaux locaux e e que pour les r´seaux a grande distance (comme l’Internet). il n’est pas possible de e lui garantir une borne sup´rieure. Un syst`me intergiciel g`re l’activit´ d’un ensemble de participants (utilisao e e e teurs ou syst`mes autonomes). e – Fixe. impr´visible. Bien que l’on puisse e ` souvent estimer une moyenne pour la dur´e de transmission. Rˆles. 3. Unit´s de d´composition. c’est-`-dire e e e e a la capacit´ a r´agir a des variations des performances des communications. en sont les objets. e 1. C’est le cas le plus courant. Ces caract´ristiques se combinent comme suit. permettant la connexion et la d´connexion dynae e mique de dispositifs tr`s vari´s. Les primitives de communication fournies par un syst`me intergiciel peuvent suivre un sch´ma synchrone or asynchrone (ces e e termes sont malheureusement surcharg´s. Cette combinaison s’applique aux environnements sp´cialement e e d´velopp´s pour des applications ayant des contraintes particuli`res. impr´visible. Le protocole de communication garantit alors une e borne sup´rieure pour le temps de transfert.

ou patrons. et quelques constructions communes. Nous ne visons pas a couvrir ` ` tous les d´tails de ce m´canisme. L’appel de proc´dure ou de m´thode e e e a distance est un exemple de communication synchrone . un processus client envoie un message de requˆte a un serveur distant et se e ` bloque en attendant la r´ponse. Dans le sch´ma syne e e e chrone.8 CHAPITRE 1. ex´cute l’op´ration dee c e e e ` mand´e. qui ee e e diff`rent selon leur structure ou leurs interfaces . ou RPC). peut ˆtre vue comme une « boˆ noire » qui remplit e e e ıte une tˆche sp´cifi´e en ex´cutant une s´quence de code encapsul´e. ` e .6a). e e L’invariance de la s´mantique entre appel local et distant maintient l’abstraction e proc´durale. l’envoi de requˆte n’est pas e e e bloquant. le e e e e client reprend son ex´cution. En d´pit de cette diversit´. Un processus qui appelle une proc´dure fournit les pae e e ram`tres effectifs associ´s aux conteneurs. Remote Procedure Call.3 Un exemple simple d’intergiciel : l’appel de proc´dure e ` distance a Nous pr´sentons maintenant un exemple simple d’intergiciel : l’appel de proc´dure e e a distance (en anglais. ` e 1. A la r´ception de la r´ponse. Dans le sch´ma asynchrone. Le serveur re¸oit la requˆte. le corps de la proc´dure. et re¸oit les r´sultats lors du e e e c e retour.3. c’est-`-dire a la fin de l’ex´cution du corps de la proc´dure. et renvoie un message de r´ponse au client. Une application qui utilise le RPC est facilement portable d’un environnee ment a un autre. que l’on peut trouver dans tous les manuels traitant e e de syst`mes r´partis . des exemples en sont pr´sent´s dans la e e e suite. l’objectif est de mettre en ´vidence quelques probl`mes de concepe e e e tion des syst`mes intergiciels.1 Motivations et besoins L’abstraction proc´durale est un concept fondamental de la programmation. les files de messages ou les ` syst`mes de publication-abonnement (publish-subscribe) sont des exemples de come munication asynchrone. en e ` e pr´servant la forme et la s´mantique de l’appel (c’est-`-dire son effet global dans l’envie e a ronnement de p). a ` e e L’appel de proc´dure a distance peut ˆtre sp´cifi´ comme suit. ` INTRODUCTION A L’INTERGICIEL pr´c´demment pour le syst`me de communication de base). Soit sur un site A un e ` e e e processus p qui appelle une proc´dure locale P (Figure 1. ex´cute l’appel. e e 1. dans un langage imp´ratif. et il peut ou non y avoir une r´ponse. Les diverses combinaisons des propri´t´s ci-dessus produisent des syst`mes vari´s. nous souhaitons mettre en ´vidence quelques principes e e e architecturaux communs a tous ces syst`mes.6b). car elle est ind´pendante des protocoles de communication sous-jacents. Une e proc´dure. a e e e e e e L’encapsulation traduit le fait que la proc´dure ne peut ˆtre appel´e qu’` travers une intere e e a face qui sp´cifie ses param`tres et ses r´sultats sous la forme d’un ensemble de conteneurs e e e typ´s (les param`tres formels). visant a e ` r´soudre ces probl`mes. A et B sont respectivement appel´s site client et site serveur. car l’appel e de proc´dure a distance suit le sch´ma client-serveur de communication synchrone par e ` e requˆte et r´ponse. Il s’agit de concevoir un e m´canisme permettant a p de faire ex´cuter P sur un site distant B (Figure 1.

e Le probl`me du passage des param`tres est g´n´ralement r´solu en utilisant le passage e e e e e par valeur pour les types simples.3. que la proc´dure appel´e. Dans le cas g´n´ral. Les souches client et serveur ´changent des messages via le syst`me de e e e . le site serveur et le r´seau sont sujets a des e e ` d´faillances ind´pendantes . comme de r´ex´cuter une proc´dure d´j` ex´cut´e. D’autre part. on ne peut pas passer un pointeur en param`tre dans un environnement e r´parti car le processus appelant et la proc´dure appel´e s’ex´cutent dans des espaces e e e e d’adressage diff´rents). Les aspects ` e e e e e ea e e relatifs a la tol´rance aux fautes sont examin´s en 1. e e La sp´cification du comportement du RPC en pr´sence de d´faillances soul`ve deux e e e e difficult´s. dans e e e e cette derni`re situation.6 – Sch´ma de l’appel de proc´dure a distance e e ` Elle peut ´galement ˆtre port´e ais´ment. graphes ou listes. on peut n´anmoins construire des routines sp´cifiques d’emballage et de d´ballage e e e des param`tres pour des structures a base de pointeurs. d’un syst`me centralis´ vers e e e e e e un r´seau. En cons´quence. Ainsi. UN EXEMPLE SIMPLE D’INTERGICIEL : RPC 9 processus p site A processus p site A P(x.y) P(x. ou talon. l’appel par r´f´rence n’est pas e e ee possible .2 Principes de r´alisation e La r´alisation standard du RPC [Birrell and Nelson 1984] repose sur deux modules e logiciels (Figure 1. lorsque le syst`me de communication utilis´ est asynchrone.2.3. la s´mantique du passage des param`tres est diff´rente e e e e (par exemple. Les aspects e ` techniques de la transmission des param`tres sont examin´s en 1. cˆt´ o e oe client. pour deux raisons e e a e principales : – les modes de d´faillance sont diff´rents dans les cas centralis´ et r´parti . D’une part.3. e la souche serveur joue un rˆle sym´trique. ıt e e e un m´canisme de d´tection de perte de message a base de d´lais de garde risque donc des e e ` e fausses alarmes.7). conservent la mˆme interface que dans le e e oe e cas centralis´. e N´anmoins. une action de reprise peut conduire e a une d´cision erron´e. client (client stub) et la souche serveur (server stub). ` e e 1. aussi bien le processus appelant. la souche.y) interface interface interface (a) Appel local (b) Appel distant Figure 1. il est difficile de diff´rencier l’effet de la perte d’un message e de celui de la panne d’un site distant. La souche client agit comme un repr´sentant local du serveur sur le site client .3. sans modifications.2. le maintien de la s´mantique est une tˆche d´licate. Cette solution s’´tend aux param`tres compos´s de e e e taille fixe (tableaux ou structures). on ne e e e connaˆ en g´n´ral pas de borne sup´rieure pour le temps de transmission d’un message .y) réseau site B P(x. le site client. cˆt´ serveur.1. e e – mˆme en l’absence de pannes.

8) ´tant le plus fr´quent.8a). e e e Du cˆt´ serveur. Ils doivent donc ˆtre mis sous une forme s´rialis´e permettant e e e e e cette transmission. ce dernier choix (illustr´ sur la figure 1. ee l’ex´cutant disparaˆ a la fin de l’appel. e e e Gestion des processus et synchronisation. Pour ´viter le coˆ t de la cr´ation. une solue ıt ` e u e tion consiste a g´rer une r´serve de threads cr´´s a l’avance (Figure 1. ils utilisent un service de d´signation pour aider le client a e ` localiser le serveur (ce point est d´velopp´ en 1. il retourne dans la r´serve et se remet en attente. le processus 4 appelant oe doit ˆtre bloqu´ en attendant le retour de la proc´dure. Du cˆt´ client.8c). On peut utiliser pour cela des processus ordinaires ou des procese sus l´gers (threads). Le multiplexage des ressources du serveur (notamment si le support du serveur est un multiprocesseur ou une grappe) n´cessite d’organiser l’ex´cution e e parall`le des appels. Pour assurer la portabilit´. selon le sch´ma producteur` e e consommateur. Dans e e e la solution s´quentielle (Figure 1. Toutes ces op´rations de synchronisation et de gestion des processus sont r´alis´es dans e e e les souches et sont invisibles aux programmes principaux du client et du serveur. mais le serveur peut ˆtre utilis´ e e e e e e par plusieurs clients. e e a e Voir [Lea 1999] pour une discussion de la gestion de l’ex´cution cˆt´ serveur.3. e e .8b). ` INTRODUCTION A L’INTERGICIEL communication. un noue e e e veau thread) est cr´´ pour effectuer l’appel. il peut s’agir d’un processus ordinaire ou d’un processus l´ger (thread ).7 – Composants principaux de l’appel de proc´dure a distance e ` Les fonctions des souches sont r´sum´es ci-apr`s. cette forme doit ˆtre conforme a un stane e ` dard connu. le veilleur lui-mˆme ex´cute la proc´dure . En outre. e e e e Un thread veilleur (en anglais daemon) attend les requˆtes sur un port sp´cifi´. le probl`me principal est celui de la gestion du parall´lisme. oe e e L’ex´cution de la proc´dure est une op´ration s´quentielle. Emballage et d´ballage des param`tres.3). Chaque thread attend qu’une tˆche d’ex´cution soit propos´e . quand il a a e e termin´. il n’y a e e e e pas d’ex´cution parall`le sur le serveur. Dans le sch´ma illustr´ (Figure 1. et ind´pendante des protocoles de communication utilis´s et des conventions e e 4 selon l’organisation adopt´e. Les param`tres et les r´sultats doivent e e e e ˆtre transmis sur le r´seau. Un appel qui arrive alors que e e tous les threads sont occup´s est retard´ jusqu’` ce que l’un d’eux se lib`re. le veilleur revenant attendre l’appel suivant . Ces threads ` e e ee ` communiquent avec le veilleur a travers un tampon partag´. e e client interface d’appel de procédure talon client interface de communication sous-système de communication service de noms serveur interface d’appel de procédure talon serveur sous-système de communication interface de communication réseau Figure 1.10 CHAPITRE 1. illustr´e e oe e par des threads Java.

les d´faillances (ou pannes) e e e e peuvent survenir sur le site client. Le d´passement e e e e e e du d´lai de garde d´clenche une action de reprise. Le probl`me vient du fait qu’il est difficile d’estimer les d´lais de ` e e garde : un message d’appel peut ˆtre renvoy´ alors que l’appel a d´j` eu lieu. l’action de reprise consiste ` e a renvoyer le message. writeString. une horloge de garde est arm´e. L’interface et l’organisation des emballeurs et d´balleurs e e d´pend du langage utilis´. etc.3. une par type de donn´es (par exemple e writeInt. la conversion en sens inverse e est appel´e d´ballage (en anglais unmarshalling). ou sur le r´seau. e R´action aux d´faillances. y) put work to do execute P exit retour P(x. etc. Un d´balleur (unmarshaller ) remplit la fonction inverse et fournit des e e e routines (par exemple readInt. sur le site serveur. Comme indiqu´ plus haut. e e e Le resultat net est qu’il est g´n´ralement impossible de garantir la s´mantique d’appel e e e . de d´tecter e e e e e les d´faillances. et cˆt´ e oe ` oe serveur. A l’envoi d’un message.). e e Les horloges de garde sont plac´es cˆt´ client. qui sp´cifie les types de donn´es. Dans les deux cas.1. Ces routines sont appel´es par les souches quand e e ` e e une conversion est n´cessaire. et enfin de r´agir a cette d´tection. y) (a) exécution directe (b) 1thread par appel (c) pool de threads Figure 1. qui ´crivent des donn´es du type sp´cifi´ dans un flot de e e e e donn´es s´quentiel. a l’envoi du message d’appel. La prise en e compte des d´faillances n´cessite de formuler des hypoth`ses de d´faillances. ou bien il n’arrive pas. e e ` e Les hypoth`ses habituelles sont celle de la panne franche (fail-stop) pour les sites (ou e bien un site fonctionne correctement. et la proc´dure e e ea e peut ainsi ˆtre ex´cut´e plusieurs fois.) qui extraient des donn´es d’un type e sp´cifi´ a partir d’un flot s´quentiel. e e Un emballeur (marshaller ) est un jeu de routines. readString. Les m´canismes de d´tection de pannes reposent sur e e e ` des d´lais de garde. La conversion des donn´es depuis leur repr´sentation locale vers une forme standard e e transmissible est appel´e emballage (en anglais marshalling) . et celle de la perte de message ee pour le r´seau (ou bien un message arrive sans erreur. ce qui suppose e que les erreurs de transmission sont d´tect´es et ´ventuellement corrig´es a un niveau plus e e e e ` bas du syst`me de communication). comme l’ordre des oce e tets. a l’envoi du message de r´ponse. UN EXEMPLE SIMPLE D’INTERGICIEL : RPC 11 thread veilleur wait wait execute P thread veilleur thread exécutant create thread wait thread veilleur tampon thread exécutant appel appel appel wait get work to do P(x.8 – Appel de proc´dure a distance : gestion de l’ex´cution cˆt´ serveur e ` e oe locales de repr´sentation des donn´es sur les sites client et serveur. y) retour retour execute P P(x. ou bien il est arrˆt´). avec une e e valeur estim´e de la borne sup´rieure du d´lai de r´ception de la r´ponse. et du format choisi pour la e e e e repr´sentation standard.

Un serveur enregistre e . x. cr´ation des souches. en dehors de la gestion des pannes. ` INTRODUCTION A L’INTERGICIEL dite « exactement une fois » (apr`s r´paration de toutes les pannes. Ces informations peuvent ˆtre connues a l’avance et inscrites e ` « en dur » dans le programme. d´ploiement et d´marrage de l’applie e e cation. y]= unmarshall(m) call P(x. N´anmoins. La s´mantique « au moins une fois ». La plupart des syst`mes assurent la s´mantique « au plus une fois » e e (l’appel a ´t´ ex´cut´ une fois ou pas du tout. et augmenter la disponibilit´.12 CHAPITRE 1. y) network transmission creates or selects thread m=receive() wait envoyer(m) [P. c’est-`-dire si l’effet de deux appels successifs est a identique a celui d’un seul appel. l’appel a ´t´ ex´cut´ e e ee e e une fois et une seule). Ces aspects sont examin´s ci-apr`s.9 – Flot d’ex´cution dans un appel de proc´dure a distance e e ` 1. e e est acceptable si l’appel est idempotent. Client Talon client sous-système de sous-système de communication communication Talon serveur Serveur call P(x.3 D´veloppement d’applications avec le RPC e Pour utiliser le RPC dans des applications. qui autorise les ex´cutions multiples. qui fonctionne comme un e e annuaire associant les noms (et ´ventuellement les num´ros de version) des proc´dures e e e avec les adresses et num´ros de port des serveurs correspondants. Le client doit connaˆ ıtre l’adresse du serveur et le num´ro de e port de destination de l’appel. e e Liaison client-serveur. ce qui exclut les cas d’ex´cution partielle ee e e e ou multiple). Cette fonction est assur´e par le service de d´signation. pour assurer l’ind´pendance logique entre client e e et serveur. Le client doit localiser ee le serveur au plus tard au moment de l’appel. y) unblock envoyer(q) network transmission q=receive() return r q=marshall(r) thread exits or returns to pool return r r=unmarshall(q) Figure 1. permettre une gestion souple des ressources. x.3. y) m=marshall(P.9. il faut r´gler plusieurs probl`mes pratiques : e e liaison entre client et serveur. ` L’organisation d’ensemble du RPC. il e est pr´f´rable de permettre une liaison tardive du client au serveur. est sch´matis´e e e sur la figure 1.

copie-restauration. les souches remplissent des e e fonctions bien d´finies.10 – Localisation du serveur dans l’appel de proc´dure a distance. ` La figure 1.1.2. Le g´n´rateur de ee e e e souches utilise un format commun de repr´sentation de donn´es d´fini par l’IDL . e e e e Client : Client Stub : Naming Server : Server Stub : Server : : call P(x. on peut utiliser sur ce site un service local d’annuaire (portmapper ) ıt accessible sur un port pr´d´fini (n◦ 111).10 montre le sch´ma g´n´ral d’utilisation du service de d´signation. OSF DCE). y) : register(P. Le service de d´signation est g´n´ralement r´alis´ e e e e e par un serveur sp´cialis´. la description sp´cifie son type et son mode de passage e e e (valeur.11 (la notation est celle de Sun RPC). Pour chaque param`tre. 5 Si on connaˆ le site du serveur. port) : lookup(P) : return(IPaddress. Un client (plus pr´cis´ment. Interface Definition e e Language. e e e Plusieurs IDL ont ´t´ d´finis (par exemple Sun XDR. e e . e ` La liaison inverse (du serveur vers le client) est ´tablie en incluant l’adresse IP et le e num´ro de port du client dans le message d’appel. UN EXEMPLE SIMPLE D’INTERGICIEL : RPC 13 un nom de proc´dure. la souche client) consulte l’annuaire pour e e obtenir ces informations de localisation.3. Comme nous l’avons vu en 1. dont l’adresse et le num´ro de port sont connus de tous les sites e e e participant a l’application5 . il ins`re e e e e les routines de conversion fournies par les emballeurs et d´balleurs correspondants. Le e cycle complet de d´veloppement d’une application utilisant le RPC est sch´matis´ sur la e e e figure 1. dont une partie est g´n´rique (comme la gestion des processus) et e e e une autre est propre a chaque appel (comme l’emballage et le d´ballage des param`tres).). port) Figure 1. e e e Les param`tres d’un appel n´cessaires pour la g´n´ration de souches sont sp´cifi´s dans e e e e e e une notation appel´e langage de d´finition d’interface (en anglais. IPaddress. port) : send(m. etc. Des informations suppl´mentaires telles que le num´ro e e de version et le mode d’activation du serveur peuvent ˆtre sp´cifi´es. associ´ a son adresse IP et au num´ro de port auquel le veilleur e e ` e attend les appels. ` e e Ce sch´ma permet la g´n´ration automatique des souches. e G´n´ration des souches. IPaddress. ou IDL). Une description d’interface ´crite en IDL contient toute l’information e qui d´finit l’interface pour un appel. et fonctionne comme un contrat entre l’appelant et e l’appel´.3.

Voir [Waldo et al. celui-ci doit e e disposer des autorisations n´cessaires).3. Les e e e contraintes de l’activation sont que le serveur doit ˆtre lanc´ avant le premier appel d’un e e client et que le service de d´signation doit ˆtre lanc´ avant le serveur pour permettre a e e e ` ce dernier de s’enregistrer.11. et e le lancement de leur ex´cution. Les activations peuvent ˆtre r´alis´es par un script lanc´ par e e e e l’administrateur du syst`me ou ´ventuellement par un client (dans ce cas. l’installation est g´n´ralement r´alis´e e e e e e par des scripts pr´d´finis qui appellent les outils repr´sent´s sur la figure 1.14 CHAPITRE 1. voir chapitre 2. Dans le cas du RPC. D’autres patrons. ont ´t´ mis en ´vidence. des parties de programme qui constituent l’application. et qu’il vae e lait mieux explicitement prendre en compte le caract`re r´parti des applications. e e 2. La transparence compl`te (c’est-`-dire la pr´servation du comportement d’une ape a e plication entre environnements centralis´ et r´parti) ne peut pas ˆtre r´alis´e. 1997] pour une discussion d´taill´e. en utilisant e e e e ´ventuellement un syst`me r´parti de fichiers pour retrouver les programmes source. l’exp´rience a montr´ que la transparence avait des limites. e 1. e e e 1. Bien e e e e e que cet objectif ait ´t´ initialement fix´ aux premiers temps du d´veloppement de ee e e l’intergiciel. L’usage de e ee e repr´sentants locaux pour g´rer la communication entre entit´s distantes est l’un e e e des patrons les plus courants de l’intergiciel (le patron de conception Proxy.3.c talon client proc_clnt. ou patrons. Le d´ploiement d’une application r´partie est l’inse e e tallation.h définition d’interface talon serveur proc_svc.c proc.c conversions proc_xdr. au e e moins pour les aspects o` la distinction est pertinente.c Fourni par le programmeur gcc serveur application serveur Outils et services Engendré Figure 1. peute ˆtre moins imm´diatement visibles. Un autre patron universel est la liaison client-serveur via un service de d´signation (le patron d’architecture Broker). section 2. sur les diff´rents sites. tels que la tol´rance aux u e fautes et les performances.x gcc client code source rpcgen définitions proc. ` INTRODUCTION A L’INTERGICIEL application client client_proc.c bibliothèques code exécutable server_proc.4 R´sum´ et conclusions e e Plusieurs enseignements utiles peuvent ˆtre tir´s de cette ´tude de cas simple. Plusieurs sch´mas utiles. section e e .11 – Infrastructure de d´veloppement pour l’appel de proc´dure a distance. e e ` D´ploiement d’une application.1). sont l’organisation de l’activit´ du serveur par e e e cr´ation dynamique ou gestion d’une r´serve de threads (voir chapitre 2.

cette interaction repose sur une couche de communicae tion. e e e e e outils de d´ploiement. on peut noter quelques limitations. A un niveau plus ´lev´. e puisque celui-ci peut ˆtre d´fini comme le logiciel assurant la liaison entre les diff´rentes e e e parties d’une application r´partie. Dans la suite de cet ouvrage. service de d´signation. nous examinons les probl`mes pos´s par la conception des syst`mes e e e intergiciels.3). rien n’est pr´vu pour la cr´ation dynae e mique de serveurs ou pour la restructuration d’une application.` ´ 1. a e e e En ce qui concerne l’utilit´ du RPC comme outil pour la structuration des applications e r´parties.4. met en jeu une infrastructure logistique importante : IDL. est un th`me r´current de cet ouvrage. e Dans tout syst`me intergiciel. qui orientent les e e e recherches dans ce domaine. e e e e 3. e e e – Les donn´es g´r´es par le client et le serveur ne sont pas persistantes. repr´sentation commune des donn´es. et le sch´ma d´tection-r´action pour le traitement des d´faillances. ou e entre applications. nous pr´sentons d’autres infrastructures. PROBLEMES ET DEFIS DE LA CONCEPTION DE L’INTERGICIEL 15 2. – La communication est restreinte a un sch´ma synchrone : rien n’est pr´vu pour la ` e e communication asynchrone. En outre. e Outre les aspects architecturaux. mais leur sauvegarde et leur restauration u e e doivent ˆtre explicitement programm´es . ` 1. Les entit´s communicantes peuvent assumer des rˆles divers tels que client-serveur e o ` ou pair a pair. et les sch´mas de communication. g´n´rateurs de souches. avec l’objectif de simplie fier la tˆche des d´veloppeurs d’applications. e – La structure de l’application est statique . e e e e La d´signation et la liaison sont des notions centrales de la conception de l’intergiciel. les principaux probl`mes de la conception de l’intere giciel sont ceux r´sultant de la r´partition.4 Probl`mes et d´fis de la conception de l’intergiciel e e Dans cette section. m´canisme de r´action aux d´faillances. rien n’est pr´vu pour assurer la persistance e e e automatique. aussi bien pour les applications que pour l’intergiciel e lui-mˆme. eme e e e balleurs et d´balleurs. Nous les r´sumons ci-apr`s. qui ´chappent e e a ces limitations. la communication est une des fonctions que fournit l’intergiciel aux applications. dirig´e par les ´v´nements.3.1 Probl`mes de conception e La fonction de l’intergiciel est l’interm´diation entre les parties d’une application. Nous concluons e par une br`ve revue de quelques d´fis actuels pos´s par l’intergiciel. mˆme avec un sch´ma d’ex´cution e e e e e conceptuellement aussi simple que le RPC. 1. l’intergiciel permet diff´rents modes d’interaction ` e e e . Le d´veloppement d’une application r´partie.4. la structure d’ensemble. L’architecture couvre l’organisation. Les consid´rations architecturales tiennent donc une place centrale dans e la conception de l’intergiciel. et quelques principes d’architecture permettant d’y r´pondre. c’est-`-dire e ee a qu’elles disparaissent avec les processus qui les ont cr´´es. et facilitant leur interaction. La conception de cette infrastructure. Ces donn´es peuvent ee e bien sˆ r ˆtre rang´es dans des fichiers.

en les pla¸ant de e c part et d’autre d’une d´finition commune d’interface. S´paration des pr´occupations e e En g´nie logiciel. section 2. mais e e e e prennent une importance particuli`re dans ce domaine car les qualit´s et d´fauts de l’ine e e tergiciel conditionnent ceux des applications. 1. en raison de son double rˆle de m´diateur et o e de fournisseur de services communs.16 CHAPITRE 1. dont chacun fournit une vue qui cache les d´tails non e . ` INTRODUCTION A L’INTERGICIEL (appel synchrone. qui peut e e e e prendre diverses formes sp´cifiques dont nous donnons quatre exemples ci-apr`s.2. la surveillance (monitoring).1). La s´paration des pr´occupations a une incidence profonde aussi e ` e e bien sur l’architecture de l’intergiciel que sur la d´finition des rˆles pour la r´partition des e o e tˆches de conception et de d´veloppement.1. e e – Le principe d’encapsulation (voir chapitre 2. et la s´curit´. Elle comprend des fonctions telles que la configuration et le d´ploiement.2 Quelques principes d’architecture Les principes d´velopp´s ci-apr`s ne sont pas propres aux syst`mes intergiciels. d´faillances) et la reconfiguration. ` Les diff´rents aspects ci-dessus apparaissent dans les ´tudes de cas qui constituent la e e suite de cet ouvrage. e e e e La qualit´ de service comprend diverses propri´t´s d’une application qui ne sont pas e ee explicitement sp´cifi´es dans ses interfaces fonctionnelles. e L’architecture logicielle d´finit l’organisation d’un syst`me r´alis´ comme assemblage e e e e de parties. coordination via des objets partag´s). et a traiter s´par´ment chacun de ces aspects.4.3) dissocie les pr´occupations e de l’utilisateur d’un composant logiciel de celles de son r´alisateur. des aspects ind´pendants e ` e e ou faiblement coupl´s. d’´liminer les interactions artificielles entre des ase ` e pects orthogonaux. Les notions li´es a la composition et aux composants logiciels sont maintenant e ` un ´l´ment central de la conception des syst`mes intergiciels. Des exemples de ces propri´t´s sont la fiabilit´ et la disponibilit´. e e e e L’administration est une ´tape du cycle de vie des applications qui prend une e importance croissante. a e La s´paration des pr´occupations peut ˆtre vue comme un « m´ta-principe ». mais qui sont tr`s importantes e e e pour ses utilisateurs. aussi bien pour leur propre ee e structure que pour celle des applications qui les utilisent. e – Le principe d’abstraction permet de d´composer un syst`me complexe en niveaux e e (voir chapitre 2. la s´paration des pr´occupations (separation of concerns) est une e e e d´marche de conception qui consiste a isoler. la r´action aux ´v´nements ind´sirables (sure e e e e charge. La complexit´ croissante des tˆches d’adminise e a tration conduit a envisager de les automatiser (autonomic computing). les ee e e performances (sp´cialement pour les applications en temps r´el). communication asynchrone par messages. et de permettre l’´volution ind´pendante des besoins et des contraintes e e associ´s a chaque aspect. e ` e e Les avantages attendus sont de permettre au concepteur et au d´veloppeur de se e concentrer sur un probl`me a la fois. section 2. La gestion de donn´es soul`ve le probl`me de la persistance (conservation a long terme e e e ` et proc´dures d’acc`s) et des transactions (maintien de la coh´rence pour l’acc`s concurrent e e e e aux donn´es en pr´sence de d´faillances ´ventuelles). dans un syst`me.

En effet. e e Pour faciliter l’´volution d’un syst`me.2) telles que la disponibilit´. – Le principe de la persistance orthogonale s´pare la d´finition de la dur´e de vie e e e des donn´es d’autres aspects tels que le type des donn´es ou les propri´t´s de leurs e e ee fonctions d’acc`s. Tous ces aspects sont typiquement r´alis´s par des morceaux de code dispers´s dans diff´rentes parties d’une e e e e application. En se concentrant sur un aspect particulier. La s´paration des pr´occupations facilite ´galement l’identification des rˆles sp´cialis´s e e e o e e au sein des ´quipes de conception et de d´veloppement. ainsi que ceux li´s aux fonctions courantes que sont la journae e e lisation.1. sont largement utilis´es e dans les intergiciels commerciaux. Des techniques pragmatiques. e a . les sp´cifications e e ´voluent a mesure de la prise en compte des nouveaux besoins des utilisateurs. la gestion de transactions. e e Dans un sens plus restreint. Un e e e syst`me est dit r´flexif [Smith 1982. e – La s´paration entre politiques et m´canismes [Levin et al. Il doit par exemple ˆtre possible de e e e e modifier une politique sans avoir a r´impl´menter les m´canismes qui la mettent en ` e e e œuvre. d’automatiser la tˆche de production du code e a qui traite chacun des aspects. en dernier ressort. la mise au point. Maes 1987] quand il fournit une repr´sentation de luie e e mˆme permettant de l’observer et de l’adapter. la s´paration des pr´occupations vise a traiter des ase e ` pects dont la mise en œuvre (au moins dans l’´tat de l’art courant) est dispers´e entre e e diff´rentes parties d’un syst`me logiciel. qui sont pris en compte aux niveaux inf´rieurs. l’observation. notamment dans le domaine de la gestion et de la protection de ressources. c’est-`-dire de modifier son comportement. Cette s´paration donne de la souplesse au concepteur de politiques. et la diversit´ e ` e des syst`mes et organes de communication entraˆ des conditions variables d’ex´cution. ree e e posant souvent sur l’interception (voir chapitre 2. section 2. sa structure interne doit ˆtre rendue accessible. tout e en ´vitant de « sur-sp´cifier » des m´canismes. la persistance. Des exemples d’aspects ainsi trait´s sont ceux li´s aux proe e pri´t´s « extra-fonctionnelles » (voir chapitre 2. leur adaptation dynamique r´pond aux variations des conditions d’ex´cution.4. ee e la s´curit´. 1975] est un principe lare e gement applicable. section 2. qui vise a cacher les d´tails de la r´alisation. L’objectif est de permettre une expression s´par´e des aspects que l’on consid`re e e e comme ind´pendants et. la personne ou le groupe qui remplit un rˆle peut mieux appliquer ses comp´tences et travailler plus o e efficacement. tant pour l’intergiciel proprement e e dit que pour les applications. ` e e Ce probl`me peut ˆtre abord´ par plusieurs voies. PROBLEMES ET DEFIS DE LA CONCEPTION DE L’INTERGICIEL 17 pertinents. et ´troitement imbriqu´e avec celle d’autres ase e e e pects. e e e Il y a une contradiction apparente entre cette exigence et le principe d’encapsulation.3. e ´ Evolution et adaptation Les syst`mes logiciels doivent s’accommoder du changement. Une approche plus syst´matique utilise la r´flexivit´.5). e Ces points sont d´velopp´s dans le chapitre 2.` ´ 1. e ıne e S’y ajoutent des ´v´nements impr´visibles comme les variations importantes de la charge et e e e les divers types de d´faillances. La conception des applications comme celle de l’intergiciel e doit tenir compte de ces conditions changeantes : l’´volution des programmes r´pond a celle e e ` des besoins. Des exemples de rˆles associ´s aux diff´rents aspects des applications a base o e e ` de composants sont donn´s dans le chapitre 5.

La mobilit´ et la reconfiguration dynamique seront des traits dominants de e ces syst`mes. et vice versa. largement ee e r´parties et en ´volution permanente. cette repr´sentation doit ˆtre causalement connect´e au syst`me : e e e e e e toute modification apport´e au syst`me doit se traduire par une modification homologue e e de sa repr´sentation. soul`ve de nombreuses questions telles que e e e l’observation coh´rente. ainsi que des protocoles pour examiner e e et modifier cette repr´sentation. qui aggravent encore la situation. L’administration de grandes applications h´t´rog`nes. processeurs. l’effet de ces optimisations. ` – Passage a grande ´chelle. imposant une adaptation permanente des applications. dans laquelle un nombre croissant d’appareils (capteurs. .3 D´fis de l’intergiciel e Les concepteurs des futurs syst`mes intergiciels sont confront´s a plusieurs d´fis.18 CHAPITRE 1. on ıt e peut s’interroger sur la possibilit´ d’observer l’´tat d’un tr`s grand syst`me r´parti. d’usagers e e e et d’appareils divers composant ces applications tend a augmenter. Le passage a grande ´chelle e ` e rend ´galement plus complexe la pr´servation des diff´rentes formes de qualit´ de e e e e service. La souplesse d’utilisation doit ˆtre pr´serv´e. la d´finition et la r´alisation des politiques d’alloe e e e cation de ressources. qui visent a ´liminer les coˆ ts e e e `e u 6 directe du code de l’intergiciel dans suppl´mentaires inutiles en utilisant l’injection e celui des applications. ` INTRODUCTION A L’INTERGICIEL Pour ˆtre coh´rente. 6 Cette technique s’apparente a l’optimisation des appels de proc´dure par insertion de leur code a ` e ` l’endroit de l’appel (inlining). Cela pose le ` probl`me de la capacit´ de croissance (scalability) pour la communication et pour les e e algorithmes de gestion d’objets. l’´quilibre entre autonomie et interd´pendance e e e e e pour les diff´rents sous-syst`mes. e e e e e et sur le sens mˆme que peut avoir une telle notion). `e – Administration. La programmation par aspects.4. actionneurs) inclus dans divers objets physiques participent a un r´seau d’information ` e global. Les m´ta-objets fournissent une telle repr´sentation e e e explicite des m´canismes de base d’un syst`me. L’informatique ubiquitaire (ou omnipr´sente) est une vision du futur e e proche. Ces techniques et leur utilisation dans les syst`mes intergiciels e e sont examin´es dans le chapitre 2. est ´galement utile pour r´aliser l’´volution ` e e e e e dynamique d’un syst`me. e 1. et accroˆ la complexit´ de l’administration (ainsi. la s´curit´. qui induisent des pertes de performances. Les syst`mes intergiciels reposent sur des m´canismes d’interception e e et d’indirection. en cas de besoin. Les principes e d’architecture applicables aux syst`mes d’informatique ubiquitaire restent encore e largement a ´laborer. e e ` e – Performances. Ce d´faut peut e e ˆtre compens´ par diverses m´thodes d’optimisation. L’adaptabilit´ introduit e des indirections suppl´mentaires. etc. A mesure que les applications deviennent de plus en ` e plus ´troitement interconnect´es et interd´pendantes. le nombre d’objets. – Ubiquit´. une technique destin´e e e a assurer la s´paration des pr´occupations. en permettant e e e d’annuler.

1.5. NOTE HISTORIQUE

19

1.4.4

Plan de l’ouvrage

Le chapitre 2 couvre les aspects architecturaux des syst`mes intergiciels. Outre une e pr´sentation des principes g´neraux d’organisation de ces syst`mes, ce chapitre d´crit un e e e e ensemble de patrons (en anglais patterns) et de canevas (en anglais frameworks) r´currents e dans la conception de tous les types d’intergiciels et des applications qui les utilisent. Les chapitres suivants sont des ´tudes de cas de plusieurs familles d’intergiciel, qui sont e repr´sentatives de l’´tat actuel du domaine, tant en ce qui concerne les produits utilis´s e e e que les normes propos´es ou en cours d’´laboration. e e Le chapitre 3 pr´sente un mod`le de composants appel´ Fractal, dont les cae e e ract´ristiques sont : (a) une grande g´n´ralit´ (ind´pendance par rapport au langage de e e e e e programmation, d´finition explicite des d´pendances, composition hi´rarchique avec pose e e sibilit´ de partage) ; (b) la pr´sence d’une interface d’administration extensible, distincte e e de l’interface fonctionnelle. Le chapitre 4 est une introduction aux services Web. Ce terme recouvre un ensemble de normes et de syst`mes permettant de cr´er, d’int´grer et de composer des applications e e e r´parties en utilisant les protocoles et les infrastructures du World Wide Web. e Le chapitre 5 d´crit les principes et techniques de la plate-forme J2EE, sp´cifi´e par e e e Sun Microsystems, qui rassemble divers intergiciels pour la construction et l’int´gration e d’applications. J2EE a pour base le langage Java. Le chapitre 6 d´crit la plate-forme .NET de Microsoft, plate-forme intergicielle pour la e construction d’applications r´parties et de services Web. e Le chapitre 7 pr´sente une autre d´marche pour la construction modulaire de syst`mes. e e e Il s’agit d’une architecture a base de composants, d´finie par le consortium OSGi, et ` e constitu´e de deux ´l´ments : une plate-forme pour la fourniture de services et un envie ee ronnement de d´ploiement, organis´s autour d’un mod`le simple de composants. e e e L’ouvrage comprend des annexes qui pr´sentent la mise en œuvre pratique de cere taines des plates-formes ci-dessus (annexes A : Les services Web en pratique, B : .NET en pratique, C : OSGI en pratique), ainsi que des compl´ments divers. e

1.5

Note historique

Le terme middleware semble ˆtre apparu vers 1990 7 , mais des syst`mes intergiciels e e existaient bien avant cette date. Des logiciels commerciaux de communication par messages ´taient disponibles a la fin des ann´es 1970. La r´f´rence classique sur l’appel de e ` e ee proc´dure a distance est [Birrell and Nelson 1984], mais des constructions analogues, li´es e ` e a des langages particuliers, existaient d´j` auparavant (la notion d’appel de proc´dure ` ea e a distance apparaˆ dans [White 1976] 8 et une premi`re r´alisation est propos´e dans ` ıt e e e [Brinch Hansen 1978]). Vers le milieu des ann´es 1980, plusieurs projets d´veloppent des infrastructures ine e tergicielles pour objets r´partis, et ´laborent les principaux concepts qui vont influene e cer les normes et les produits futurs. Les pr´curseurs sont Cronus [Schantz et al. 1986] e
7 8

Le terme fran¸ais intergiciel est apparu plus r´cemment (autour de 1999-2000). c e version ´tendue du RFC Internet 707. e

20

CHAPITRE 1.

` INTRODUCTION A L’INTERGICIEL

et Eden [Almes et al. 1985], suivis par Amoeba [Mullender et al. 1990], ANSAware [ANSA ], Arjuna [Parrington et al. 1995], Argus [Liskov 1988], Chorus/COOL [Lea et al. 1993], Clouds [Dasgupta et al. 1989], Comandos [Cahill et al. 1994], Emerald [Jul et al. 1988], Gothic [Banˆtre and Banˆtre 1991], Guide [Balter et al. 1991], Network a a Objects [Birrell et al. 1995], SOS [Shapiro et al. 1989], et Spring [Mitchell et al. 1994]. L’Open Software Foundation (OSF), qui deviendra plus tard l’Open Group [Open Group ], est cr´´e en 1988 dans le but d’unifier les diverses versions du syst`me d’exee e ploitation Unix. Cet objectif ne fut jamais atteint, mais l’OSF devait sp´cifier une platee forme intergicielle, le Distributed Computing Environment (DCE) [Lendenmann 1996], qui comportait notamment un service d’appel de proc´dure a distance, un syst`me r´parti e ` e e de gestion de fichiers, un serveur de temps, et un service de s´curit´. e e L’Object Management Group (OMG) [OMG ] est cr´´ en 1989 pour d´finir des normes ee e pour l’intergiciel a objets r´partis. Sa premi`re proposition (1991) fut la sp´cification de ` e e e CORBA 1.0 (la version courante, en 2005, est CORBA 3). Ses propositions ult´rieures e sont des normes pour la mod´lisation (UML, MOF) et les composants (CCM). L’Object e Database Management Group (ODMG) [ODMG ] definit des normes pour les bases de donn´es a objets, qui visent a unifier la programmation par objets et la gestion de donn´es e ` ` e persistantes. Le mod`le de r´f´rence de l’Open Distributed Processing (RM-ODP) [ODP 1995a], e ee [ODP 1995b] a ´t´ conjointement d´fini par deux organismes de normalisation, l’ISO et ee e l’ITU-T. Il propose un ensemble de concepts d´finissant un cadre g´n´rique pour le calcul e e e r´parti ouvert, plutˆt que des normes sp´cifiques. e o e La d´finition du langage Java par Sun Microsystems en 1995 ouvre la voie a plusieurs e ` intergiciels, dont Java Remote Method Invocation (RMI) [Wollrath et al. 1996] et les Enterprise JavaBeans (EJB) [Monson-Haefel 2002]. Ces syst`mes, et d’autres, sont int´gr´s e e e dans une plate-forme commune, J2EE [J2EE 2005]. Microsoft d´veloppe a la mˆme ´poque le Distributed Component Object Model e ` e e (DCOM) [Grimes 1997], un intergiciel d´finissant des objets r´partis composables, dont e e une version am´lior´e est COM+ [Platt 1999]. Son offre courante est .NET [.NET ], platee e forme intergicielle pour la construction d’applications r´parties et de services pour le Web. e La premi`re conf´rence scientifique enti`rement consacr´e a l’intergiciel a lieu en 1998 e e e e ` [Middleware 1998]. Parmi les th`mes actuels de la recherche sur l’intergiciel, on peut noter e les techniques d’adaptation (r´flexivit´, aspects), l’administration et notamment les trae e vaux sur les syst`mes autonomes (pouvant r´agir a des surcharges ou a des d´faillances), e e ` ` e et l’intergiciel pour appareils mobiles et environnements ubiquitaires.

Intergiciel et Construction d’Applications R´parties e
c 2006 S. Krakowiak (version du 19 janvier 2007 - 10:31) Licence Creative Commons (http://creativecommons.org/licenses/by-nc-nd/ 2.0/fr/deed.fr)

Chapitre 2

Patrons et canevas pour l’intergiciel
Ce chapitre pr´sente les grands principes de conception des syst`mes intergiciels, ainsi e e que quelques patrons ´l´mentaires r´currents dans toutes les architectures intergicielles. ee e Divers patrons plus ´labor´s peuvent ˆtre construits en ´tendant et en combinant ces e e e e constructions de base. Le chapitre d´bute par une pr´sentation des principes architecturaux e e et des ´l´ments constitutifs des syst`mes intergiciels, notamment les objets r´partis et les ee e e organisations multi-couches. Il continue par une discussion des patrons de base relatifs aux objets r´partis. Le chapitre se termine par une pr´sentation des patrons li´s a la e e e ` s´paration des pr´occupations, qui comprend une discussion des techniques de r´alisation e e e pour l’intergiciel r´flexif. e

2.1

Services et interfaces

Un syst`me mat´riel et/ou logiciel est organis´ comme un ensemble de parties, ou e e e composants1 . Le syst`me entier, et chacun de ses composants, remplit une fonction e qui peut ˆtre d´crite comme la fourniture d’un service. Selon une d´finition tir´e de e e e e [Bieber and Carpenter 2002], « un service est un comportement d´fini par contrat, qui e peut ˆtre r´alis´ et fourni par tout composant pour ˆtre utilis´ par tout composant, sur la e e e e e base unique du contrat ». Pour fournir ses services, un composant repose g´n´ralement sur des services qu’il dee e mande a d’autres composants. Par souci d’uniformit´, le syst`me entier peut ˆtre consid´r´ ` e e e ee comme un composant, qui interagit avec un environnement externe sp´cifi´ ; le service e e fourni par le syst`me repose sur des hypoth`ses sur les services que ce dernier re¸oit de e e c
1 Dans ce chapitre, nous utilisons le terme de composant dans un sens non-technique, pour d´signer une e unit´ de d´composition d’un syst`me. e e e

22

CHAPITRE 2.

PATRONS ET CANEVAS POUR L’INTERGICIEL

son environnement2 . La fourniture de services peut ˆtre consid´r´e a diff´rents niveaux d’abstraction. Un e ee ` e service fourni est g´n´ralement mat´rialis´ par un ensemble d’interfaces, dont chacune e e e e repr´sente un aspect du service. L’utilisation de ces interfaces repose sur des patrons e ´l´mentaires d’interaction entre les composants du syst`me. Dans la section 2.1.1, nous ee e passons bri`vement en revue ces patrons d’interaction. Les interfaces sont discut´es dans e e la section 2.1.2, et les contrats sont l’objet de la section 2.1.3.

2.1.1

M´canismes d’interaction de base e

Les composants interagissent via un syst`me de communication sous-jacent. Nous supe posons acquises les notions de base sur la communication et nous examinons quelques patrons d’interaction utilis´s pour la fourniture de services. e La forme la plus simple de communication est un ´v´nement transitoire asynchrone e e (Figure 2.1a). Un composant A (plus precis´ment, un thread s’ex´cutant dans le composant e e A) produit un ´v´nement (c’est-`-dire envoie un message ´l´mentaire a un ensemble sp´cifi´ e e a ee ` e e de destinataires), et poursuit son ex´cution. Le message peut ˆtre un simple signal, ou peut e e porter une valeur. L’attribut « transitoire » signifie que le message est perdu s’il n’est pas attendu. La r´ception de l’´v´nement par le composant B d´clenche une r´action, c’est-`e e e e e a dire lance l’ex´cution d’un programme (le traitant) associ´ a cet ´v´nement. Ce m´canisme e e` e e e peut ˆtre utilis´ par A pour demander un service a B, lorsqu’aucun r´sultat n’est attendu e e ` e en retour ; ou il peut ˆtre utilis´ par B pour observer ou surveiller l’activit´ de A. e e e
messaging system receive send m1 send m2 receive deliver m2 block deliver m1

A

B

A

B

A

B

event handler

request wait wait reply

(a) Asynchronous event

(b) Buffered messages

(c) Synchronous call

Figure 2.1 – Quelques m´canismes de base pour l’interaction e

Une forme de communication plus ´labor´e est le passage asynchrone de messages e e persistants (2.1b). Un message est un bloc d’information qui est transmis d’un ´metteur e a un r´cepteur. L’attribut « persistant » signifie que le syst`me de communication assure ` e e un rˆle de tampon : si le r´cepteur attend le message, le syst`me de communication le lui o e e d´livre ; sinon, le message reste disponible pour une lecture ult´rieure. e e Un autre m´canisme courant est l’appel synchrone (2.1c), dans lequel A (le client d’un e service fourni par B) envoie un message de requˆte a B et attend une r´ponse. Ce patron e ` e
Par exemple un ordinateur fournit un service sp´cifi´, a condition de disposer d’une alimentation e e ` ´lectrique sp´cifi´e, et dans une plage sp´cifi´e de conditions d’environnement, telles que temp´rature, e e e e e e humidit´, etc. e
2

2.1. SERVICES ET INTERFACES

23

est utilis´ dans le RPC (voir chapitre 1, section 1.3). e Les interactions synchrone et asynchrone peuvent ˆtre combin´es, par exemple dans e e diverses formes de « RPC asynchrone ». Le but est de permettre au demandeur d’un service de continuer son ex´cution apr`s l’envoi de sa requˆte. Le probl`me est alors pour e e e e le demandeur de r´cup´rer les r´sultats, ce qui peut ˆtre fait de plusieurs mani`res. Par e e e e e exemple, le fournisseur peut informer le demandeur, par un ´v´nement asynchrone, que e e les r´sultats sont disponibles ; ou le demandeur peut appeler le fournisseur a un moment e ` ult´rieur pour connaˆ l’´tat de l’ex´cution. e ıtre e e Il peut arriver que la fourniture d’un service par B a A repose sur l’utilisation par B ` d’un service fourni par A (le contrat entre fournisseur et client du service engage les deux parties). Par exemple, dans la figure 2.2a, l’ex´cution de l’appel depuis A vers B repose sur e un rappel (en anglais callback ) depuis B a une fonction fournie par A. Sur cet exemple, le ` rappel est ex´cut´ par un nouveau thread, tandis que le thread initial continue d’attendre e e la terminaison de son appel. Les exceptions sont un m´canisme qui traite les conditions consid´r´es comme sortant e ee du cadre de l’ex´cution normale d’un service : pannes, valeurs de param`tres hors limites, e e etc. Lorsqu’une telle condition est d´tect´e, l’ex´cution du service est proprement termin´e e e e e (par exemple les ressources sont lib´r´es) et le contrˆle est rendu a l’appelant, avec une ee o ` information su la nature de l’exception. Une exception peut ainsi ˆtre consid´r´e comme e ee un « rappel a sens unique ». Le demandeur du service doit fournir un traitant pour chaque ` exception possible. La notion de rappel peut encore ˆtre ´tendue. Le service fourni par B a A peut ˆtre dee e ` e mand´ depuis une source ext´rieure, A fournissant toujours a B une ou plusieurs interfaces e e ` de rappel. Ce patron d’interaction (Figure 2.2b) est appel´ inversion du contrˆle, parce e o que le flot de contrˆle va de B (le fournisseur) vers A (le demandeur). Ce cas se produit o notamment lorsque B « contrˆle » A, c’est-`-dire lui fournit des services d’administration o a tels que la surveillance ou la sauvegarde persistante ; dans cette situation, la demande de service a une origine externe (elle est par exemple d´clench´e par un ´v´nement ext´rieur e e e e e tel qu’un signal d’horloge).

A

B

A

B service request for A

callback 1 callback callback 2

(a) Synchronous call with callback

(b) Inversion of control

Figure 2.2 – Inversion du contrˆle o

Les interactions ci-dessus sont discr`tes et n’impliquent pas explicitement une notion e de temps autre que l’ordre des ´v´nements. Les ´changes continus n´cessitent une forme e e e e

24

CHAPITRE 2.

PATRONS ET CANEVAS POUR L’INTERGICIEL

de synchronisation en temps r´el. Par exemple les donn´es multim´dia sont ´chang´es via e e e e e des flots de donn´es, qui permettent la transmission continue d’une s´quence de donn´es e e e soumise a des contraintes temporelles. `

2.1.2

Interfaces

Un service ´l´mentaire fourni par un composant logiciel est d´fini par une interface, qui ee e est une description concr`te de l’interaction entre le demandeur et le fournisseur du service. e Un service complexe peut ˆtre d´fini par plusieurs interfaces, dont chacune repr´sente un e e e aspect particulier du service. Il y a en fait deux vues compl´mentaires d’une interface. e – la vue d’usage : une interface d´finit les op´rations et structures de donn´es utilis´es e e e e pour la fourniture d’un service ; – la vue contractuelle : une interface d´finit un contrat entre le demandeur et le foure nisseur d’un service. La d´finition effective d’une interface requiert donc une repr´sentation concr`te des e e e deux vues, par exemple un langage de programmation pour la vue d’usage et un langage de sp´cification pour la vue contractuelle. e Rappelons qu’aussi bien la vue d’usage que la vue contractuelle comportent deux partenaires3 . En cons´quence, la fourniture d’un service implique en r´alit´ deux interfaces : e e e l’interface pr´sent´e par le composant qui fournit un service, et l’interface attendue par le e e client du service. L’interface fournie (ou serveur) doit ˆtre « conforme » a l’interface ree ` quise (ou client), c’est-`-dire compatible avec elle ; nous revenons plus loin sur la d´finition a e de la conformit´. e

contract

service requester

service provider

client interface

server interface

conformance

Figure 2.3 – Interfaces

La repr´sentation concr`te d’une interface, fournie ou requise, consiste en un ensemble e e d’op´rations, qui peut prendre des formes diverses, correspondant aux patrons d’interace tion d´crits en 2.1.1. e
Certaines formes de service mettent en jeu plus de deux partenaires, par exemple un fournisseur avec demandeurs multiples, etc. Il est toujours possible de d´crire de telles situations par des relations bilat´rales e e entre un demandeur et un fournisseur, par exemple en d´finissant des interfaces virtuelles qui multiplexent e des interfaces r´elles, etc. e
3

2.1. SERVICES ET INTERFACES

25

– proc´dure synchrone ou appel de m´thode, avec param`tres et valeur de retour ; acc`s e e e e a un attribut, c’est-`-dire a une structure de donn´es (cette forme peut ˆtre convertie ` a ` e e dans la pr´c´dente au moyen de fonctions d’acc`s (en lecture, en anglais getter ou e e e en ´criture, en anglais setter ) sur les ´l´ments de cette structure de donn´es) ; e ee e – appel de proc´dure asynchrone ; e – source ou puits d’´v´nements ; e e – flot de donn´es fournisseur (output channel) ou r´cepteur (input channel) ; e e Le contrat associ´ a l’interface peut par exemple sp´cifier des contraintes sur l’ordre e ` e d’ex´cution des op´rations de l’interface (par exemple ouvrir un fichier avant de le lire). e e Les diverses formes de contrats sont examin´es dans la section 2.1.3. e Diverses notations, appel´es Langages de Description d’Interface (IDL), ont ´t´ con¸ues e ee c pour d´crire formellement des interfaces. Il n’y a pas actuellement de mod`le unique come e mun pour un IDL, mais la syntaxe de la plupart des IDLs existants est inspir´e par celle e d’un langage de programmation proc´dural. Certains langages (par exemple Java, C#) e comportent une notion d’interface et d´finissent donc leur propre IDL. Une d´finition e e d’interface typique sp´cifie la signature de chaque op´ration, c’est-`-dire son nom, son e e a type et le mode de transmission de ses param`tres et valeurs de retour, ainsi que les exe ceptions qu’elle peut provoquer a l’ex´cution (le demandeur doit fournir des traitants pour ` e ces exceptions). La repr´sentation d’une interface, avec le contrat associ´, d´finit compl`tement l’ine e e e teraction entre le demandeur et le fournisseur du service repr´sent´ par l’interface. En e e cons´quence, ni le demandeur ni le fournisseur ne doit faire d’autre hypoth`se sur son pare e tenaire que celles explicitement sp´cifi´es dans l’interface. En d’autre termes, tout ce qui e e est au-del` de l’interface est vu par chaque partenaire comme une « boˆ noire ». C’est le a ıte principe d’encapsulation, qui est un cas particulier de la s´paration des pr´occupations. Le e e principe d’encapsulation assure l’ind´pendance entre interface et r´alisation, et permet de e e modifier un syst`me selon le principe « je branche et ca marche »(plug and play) : un come ¸` posant peut ˆtre remplac´ par un autre a condition que les interfaces entre le composant e e ` remplac´ et le reste du syst`me restent compatibles. e e

2.1.3

Contrats et conformit´ e

Le contrat entre le fournisseur et le client d’un service peut prendre diverses formes, selon les propri´t´s sp´cifi´es et selon l’expression plus ou moins formelle de la sp´cification. ee e e e Par exemple, le terme Service Level Agreement (SLA) est utilis´ pour un contrat l´gal e e entre le fournisseur et le client d’un service global de haut niveau (par exemple entre un fournisseur d’acc`s a l’Internet (en anglais Internet Service Provider, ou ISP) et ses clients. e ` D’un point de vue technique, diff´rentes sortes de propri´t´s peuvent ˆtre sp´cifi´es. e ee e e e D’apr`s [Beugnard et al. 1999], on peut distinguer quatre niveaux de contrats. e – Le niveau 1 s’applique a la forme des op´rations, g´n´ralement en d´finissant des types ` e e e e pour les op´rations et les param`tres. Cette partie du contrat peut ˆtre statiquement e e e verifi´e. e – Le niveau 2 s’applique au comportement dynamique des op´rations de l’interface, en e sp´cifiant la s´mantique de chaque op´ration. e e e – Le niveau 3 s’applique aux interactions dynamiques entre les op´rations d’une ine terface, en sp´cifiant des contraintes de synchronisation entre les ex´cutions de ces e e

26

CHAPITRE 2.

PATRONS ET CANEVAS POUR L’INTERGICIEL

op´rations. Si le service est compos´ de plusieurs interfaces, il peut aussi exister des e e contraintes entre l’ex´cution d’op´rations appartenant a diff´rentes interfaces. e e ` e – Le niveau 4 s’applique aux propri´t´s extra-fonctionnelles, c’est-`-dire a celles qui ee a ` n’apparaissent pas explicitement dans l’interface. Le terme de « Qualit´ de Service » e (QoS) est aussi utilis´ pour ces propri´t´s, qui comprennent performances, securit´, e ee e disponibilit´, etc. e Notons encore que le contrat s’applique dans les deux sens, a tous les niveaux : il engage ` donc le demandeur aussi bien que le fournisseur. Par exemple, les param`tres pass´s lors e e d’un appel de fonction sont contraints par leur type ; si l’interface comporte un rappel, la proc´dure qui r´alise l’action correspondante cˆt´ client doit ˆtre fournie (cela revient a e e oe e ` sp´cifier une proc´dure comme param`tre). e e e L’essence d’un contrat d’interface est exprim´e par la notion de conformit´. Une ine e terface I2 est dite conforme a une interface I1 si un composant qui r´alise toute m´thode ` e e sp´cifi´e dans I2 peut partout ˆtre utilis´ a la place d’un composant qui r´alise toute e e e e ` e m´thode sp´cifi´e dans I1. En d’autres termes, I2 est conforme a I1 si I2 satisfait le e e e ` contrat de I1. La conformit´ peut ˆtre v´rifi´e a chacun des quatre niveaux d´finis ci-dessus. Nous les e e e e ` e examinons successivement. Contrats syntaxiques Un contrat syntaxique est fond´ sur la forme des op´rations. Un tel contrat s’exprime e e couramment en termes de types. Un type d´finit un pr´dicat qui s’applique aux objets 4 e e de ce type. Le type d’un objet X est not´ T (X ). La notion de conformit´ est exprim´e e e e par le sous-typage : si T2 est un sous-type de T1 (not´ T2 e T1 ), tout objet de type T2 est aussi un objet de type T1 (en d’autre termes, un objet de type T2 peut ˆtre utilis´ e e partout o` un objet de type T1 est attendu). La relation de sous-typage ainsi d´finie est u e appel´e sous-typage vrai, ou conforme. e Consid´rons des interfaces d´finies comme un ensemble de proc´dures. Pour de telles e e e interfaces, le sous-typage conforme est d´fini comme suit : une interface I2 est un sous-type e d’une interface de type I1 (not´ T (I2 ) e T (I1 )) si I2 a au moins le mˆme nombre de e proc´dures que I1 (elle peut en avoir plus), et si pour chaque proc´dure d´finie dans I1 e e e il existe une proc´dure conforme dans I2. Une proc´dure Proc2 est dite conforme a une e e ` proc´dure Proc1 lorsque les relations suivantes sont v´rifi´es entre les signatures de ces e e e proc´dures. e – Proc1 et Proc2 ont le mˆme nombre de param`tres et valeurs de retour (les excepe e tions d´clar´es sont consid´r´es comme des valeurs de retour). e e ee – pour chaque valeur de retour R1 de Proc1, il existe une valeur de retour correspondante R2 de Proc2 telle que T(R2) T(R1) (relation dite covariante). – pour chaque param`tre d’appel X1 de Proc1, il existe un param`tre d’appel correse e pondant X2 de Proc2 tel que T(X1) T(X2) (relation dite contravariante). Ces r`gles illustrent un principe g´n´ral de possibilit´ de substitution : une entit´ E2 e e e e e peut ˆtre substitu´e a une autre entit´ E1 si E2 « fournit au moins autant et requiert au e e ` e
4 Ici le terme d’objet d´signe toute entit´ identifiable dans le pr´sent contexte, par exemple une variable, e e e une proc´dure, une interface, un composant. e

2.1. SERVICES ET INTERFACES

27

plus autant » que E1. Ici les termes « fournit » et « requiert » doivent ˆtre ˆtre adapt´s e e e a chaque situation sp´cifique (par exemple dans un appel de proc´dure , les param`tres ` e e e d’appel sont « requis » et le r´sultat est « fourni »). La relation d’ordre qu’impliquent les e termes « au plus autant » et « au moins autant » est la relation de sous-typage. Notons que la relation de sous-typage d´finie dans la plupart des langages de programe mation ne satisfait g´n´ralement pas la contravariance des types de param`tres et n’est e e e donc pas un sous-typage vrai. Dans un tel cas (qui est par exemple celui de Java), des erreurs de conformit´ peuvent ´chapper a la d´tection statique et doivent ˆtre captur´es e e ` e e e par un test a l’ex´cution. ` e La notion de conformit´ peut ˆtre ´tendue aux autre formes de d´finitions d’interface, e e e e par exemple celles contenant des sources ou puits d’´v´nements, ou des flots de donn´es e e e (streams). Rappelons que la relation entre types est purement syntaxique et ne capture pas la s´mantique de la conformit´. La v´rification de la s´mantique est le but des contrats e e e e comportementaux. Contrats comportementaux Les contrats comportementaux sont fond´s sur une m´thode propos´e dans e e e [Hoare 1969] pour prouver des propri´t´s de programmes, en utilisant des pr´- et postee e conditions avec des r`gles de preuve fond´es sur la logique du premier ordre. Soit A une e e action s´quentielle. Alors la notation e {P} A {Q}, dans lequel P et Q sont des assertions (pr´dicats sur l’´tat de l’univers du programme), a e e le sens suivant : si l’ex´cution de A est lanc´e dans un ´tat dans lequel P est vrai, et si A e e e se termine, alors Q est vrai a la fin de cette ex´cution. Une condition suppl´mentaire peut ` e e ˆtre sp´cifi´e sous la forme d’un pr´dicat invariant I qui doit ˆtre preserv´ par l’ex´cution e e e e e e e de A. Ainsi si P et I sont initialement vrais, Q et I sont vrais a la fin de A, si A se termine. ` L’invariant peut ˆtre utilis´ pour sp´cifier une contrainte de coh´rence. e e e e Ceci peut ˆtre transpos´ comme suit en termes de services et de contrats. Avant e e l’ex´cution d’un service, e – le demandeur doit garantir la pr´condition P et l’invariant I, e – le fournisseur doit garantir que le service est effectivement delivr´ dans un temps e fini, et doit assurer la postcondition Q et l’invariant I. Les cas possibles de terminaison anormale doivent ˆtre sp´cifi´s dans le contrat et e e e trait´s par r´essai ou par la lev´e d’une exception. Cette m´thode a ´t´ d´velopp´e e e e e ee e e sous le nom de « conception par contrat » [Meyer 1992] via des extensions au langage Eiffel permettant l’expression de pr´- et post-conditions et de pr´dicats invariants. Ces e e conditions sont v´rifi´es a l’ex´cution. Des outils analogues ont ´t´ d´velopp´s pour Java e e ` e ee e e [Kramer 1998]. La notion de sous-typage peut ˆtre ´tendue aux contrats comportementaux, en e e sp´cifiant les contraintes de conformit´ pour les assertions. Soit une proc´dure Proc1 d´finie e e e e dans l’interface I1, et la proc´dure correspondante (conforme) Proc2 d´finie dans l’intere e face I2, telle que T (I2 ) T (I1 ). Soit P1 et Q1 (resp. P2 et Q2 ) les pr´- et post-conditions e d´finies pour Proc1 (resp. Proc2 ). Les conditions suivantes doivent ˆtre v´rifi´es : e e e e

28

CHAPITRE 2.

PATRONS ET CANEVAS POUR L’INTERGICIEL

P1 ⇒ P2 et Q2 ⇒ Q1 En d’autres termes, un sous-type a des pr´conditions plus faibles et des postconditions e plus fortes que son super-type, ce qui illustre de nouveau la condition de substitution. Contrats de synchronisation L’expression de la validit´ des programmes au moyen d’assertions peut ˆtre ´tendue e e e aux programmes concurrents. Le but ici est de s´parer, autant que possible, la description e des contraintes de synchronisation du code des proc´dures. Les expressions de chemin (path e expressions), qui sp´cifient des contraintes sur l’ordre et la concurrence de l’ex´cution des e e proc´dures, ont ´t´ propos´es dans [Campbell and Habermann 1974]. Les d´veloppements e ee e e ult´rieurs (compteurs et politiques de synchronisation) ont essentiellement ´t´ des extene ee sions et des raffinements de cette construction, dont la r´alisation repose sur l’ex´cution e e de proc´dures engendr´es a partir de la description statique des contraintes. Plusieurs are e ` ticles d´crivant des propositions dans ce domaine figurent dans [CACM 1993], mais ces e techniques n’ont pas trouv´ une large application. e Une forme tr`s simple de contrat de synchronisation est la clause synchronized de e Java, qui sp´cifie une ex´cution en exclusion mutuelle. Un autre exemple est le choix d’une e e politique de gestion de file d’attente (par exemple FIFO, priorit´, etc.) parmi un ensemble e pr´d´fini pour la gestion d’une resource partag´e. e e e Les travaux plus r´cents (voir par exemple [Chakrabarti et al. 2002]) visent a v´rifier les e ` e contraintes de synchronisation a la compilation, pour d´tecter assez tˆt les incompatibilit´s. ` e o e Contrats de Qualit´ de Service e Les sp´cifications associ´es a l’interface d’un syst`me ou d’une partie de syst`me, e e ` e e exprim´s ou non de mani`re formelle, sont appel´s fonctionnelles. Un syst`me peut en e e e e outre ˆtre l’objet de sp´cifications suppl´mentaires, qui s’appliquent a des aspects qui e e e ` n’apparaissent pas explicitement dans son interface. Ces sp´cifications sont dites extrae fonctionnelles 5 . La qualit´ de service (un autre nom pour ces propri´t´s) inclut les aspects suivants. e ee – Disponibilit´. La disponibilit´ d’un service est une mesure statistique de la fraction e e du temps pendant laquelle le service est prˆt a ˆtre rendu. Elle d´pend a la fois du e `e e ` taux de d´faillances du syst`me qui fournit le service et du temps n´cessaire pour e e e restaurer le service apr`s une d´faillance. e e – Performances. Cette qualit´ couvre plusieurs aspects, qui sont essentiels pour les e applications en temps r´el (applications dont la validit´ ou l’utilit´ repose sur des e e e contraintes temporelles). Certains de ces aspects sont li´s a la communication (bornes e ` sur la latence, la gigue, la bande passante) ; d’autres s’appliquent a la vitesse de ` traitement ou a la latence d’acc`s aux donn´es. ` e e – Securit´. La s´curit´ couvre des propri´t´s li´es a l’usage correct d’un service par e e e ee e ` ses utilisateurs selon des r`gles d’usage sp´cifi´es. Elle comprend la confidentialit´, e e e e l’int´grit´, l’authentification, et le contrˆle des droits d’acc`s. e e o e
Noter que la d´finition d’une sp´cification comme « fonctionnelle » ou « extra-fonctionnelle » n’est e e pas absolue, mais d´pend de l’´tat de l’art : un aspect qui est extra-fonctionnel aujourd’hui deviendra e e fonctionnel lorsque des progr`s techniques permettront d’int´grer ses sp´cifications dans celles de l’interface. e e e
5

2.2. PATRONS ARCHITECTURAUX

29

D’autres aspects extra-fonctionnels, plus difficiles a quantifier, sont la maintenabilit´ ` e et la facilit´ d’´volution. e e La plupart des aspects de qualit´ de service ´tant li´s a un environnement variable, e e e ` il est important que les politiques de gestion de la QoS puissent ˆtre adaptables. Les e contrats de QoS comportent donc g´n´ralement la possibilit´ de n´gociation, c’est-`-dire e e e e a de red´finition des termes du contrat via des ´changes, a l’ex´cution, entre le demandeur e e ` e et le fournisseur du service.

2.2

Patrons architecturaux

Dans cette section, nous examinons quelques principes de base pour la structuration des syst`mes intergiciels. La plupart des syst`mes examin´s dans ce livre sont organis´s e e e e selon ces principes, qui fournissent essentiellement des indications pour d´composer un e syst`me complexe en parties. e

2.2.1

Architectures multiniveaux

Architectures en couches La d´composition d’un syst`me complexe en niveaux d’abstraction est un ancien e e et puissant principe d’organisation. Il r´git beaucoup de domaines de la conception de e syst`mes, via des notions largement utilis´es telles que les machines virtuelles et les piles e e de protocoles. L’abstraction est une d´marche de conception visant a construire une vue simplifi´e e ` e d’un syst`me sous la forme d’un ensemble organis´ d’interfaces, qui ne rendent visibles e e que les aspects jug´s pertinents. La r´alisation de ces interfaces en termes d’entit´s plus e e e d´taill´es est laiss´e a une ´tape ult´rieure de raffinement. Un syst`me complexe peut ainsi e e e ` e e e ˆtre d´crit a diff´rents niveaux d’abstraction. L’organisation la plus simple (Figure 2.4a) est e e ` e une hi´rarchie de couches, dont chaque niveau i d´finit ses propres entit´s, qui fournissent e e e une interface au niveau sup´rieur (i+1). Ces entit´s sont r´alis´es en utilisant l’interface e e e e fournie par le niveau inf´rieur(i-1), jusqu’` un niveau de base pr´d´fini (g´n´ralement e a e e e e r´alis´ par mat´riel). Cette architecture est d´crite dans [Buschmann et al. 1995] sous le e e e e nom de patron Layers.
downcall Interface i-1 interface i level i interface i-1 level i-1 upcall upcall interface i

level i+1


base level

(a)

(b)

(c)

Figure 2.4 – Organisations de syst`mes en couches e

30

CHAPITRE 2.

PATRONS ET CANEVAS POUR L’INTERGICIEL

L’interface fournie par chaque niveau peut ˆtre vue comme un ensemble de fonctions e d´finissant une biblioth`que, auquel cas elle est souvent appel´e API (Application Programe e e 6 . Une vue alternative est de consid´rer chaque niveau comme une machine ming Interface) e virtuelle, dont le « langage » (le jeu d’instructions) est d´fini par son interface. En vertu du e principe d’encapsulation, une machine virtuelle masque les d´tails de r´alisation de tous e e les niveaux inf´rieurs. Les machines virtuelles ont ´t´ utilis´es pour ´muler un ordinateur e ee e e ou un syst`me d’exploitation au-dessus d’un autre, pour ´muler un nombre quelconque e e de ressources identiques par multiplexage d’une ressource physique, ou pour r´aliser l’ene vironnement d’ex´cution d’un langage de programmation (par exemple la Java Virtual e Machine (JVM) [Lindholm and Yellin 1996]). Ce sch´ma de base peut ˆtre ´tendu de plusieurs mani`res. Dans la premi`re extension e e e e e (Figure 2.4b), une couche de niveau i peut utiliser tout ou partie des interfaces fournies par les machines de niveau inf´rieur. Dans la seconde extension, une couche de niveau i peut e rappeler la couche de niveau i+1, en utilisant une interface de rappel (callback ) fournie par cette couche. Dans ce contexte, le rappel est appel´ « appel ascendant » (upcall) (par e r´f´rence a la hi´rarchie « verticale » des couches). ee ` e Bien que les appels ascendants puissent ˆtre synchrones, leur utilisation la plus e fr´quente est la propagation d’´v´nements asynchrones vers le haut de la hi´rarchie e e e e des couches. Consid´rons la structure d’un noyau de syst`me d’exploitation. La couche e e sup´rieure (application) active le noyau par appels descendants synchrones, en utilisant e l’API des appels syst`me. Le noyau active aussi les fonctions r´alis´es par le mat´riel e e e e (par exemple mettre a jour la MMU, envoyer une commande a un disque) par l’´quivalent ` ` e d’appels synchrones. En sens inverse, le mat´riel active typiquement le noyau via des intere ruptions asynchrones (appels ascendants), qui d´clenchent l’ex´cution de traitants. Cette e e structure d’appel est souvent r´p´t´e aux niveaux plus ´lev´s : chaque couche re¸oit des ape ee e e c pels synchrones de la couche sup´rieure et des appels asynchrones de la couche inf´rieure. e e Ce patron, d´crit dans [Schmidt et al. 2000] sous le nom de Half Sync, Half Async, e est largement utilis´ dans les protocoles de communication. e Architectures multi´tages e Le d´veloppement des syst`mes r´partis a promu une forme diff´rente d’architecture e e e e multiniveaux. Consid´rons l’´volution historique d’une forme usuelle d’applications cliente e serveur, dans laquelle les demandes d’un client sont trait´es en utilisant l’information e stock´e dans une base de donn´es. e e Dans les ann´es 1970 (Figure 2.5a), les fonctions de gestion de donn´es et l’application e e elle-mˆme sont ex´cut´es sur un serveur central (mainframe). Le poste du client est un e e e simple terminal, qui r´alise une forme primitive d’interface utilisateur. e Dans les ann´es 1980 (Figure 2.5b), les stations de travail apparaissent comme machines e clientes, et permettent de r´aliser des interfaces graphique ´labor´es pour l’utilisateur. e e e Les capacit´s de traitement de la station cliente lui permettent en outre de participer au e traitement de l’application, reduisant ainsi la charge du serveur et am´liorant la capacit´ de e e croissance (car l’addition d’une nouvelle station cliente ajoute de la puissance de traitement
6 Une interface complexe peut aussi ˆtre partitionn´e en plusieurs APIs, chacune ´tant li´e a une fonction e e e e ` sp´cifique. e

L’architecture multi´tages conserve l’avantage du passage a grande ´chelle. puisque les interfaces logiques co¨ e e ıncident maintenant avec les interfaces de communication. e e e e nous nous int´ressons ici a une forme particuli`re de canevas compos´e d’une infrastructure e ` e e . application data management (a) user interface application data management user interface application data management (c) (b) Figure 2. l’interface de communication est a pr´sent interne a l’appli` e ` cation.5 – Architectures multi´tages e Ces d´fauts sont corrig´s par l’architecture d´crite sur la Figure 2. et ´ventuellement une modification de l’interface e de communication. e e e Canevas Un canevas logiciel (en anglais framework ) est un squelette de programme qui peut ˆtre directement r´utilis´.5c.3. ou pour int´grer une application patrie e moniale. a condition e ` e ` que les serveurs puissent ˆtre renforc´s de mani`re incr´mentale (par exemple en ajoutant e e e e des machines a une grappe). PATRONS ARCHITECTURAUX 31 pour les applications). Une modification de cette derni`re peut maintenant impliquer des changements a e ` la fois sur les machines client et serveur. l’application proprement dite r´side e e sur un serveur dedi´. et la gestion de la base de donn´es est d´volue a une autre machine. L’inconv´nient de cette architecture est que l’application est maintenant a cheval sur e ` les machines client et serveur . Une e e sp´cialisation plus fine des fonctions donne lieu a d’autres architectures multi´tages. Cette d´finition recouvre de nombreux cas d’esp`ce . En outre les interfaces entre ´tages peuvent ˆtre con¸ues ` e e c pour favoriser la s´paration de pr´occupations. pour accepter e e e e e facilement un nouveau type de base de donn´es. ou adapt´ selon des r`gles bien d´finies.2. l’interface entre l’´tage e d’application et l’´tage de gestion de donn´es peut ˆtre rendue g´n´rique. Les fonctions de l’application sont partag´es entre trois machines : e e la station client ne r´alise que l’interface graphique. Noter e ` e que chaque ´tage peut lui-mˆme faire l’objet d’une d´composition « verticale » en niveaux e e e d’abstraction. Par exemple.4) pour la conversion d’interface. Des exemples d’architectures multi´tages sont pr´sent´s dans le chapitre 5. introduite a la e e e ` fin des ann´es 1990. e e e ` Chacune de ces divisions « horizontales » est appel´e un ´tage (en anglais tier ). en utilisant un adaptateur (section 2. pour r´soudre une e e e e e e e famille de probl`mes apparent´s.2.

Ainsi une requˆte d’un client est trait´e par le canevas. qui active e e les composant applicatifs appropri´s. e – Le noyau analyse l’appel et active le micronoyau en utilisant la fonction appropri´e e de son API. qui termine le travail et revient a l’application. Ces canevas illustrent des notions relatives aux interfaces. interagit avec eux en utilisant ses propres API et e l’interface de rappel des composants.6 – Architectures de canevas Le second exemple (Figure 2. interface de r´seau). le micronoyau peut interagir avec le mat´riel . aux rappels et a e ` l’inversion du contrˆle. Un noyau de syst`me d’exploitation construit sur un micronoyau est g´n´ralement e e e organis´ comme un ensemble de serveurs. qui r´alise un syst`me d’exploitation sp´cifique (une « personnalit´ ») en e e e e utilisant l’API du micronoyau. – Le micronoyau rend la main au noyau. Des exemples d´taill´s de cette organisation sont pr´sent´s au chapitre 5. syst`me de fichiers. Ce canevas interagit avec l’´tage client et avec l’´tage ` e e e de gestion de donn´es. e e e e .6b) illustre l’organisation typique de l’´tage m´dian d’une e e architecture client-serveur a 3 ´tages. Ce programme est organis´ comme un ensemble e de composants.6a) est le micronoyau. une architecture introduite dans les ann´es 1980 et visant a d´velopper des syst`mes d’exploitation facilement configurables. par e e e ee exemple si plusieurs serveurs sont en jeu. Un appel syst`me typique ´mis par une e e e application est trait´ comme suit . il faut donc d´velopper et int´grer un ` e e nouveau serveur. qui g`re les resources mat´rielles (processeurs.). entr´es-sorties. et retourne finalement au client. application application components kernel server callback interface microkernel API callback interface callback interface client application data management microkernel hardware framework API (a) microkernel (b) middle tier framework Figure 2. ` Pour ajouter une nouvelle fonction a un noyau. etc. Au retour de cet appel ascendant. – Le micronoyau rappelle un serveur dans le noyau. PATRONS ET CANEVAS POUR L’INTERGICIEL dans laquelle des composants logiciels peuvent ˆtre ins´r´s en vue de fournir des services e ee sp´cifiques. dont chacun est charg´ d’une fonction sp´cifique e e e (gestion de processus. et sert de m´diateur pour l’interaction entre ces ´tages et le proe e e gramme de l’application proprement dite. e ` e e Un syst`me d’exploitation a micronoyau se compose de deux couches : e ` – Le micronoyau proprement dit. et fournit au niveau sup´rieur une e e e e API abstraite de gestion de ressources. cette s´quence peut ˆtre it´r´e. qui utilisent l’API fournie par le canevas et doivent fournir un ensemble d’interfaces de rappel.32 CHAPITRE 2. o Le premier exemple (Figure 2. – Le noyau. e e m´moire.

ou par red´finition e e e e (surcharge) de m´thodes existantes. e e e Les instances d’une classe sont cr´´es dynamiquement. particuli`rement dans le contexte de la e programmation r´partie. ` e e – Classes et instances. sont pr´sent´s dans la section suivante. L’organisation interne de chaque couche ou ´tage (ou couche dans e e un ´tage) utilise elle-mˆme des entit´s de grain plus fin. Un changement dans la r´alisation d’un objet est fonctionnellement ine visible a ses utilisateurs. e e e Comme indiqu´ en 2. Une classe est une description g´n´rique commune a un ene e ` semble d’objets (les instances de la classe). un document. en fournissant des interfaces de rappel sp´cifi´es et en utilisant e e l’API du canevas.2. ` e e – Polymorphisme.1. Le polymorphisme est la capacit´. et elle est identifi´e comme une entit´ distincte. qui comprend un ensemble de m´thodes e (proc´dures) et d’attributs (valeurs qui peuvent ˆtre lues et modifi´es). mais chaque instance e e e a son propre exemplaire de l’´tat. pour une m´thode. un moyen usuel de e e e d´finir cette structure fine. est une repr´sentation logicielle d’une e e entit´ du monde r´el (telle qu’une personne. elles peuvent aussi ˆtre dynamiquement d´truites. Les instances d’une classe ont la mˆme e interface (donc le mˆme type).2. dans un mod`le de programmation.). l’encapsulation assure l’ind´pendance entre interface et e e r´alisation. Ces modules doivent respece e ter le contrat du canevas. et leur ´tat a la mˆme structure . d’accepter des e e . Les seules parties de l’´tat visibles depuis l’ext´rieur de l’objet sont celles e e explicitement pr´sentes dans l’interface . soit explicitement e e soit automatiquement (par un ramasse-miettes) selon la r´alisation sp´cifique du e e mod`le d’objet. mais les propri´t´s e e ee suivantes en capturent les concepts plus courants. e e e e ee – Encapsulation. e e e 2. Pour fournir ses services. ou composants applicatifs dans l’´tage m´dian). un compte bancaire. Le mod`le d’objets que nous consid´rons a les propri´t´s suivantes. tant que l’interface est pr´serv´e. Un objet est l’association d’un ´tat et d’un ensemble de proc´dures (ou m´thodes) e e e qui op`rent sur cet ´tat. e e etc.2 Objets r´partis e Programmation par objets Les objets ont ´t´ introduits dans les ann´es 1960 comme un moyen de structuration ee e des syst`mes logiciels. Le type d’un objet est d´fini par son interface. On dit que la classe d´riv´e ´tend la classe inie e e e tiale (ou classe de base) ou qu’elle h´rite de cette classe. par une op´ration appel´e ee e e instanciation .2. Un objet a une interface. Les organisations en couches et en ´tages d´finissent une structure a gros grain pour e e ` un syst`me complexe. Les objets.2. o le canevas utilise des rappels vers les modules logiciels externes (serveurs dans l’exemple micronoyau. Une classe peut d´river d’une autre classe par sp´cialisation. autrement e e e dit par d´finition de m´thodes et/ou d’attributs suppl´mentaires. une voiture. e Un objet. Il existe de nombreuses d´finitions des objets. L’interface joue le rˆle d’un contrat entre l’utilisateur et le r´alisateur e o e d’un objet. PATRONS ARCHITECTURAUX 33 Les deux exemples ci-dessus illustrent l’inversion du contrˆle. La seule e e e mani`re d’acc´der a un objet (pour consulter ou modifier son ´tat) est d’utiliser son e e ` e interface. e – H´ritage. l’utilisation d’un objet ne doit reposer sur e aucune hypoth`se sur sa r´alisation. Certains mod`les permettent e e a une classe d’h´riter de plus d’une classe (h´ritage multiple).

qui peut avoir des r´alisations diff´rentes sur ıtre e e diff´rents sites. les objets peuvent ˆtre actifs. plus sp´cialis´es. Eiffel. Pour que le syst`me fonctionne. par e e e e un objet « compatible ». e e – L’h´t´rog´n´it´ est un trait dominant de ces syst`mes. car il permet de d´finir une nouvelle e e e e interface a partir d’une interface existante. dans e e e ce cas l’intergiciel doit fournir un m´canisme pour la cr´ation d’objets distants. ´ventuellement sur des sites distants diff´rents . sous e e la forme de fabriques (voir section 2. Des classes ` sp´cifiques.2).). e e e e Par exemple. ou conformit´ (voir section e e 2. La notion de compatibilit´. comme param`tre d’une m´thode. PATRONS ET CANEVAS POUR L’INTERGICIEL param`tres de diff´rents types et d’avoir un comportement diff´rent pour chacun de e e e ces types. Une application cliente peut e utiliser un objet situ´ sur un site distant en appelant une m´thode de l’interface de l’objet. Une application qui utilise des flots e e e d’objets vid´o accepte aussi des flots d’objets en couleur. qui d´pend du mod`le sp´cifique de e e e e programmation ou du langage utilis´. on con¸oit d’abord une classe (de base) g´n´rique pour capturer un ene c e e semble de traits communs a une large gamme de situations attendues. L’encapsulation est un outil ee e e e e puissant dans un environnement h´t´rog`ne : l’utilisateur d’un objet doit seulement ee e connaˆ une interface pour cet objet. mais elles sont repr´sentatives d’un vaste e e ensemble de mod`les utilis´s dans la pratique. l’objet est l’unit´ de r´partition .3) est exprim´e par une relation entre types. puisque ces objets r´alisent e e l’interface des flots vid´o (c’est un exemple de polymorphisme). Il est donc utile pour les d´veloppeurs ` e d’applications r´parties. sont alors d´finies par extension de la classe de base. une interface pour un flot vid´o en couleur peut ˆtre d´finie comme e e e une extension de celle d’un flot vid´o g´n´rique. ou C#. e e comme si l’objet ´tait local. un intergiciel e e . etc. Pour utiliser e l’h´ritage. Objets distants Les propri´t´s ci-dessus font que les objets sont un bon m´canisme de structuration ee e pour les syst`mes r´partis. – L’h´ritage est un m´canisme de r´utilisation.3.1. e – La cr´ation dynamique d’instances d’objets permet de construire un ensemble d’obe jets ayant la mˆme interface. e Rappelons que ces d´finitions ne sont pas universelles.34 CHAPITRE 2. et ne sont pas applicables a tous e ` les mod`les d’objets (par exemple il y a d’autres m´canismes que les classes pour cr´er des e e e instances. et leur mode d’interaction est l’appel d’objet distant (Remote Method Invocation) . Les objets distants sont un exemple d’une organisation client-serveur. Ainsi un objet peut ˆtre remplac´. Comme un client peut utiliser plusieurs objets diff´rents situ´s sur un mˆme site distant. qui travaillent dans un environnement changeant et doivent e d´finir de nouvelles classes pour traiter des nouvelles situations. Java. c’est la transposition du RPC au monde des objets. e La mani`re la plus simple et la plus courante pour r´partir des objets est de permettre e e aux objets qui constituent une application d’ˆtre situ´s sur un ensemble de sites r´partis e e e (autrement dit. Des objets utilis´s de cette mani`re sont appel´s objets dise e e e tants. C++. des termes distincts e e e sont utilis´s pour d´signer le site distant (le site serveur ) et un objet individuel qui fournit e e un service sp´cifique (un objet servant). d’autres m´thodes permettent de pare e e titionner la repr´sentation d’un objet entre plusieurs sites). et sont mises en œuvre dans des langages e e tels que Smalltalk.

e bien que son domaine d’application ait ´t´ ´tendu a de nombreuses autres constructions.3. r´aliser l’appel effectif. communicant au moyen d’ape pels de m´thode a distance : un client demande un service fourni par un objet e ` ´ventuellement distant (le servant). l’appel proprement dit est ensuite r´alis´. e e e 2. 1995]. 1994]. Nous n’examinons ici que son utilisation pour les objets r´partis. Dans cette pr´sentation. Le patron Proxy est utilis´ pour des applications organis´es comme e e un ensemble d’objets dans un environnement r´parti. ou ORB).` ´ 2. ee e e [Buschmann et al. eee ` 1.1 Proxy Proxy (ce terme anglais est traduit par « repr´sentant » ou « mandataire ») est un e des premiers patrons de conception identifi´s en programmation r´partie [Shapiro 1986.3. et renvoyer e e les r´sultats a l’appelant.7 – Appel de m´thode a distance e ` La structure d’ensemble d’un appel a un objet distant (Figure 2. ce qui est g´n´ralement fait au e e e e moyen d’un serveur des noms ou d’un service vendeur (trader ) . Pour une discussion plus approfondie de e ces patrons. L’ORB sert de m´diateur aussi bien pour la recherche que pour l’appel.3 Patrons pour l’intergiciel ` objets r´partis a e Les m´canismes d’ex´cution a distance reposent sur quelques patrons de conception e e ` qui ont ´t´ largement d´crits dans la litt´rature. et nous e e ` examinons leurs similitudes et leurs diff´rences. et [Schmidt et al. e . 1995]. voir les r´f´rences indiqu´es. PATRONS POUR L’INTERGICIEL A OBJETS REPARTIS 35 appropri´ doit localiser une r´alisation de l’objet servant sur un site ´ventuellement distant. Contexte. en particulier dans [Gamma et al. e e e envoyer les param`tres sur l’emplacement de l’objet. e Client ORB Name server register Servant lookup return ref to servant invoke return Figure 2. e e Buschmann et al.7) est semblable a ` ` celle d’un RPC : l’objet distant doit d’abord ˆtre localis´. 2000]. nous mettons e l’accent sur l’utilisation sp´cifique de ces patrons pour l’intergiciel r´parti a objets. ee e 2. Un intergiciel qui r´alise ces fonctions est un courtier d’objets e ` e r´partis (en anglais Object Request Broker.

e Client Proxy Servant service request pre-processing Interface I Interface I service request result result post-processing (usually: remote call) Figure 2. L’acc`s doit ˆtre efficace a l’ex´cution. ou mandataire. utilisant le protocole de communication sous-jacent pour envoyer la requˆte et pour recevoir la r´ponse. ` e e – l’appel effectif du servant. Ils n’ajoutent aucune fonction. il ne doit pas y avoir de diff´rence entre e e e acc`s local et acc`s distant (cette propri´t´ est appel´e transparence d’acc`s). La programmation e e e e e ` e doit ˆtre simple pour le client . et qui ne n´cessite pas une connaissance e d´taill´e des protocoles de communication par le client. e 5. id´alement. qui consiste essentiellement a d´baller les valeurs ` e de retour. e e – une phase de pr´-traitement. PATRONS ET CANEVAS POUR L’INTERGICIEL 2. Utiliser un repr´sentant local du serveur sur le site du client. D´finir un m´canisme d’acc`s qui n’implique pas de coder « en dur » e e e e l’emplacement du servant dans le code client. e e ee e e 4. e e 3. e Des variantes des proxies contiennent des fonctions suppl´mentaires.8.36 CHAPITRE 2. qui facilite sa e e g´n´ration automatique. Toute e e l’information relative au syst`me de communication et a la localisation du servant e ` est cach´e dans le mandataire. e L’organisation d’un mandataire est illustr´e sur la figure 2. Ce e repr´sentant. a exactement la mˆme interface que le servant. La principale contrainte r´sulte de l’environnement r´parti : le client e e et le serveur sont dans des espaces d’adressage diff´rents. Dans la construction de l’intergiciel. e e – une phase de post-traitement. C’est e le cas des souches (stubs) et des squelettes utilis´s dans RPC ou Java-RMI. Solution. Probl`me. Contraintes.8 – Le patron Proxy La structure interne d’un mandataire suit un sch´ma bien d´fini. Usages connus. et ainsi rendue invisible au client. 6. Des exemples e en sont les caches et l’adaptation cˆt´ client. le proxy peut oe . les mandataires sont utilis´s comme e repr´sentants locaux pour des objets distants. qui consiste essentiellement a emballer les param`tres e ` e et a pr´parer le message de requˆte. Propri´t´s souhait´es. Dans ce dernier cas.

Contraintes. Factory est un des patrons les plus largement utilis´s dans l’intergiciel. On souhaite pouvoir cr´er dynamiquement des familles d’objets appae e rent´s (par exemple des instances d’une mˆme classe).5). e e e 2. Propri´t´s souhait´es.` ´ 2. Utiliser deux patrons corr´l´s : une usine abstraite Abstract Factory ee d´finit une interface et une organisation g´n´riques pour la cr´ation d’objets . Usages connus. 1994]. e 6. Un autre mani`re d’am´liorer la souplesse est d’utiliser une usine de fabrication e e d’usines. r´solution. et pour d´truire un objet sur demande. PATRONS POUR L’INTERGICIEL A OBJETS REPARTIS 37 filtrer la sortie du serveur pour l’adapter aux capacit´s sp´cifiques d’affichage du e e client (couleur.3. L’´volution du e e e e e m´canisme doit ˆtre facilit´e (pas de d´cision « en dur »).3. comme illustr´ sur la Figure 2. De tels mandataires « intelligents » (smart proxies) e combinent les fonctions standard d’un mandataire avec celles d’un intercepteur (voir section 2. Probl`me. e e [Buschmann et al. 7. 2. e 7. Abstract Factory peut ˆtre r´alis´ e ee e ` e e e e en utilisant Factory Methods (une m´thode de cr´ation red´finie dans une souse e e classe).3. 1994]. On consid`re des applications organis´es comme un ensemble d’objets e e dans un environnement r´parti (la notion d’objet dans ce contexte peut ˆtre tr`s e e e g´n´rale. Contexte.2 Factory 1. R´f´rences. R´f´rences. ee Une discussion du patron Proxy peut ˆtre trouv´e dans [Gamma et al. la e e e e cr´ation est d´l´gu´e a des usines concr`tes. Le processus de cr´ation doit pouvoir ˆtre param´tr´. e e Un usine peut aussi ˆtre utilis´e comme un gestionnaire des objets qu’elle a cr´´s. ee Les deux patrons Abstract Factory et Factory Method sont d´crits dans e [Gamma et al.9 (le m´canisme de cr´ation est lui-mˆme e e e e param´tr´). e e e 3. La principale contrainte r´sulte de l’environnement r´parti : le client e e (qui demande la cr´ation de l’objet) et le serveur (qui cr´e effectivement l’objet) sont e e dans des espaces d’adressage diff´rents. e e e e 4. et e e ee peut ainsi r´aliser une m´thode pour localiser un objet (en renvoyant une r´f´rence e e ee pour cet objet). Les d´tails de r´alisation des objets cr´´s doivent ˆtre e e e e e ee e invisibles. tout en permettant de reporter e e certaines d´cisions jusqu’` la phase d’ex´cution (par exemple le choix d’une classe e a e concr`te pour r´aliser une interface donn´e). Les usines e ` sont aussi utilis´es en liaison avec les composants (voir chapitres 5 et 7). e 5.). Solution. Il sert a e ` la fois dans des applications (pour cr´er des instances distantes d’objets applicatifs) e et dans l’intergiciel lui-mˆme (un exemple courant est l’usine a liaisons). 1995]. etc. . et n’est pas limit´e au domaine strict de la programmation par objets).

put(obj)} } Les op´rations init et cleanup permettent respectivement. en construisant a l’avance (lors d’une phase e ` d’initialisation) une r´serve (pool) d’objets. d’initialiser e e l’´tat de l’objet cr´´ et de remettre l’objet dans un ´tat neutre. Les op´rations de e e ` e e e cr´ation et de destruction deviennent alors : e Obj create(params) { if (pool empty) obj = new Obj /* utilise Factory */ else obj = pool.3. On peut encore raffiner le fonctionnement en e maintenant le nombre d’objets dans la r´serve au-dessus d’un certain seuil. Cette r´gulation e e e peut ´ventuellement se faire en travail de fond pour profiter des temps libres. pour r´pondre aux demandes le plus fr´quemment e e e e e . en d´clenchant e e les cr´ations n´cessaires si ce nombre d’objets tombe au-dessous du seuil. Il est possible d’ajuster la taille e e e du pool en fonction de la demande observ´e. e Trois cas fr´quents d’usage de ce patron sont : e – La gestion de la m´moire.cleanup() pool.9 – Le patron Factory 2. Cela se justifie si le coˆ t de la cr´ation et de e u e la destruction est ´lev´ par rapport a celui des op´rations sur la r´serve. Dans ce cas. PATRONS ET CANEVAS POUR L’INTERGICIEL FactoryFactory create Client Factory with parameters request for creation optional create Object return object reference possible delegation from abstract to concrete factory request for removal optional Figure 2. si n´cessaire. e ee e On a suppos´ ici que la taille de la r´serve ´tait fixe.38 CHAPITRE 2.3 Pool Le patron Pool est un compl´ment a Factory.get() obj.init(params) return (obj) } remove(Obj obj) { if (pool full) delete(obj) else { obj. on peut pr´voir plusieurs r´serves de zones e e e pr´allou´es de tailles diff´rentes. qui vise a r´duire le temps d’ex´cution e ` ` e e de la cr´ation et de la destruction d’objets.

10). Probl`me. Il doit ˆtre r´utilisable (c’est-`-dire g´n´rique). e 5. fournissent des services. e e des servants. pour r´pondre a des changements e e e ` impr´vus des besoins. Usages connus. . voir chapitre 5) Dans tous ces cas. – La gestion des composants dans certains canevas (par exemple les Entity Beans dans la plate-forme EJB. e e Client Adapter Servant service request pre-processing service request result Interface I1 result post-processing Interface I2 Figure 2. Contraintes. Le contexte est celui de la fourniture de services.4 Adapter 1. e – La gestion des threads ou des processus. les clients demandent des services . ` 3. On souhaite r´utiliser un servant existant en le dotant d’une nouvelle e e interface conforme a celle attendue par un client (ou une classe de clients).3. e e e a e e 4. ou wrapper ) qui isole le servant en interceptant les appels de m´thode a son interface. PATRONS POUR L’INTERGICIEL A OBJETS REPARTIS 39 observ´es. Contexte. Pas de contraintes sp´cifiques. Les param`tres et e e r´sultats peuvent n´cessiter une conversion. Il doit aussi ˆtre facilement adaptable. 6. situ´s sur des serveurs distants. Propri´t´s souhait´es. un adaptateur peut ˆtre automatiquement engendr´ a partir e e` d’une description des interfaces fournie et requise. e 2.` ´ 2. dans un environnement r´parti : un service est d´fini par une interface . Solution. le coˆ t ´lev´ de cr´ation des entit´s justifie largement l’usage d’une u e e e e r´serve. Chaque appel est pr´c´d´ par un e ` e e e prologue et suivi par un ´pilogue dans l’adaptateur (Figure 2.10 – Le patron Adapter Dans des cas simples. Le m´canisme de conversion d’interface doit ˆtre efficace a e e e e e ` l’ex´cution.3. Fournir un composant (l’adaptateur. e 2.

5 Interceptor 1. 2.11 – Formes simples d’intercepteur Ce m´canisme peut ˆtre r´alis´ sous diff´rentes formes. synchrone ou asynchrone. e e . Contraintes.40 CHAPITRE 2. Des exemples sont le Portable Objet Adapter (POA) de CORBA et oe les divers adaptateurs pour la r´utilisation de logiciel patrimoniaux (legacy systems). Un e e e patron apparent´ est Wrapper Facade ([Schmidt et al. e e e 5.11a et 2. qui peut ˆtre fond´ sur une analyse du contenu. 2000]). Propri´t´s souhait´es. 7. 1994]. ee Adapter (´galement appel´ Wrapper) est d´crit dans [Gamma et al. Le m´canisme doit ˆtre g´n´rique (applicable a une large e e e e e e e ` vari´t´ de situations). On veut ajouter de nouvelles capacit´s a un service existant. e (a) Client Servant I Interface I (c) Servant Client I Interceptor I Servant (b) Client I Interceptor I Servant I Servant Figure 2.). les clients demandent des services . dans un environnement r´parti : un service est d´fini par une interface . PATRONS ET CANEVAS POUR L’INTERGICIEL Les adaptateurs sont largement utilis´s dans l’intergiciel pour encapsuler des fonce tions cˆt´ serveur. ou e intercepteurs. ou fournir e e ` le service par un moyen diff´rent. e e les servants. Il doit permettre de modifier un service aussi bien statiquement ee (` la compilation) que dynamiquement (` l’ex´cution). fournissent des services. par exemple l’ajout e e de fonctions de tol´rance aux fautes.3. Dans la forme la plus simple. Probl`me. Cr´er (statiquement ou dynamiquement) des objets d’interposition. Contexte. Il peut aussi ˆtre utilis´ comme un aiguillage entre plusieurs servants qui peuvent e e fournir le mˆme service avec diff´rentes options (Figure 2. Solution. e tel que Java Connector Architecture (JCA). Les services peuvent ˆtre ajout´s ou supprim´s dynamiquement. e 3. d’´quilibrage de charge ou de caches. qui fournit une e ¸ interface de haut niveau (par exemple sous forme d’objet) a des fonctions de bas ` niveau.11c). Ces objets interceptent les appels (et/ou les retours) et ins´rent un e traitement sp´cifique. Il n’y a pas de e restrictions sur la forme de la communication (uni. R´f´rences. Le contexte est celui de la fourniture de services.or bi-directionnelle. 2. Un intercepteur e e e peut aussi rediriger un appel vers une cible diff´rente. e e e e e un intercepteur est un module qui est inser´ a un point sp´cifi´ dans le chemin e ` e e d’appel entre le demandeur et le fournisseur d’un service (Figure 2.11b). a a e 4. etc. situ´s sur des serveurs distants.

6 Comparaison et combinaison des patrons Trois des patrons d´crits ci-dessus (Proxy. R´f´rences.` ´ 2. ee Le patron Interceptor est d´crit dans [Schmidt et al. 2000]. Le servant peut fournir des fonctions de rappel utilisables par l’intercepteur. e e – pour choisir une r´alisation sp´cifique d’un servant a l’ex´cution.3).3. En outre.4. – pour ajouter des nouvelles capacit´s a des applications ou syst`mes existants. 1993]. e e e – Adapter vs Proxy. e e Supporting infrastructure create Client Servant Interceptor create service request Interface I use service Interface I callback result Figure 2. Proxy e . Les e Portable Interceptors de CORBA donnent une mani`re syst´matique d’´tendre e e e les fonctions du courtier d’objets (ORB) par insertion de modules d’interception en des points pred´finis dans le chemin d’appel. Proxy pr´serve l’interface. Un autre usage est l’aide aux e m´canismes de tol´rance aux fautes (par exemple la gestion de groupes d’objets). intercepteurs et fournisseurs de service e e (servants) sont g´r´s par une infrastructure commune et cr´´s sur demande. Usages connus. Les intercepteurs sont utilis´s dans une grande vari´t´ de situations dans les syst`mes e ee e intergiciels. alors qu’Adapter transforme l’interface. Adapter. – pour r´aliser un intergiciel r´flexif (voir 2.12 – Forme g´n´rale d’un intercepteur e e 7. e e ` e – pour r´aliser un canevas pour des applications a base de composants (voir chapitres e ` 5 et 7). PATRONS POUR L’INTERGICIEL A OBJETS REPARTIS 41 Sous une forme plus g´n´rale (Figure 2. Nous r´sumons ci-apr`s leurs analogies et leurs diff´rences. Ils reposent tous trois sur un module logiciel inser´ entre le demandeur e et le fournisseur d’un service.1 and 2. 6.12). e 2. Un e ` e exemple ancien est le m´canisme des « sous-contrats »[Hamilton et al.4.3. et Interceptor) ont d’´troites e e relations mutuelles. Adapter et Proxy ont une structure semblable. L’interee ee cepteur utilise l’interface du servant et peut aussi s’appuyer sur des services fournis par l’infrastructure.

alors que Adapter est e ` g´n´ralement local. Un Proxy peut ˆtre vu comme une forme sp´ciale d’un e e Interceptor. la programe e ` e mation par aspects. Client Servant Factory Proxy Adapter Client-side Interceptor Server-side Interceptor Communication system Figure 2. e e e ` d’une mani`re ind´pendante des protocoles de communication. PATRONS ET CANEVAS POUR L’INTERGICIEL implique souvent (pas toujours) un acc`s a distance. un proxy peut ˆtre combin´ avec un intercepteur. on peut tracer un premier sch´ma grossier et income plet de l’organisation d’ensemble d’un ORB (Figure 2. Elles sont r´sum´es dans les sections e e qui suivent. devenant ainsi e e e « intelligent » (c’est-`-dire fournissant de nouvelles fonctions en plus de la transmisa sion des requˆtes. et les approches pragmatiques. e e En utilisant les patrons ci-dessus. en utilisant une e repr´sentation causalement connect´e de lui-mˆme.1 Protocoles ` m´ta-objets a e La r´flexion a ´t´ introduite au chapitre 1.42 CHAPITRE 2. comme mene e tionn´ dans 2. Rappelons qu’un syst`me e ee e r´flexif est capable d’examiner et de modifier son propre comportement.13 – Utilisation de patrons dans un ORB Les principaux aspects manquants sont ceux relatifs a la liaison et a la communication.4 Adaptabilit´ et s´paration des pr´occupations e e e Trois approches principales sont utilis´es pour assurer l’adaptabilit´ et la s´paration e e e de pr´occupations dans les syst`mes intergiciels : les protocoles a m´ta-objets. 2. e e – Adapter vs Interceptor.13). section 1. Adapter et Interceptor ont une fonction semblable : l’un et l’autre modifient un service existant.3.4. e en la rempla¸ant par un servant diff´rent). e e e . mais laissant l’interface inchang´e).2. alors que Interceptor transforme la fonction (de fait Interceptor peut compl`tement masquer la cible initiale de l’appel. ` ` 2.4. En fait. c e – Proxy vs Interceptor. en r´alisant les transformations de donn´es n´cessaires a la transmission. La principale diff´rence est e que Adapter transforme l’interface. dont la fonction se r´duit a acheminer une requˆte vers un servant e ` e distant.1.

il peut imprimer le nom de la m´thode e en vue d’une trace avant son ex´cution effective (en appelant une m´thode telle que e e m.meth(params) client object Obj Figure 2.14 – Ex´cution d’un appel de m´thode dans un syst`me r´flexif e e e e 2. L’ex´cution d’un appel de m´thode Obj. Pour prendre un exemple simple.´ ´ ´ 2. parce qu’un tel syst`me e ee e e fonctionne dans un environnement qui ´volue. qui utilise une repr´sentation des entit´s du niveau de base pour e e e observer ou modifier le comportement de ce niveau. params) Meta_Obj. qui contient une repr´sentation de e e e e meth et params. 1991]. dont chacun e e ` e e est une repr´sentation. ADAPTABILITE ET SEPARATION DES PREOCCUPATIONS 43 La r´flexion est une propri´t´ int´ressante pour un intergiciel. et doit adapter son comportement a des bee ` soins changeants. e e e client Obj. Cette d´composition peut ˆtre it´r´e en consid´rant le m´ta-niveau comme un niveau e e ee e e de base pour un m´ta-m´ta-niveau. Des e e e plates-formes intergicielles dont l’architecture de base int`gre la r´flexion sont d´velopp´es e e e e comme prototypes de recherche [RM 2000]. L’appel de m´thode est r´ifi´ dans un objet m. qui ex´cute M´ta Obj. – Le niveau de base. e e e e Dans la plupart des cas pratiques. la tour est limit´e a deux ou trois niveaux. pour des traits isol´s.m´ta MethodCall(m). Une approche g´n´rale de la conception d’un syst`me r´flexif consiste a l’organiser en e e e e ` deux niveaux.meth(params) Obj.14).meth(params) object Obj meta-object Meta_Obj reification meta-object Meta_Obj meta level base level reflection reification m=reify(meth. d´finissant ainsi une « tour r´flexive ». et leur relation aux entit´s du e e e niveau de base. un m´ta-objet M´ta Obj e e e ` e e e est associ´ a chaque objet Obj. sont sp´cifi´es par un protocole a m´ta-objets (MOP) [Kiczales et al. La m´thode m´ta MethodCall(m) ex´cute alors les traitements sp´cifi´s par le e e e e e MOP. e e ` e Un exemple simple de MOP (emprunt´ a [Bruneton 2001]) est la r´ification d’un appel e` e de m´thode dans un syst`me r´flexif a objets.meth(params) e ` e e comporte les ´tapes suivantes (Figure 2. Le fonctionnement des m´ta-objets. Il conduit a d´finir des m´ta-objets. Au m´ta-niveau. est un processus appel´ r´ification. d’une structure de donn´es ou d’une op´ration e e e e d´finie au niveau de base.printName()) ou il peut sauvegarder l’´tat de l’objet avant l’appel de e . qui fournit les fonctions d´finies par les sp´cifications du syst`me. Des capacit´s r´flexives sont pr´sentes dans la plupart des syst`mes intere e e e giciels existants. et ainsi de suite. destin´e a ˆtre utilis´e par le m´tae e e `e e e niveau.metaMethodCall(m) baseMethodCall(m) reflection Obj. La forme pr´cise de cette repr´sentation est d´finie par le MOP. e e e – Le m´ta-niveau.4. au m´ta-niveau. Cet e e e e objet m est transmis au m´ta-objet.methName. mais sont g´n´ralement introduites localement. e ` La d´finition d’une repr´sentation du niveau de base. e 1.

et d’autres aspects extra-fonctionnels). e e . ` ` e qui cr´e le m´ta-objet associ´.metaNewObj(…) meta level baseNewObj(…) base level X=newObject(…) reflection X callback create reflection reference Object create return object ref callback client X Object factory object Obj Meta-Object return object ref create Figure 2. une e e e application d´velopp´e avec l’AOP est construite en deux phases. etc. Le but de l’AOP est de d´finir des m´thodes et outils pour mieux identifier et isoler e e le code relatif aux divers aspects pr´sents dans une application. et ex´cute toutes les op´rations suppl´mentaires sp´cifi´es e e e e e e e e par le MOP (Figure 2.44 CHAPITRE 2. ce qui rend les modifications et les additions difficiles et sujettes aux erreurs. e e Cette ´tape (l’inverse de la r´ification) est appel´e r´flexion. en appelant e e une m´thode baseMethodCall(m) qui ex´cute essentiellement Obj.meth(params) 8. par exemple. en utilisant l’usine e e de ce niveau . e e e il peut d´cider que l’appel ne doit pas ˆtre ex´cut´. l’op´ration de cr´ation d’objet peut ˆtre r´ifi´e en appelant une usine a m´tae e e e e e ` e objets (au m´ta-niveau). De mˆme.4. la persistance. e e e e 4. ou il peut v´rifier la valeur e e e des param`tres.2 Programmation par aspects La programmation par aspects (en anglais Aspect-Oriented Programming ou AOP) [Kiczales 1996] est motiv´e par les remarques suivantes. Plus pr´cis´ment.15). e – Beaucoup de pr´occupations diff´rentes (ou « aspects ») sont g´n´ralement pr´sentes e e e e e dans une application (des exemples usuels sont la s´curit´. e 3. la tol´rance e e e aux fautes. e e 7 Il n’ex´cute pas n´cessairement l’appel initial . Le m´ta-objet peut maintenant effectivement ex´cuter l’appel initial 7 . et retourne a e e e ` l’appelant initial. client X=newObject(…) reification Object Factory meta-object Factory meta-object Factory create meta-object Meta_Obj reification Meta_Obj. Le m´ta-objet ex´cute alors tout post-traitement d´fini par le MOP. PATRONS ET CANEVAS POUR L’INTERGICIEL la m´thode pour permettre un retour en arri`re (undo).meth(params) parce que seule la forme r´ifi´e e e de l’appel de m´thode est accessible au m´ta-objet et aussi parce qu’une ´tape de post-traitement peut e e e ˆtre n´cessaire. 8 Noter qu’il n’est pas possible d’ appeler directement Obj. Cette usine cr´e un objet au niveau de base. – Le code li´ a ces pr´occupations est souvent ´troitement imbriqu´ avec le code « fonce` e e e tionnel » de l’application.15 – Cr´ation d’objet dans un syst`me r´flexif e e e 2. le nouvel objet fait alors un appel ascendant (upcall) a l’usine a m´ta-objets. si le MOP est utilis´ pour la protection. et revenir a l’appelant avec un message de violation de e e e e ` protection.

qui peut alors ˆtre compil´. Une indication sp´cifie e ` e e e si le code ins´r´ doit ˆtre ex´cut´ avant. a e Un probl`me important de l’AOP est la composition des aspects. dans le code source du programme de base. Par exemple. /* ex´cution d’un appel a la m´thode originelle e ` e */ postlude /* s´quence de code devant etre ins´r´e apr`s un appel */ e ^ e e e } } Figure 2. en utilisant e e e e ´ventuellement des langages sp´cialis´s pour le code des aspects. ces op´rations peuvent toujours ˆtre appel´es e e e depuis le code ins´r´).)). Par exemple. en utilisant un e e outil de composition. Un point de jonction (join point) est un emplacement.´ ´ ´ 2. et les parties qui traitent des diff´rents aspects suppl´mentaires sont ´crites ind´pendamment. Ils s’appliquent a des programmes de base en Java. ou en remplacement des op´rations situ´es ee e e e e e e aux points de coupure (dans le dernier cas. o` du code li´ aux aspects peut ˆtre ins´r´. et l’indication (advice). e e e – Toutes ces parties sont int´gr´es pour former l’application globale. si l’AOP e ee est ajout´ a un langage a objets. Le tissage d’aspects repose u e e ee sur deux notions principales : le point de coupure (point cut). /* d´finition d’indication e */ around(): Wrappable() { prelude . c’est-`e e a dire la d´finition de l’interaction du code ins´r´ avec le code de base. sous la forme de d´finition de points de coupure et d’indications.. ` AspectJ AspectJ permet de d´finir les aspects en sp´cifiant ces derniers et le programme de e e base dans un code source Java. e . c’est-`-dire la sp´cification a e d’un ensemble de points de jonction selon un crit`re donn´. un point de coupure particulier peut ˆtre d´fini comme e` ` e e l’ensemble des points d’appel a une famille de m´thodes (sp´cifi´e par une expression re` e e e guli`re). e e public aspect MethodWrapping{ /* d´finition de point de coupure */ e pointcut Wrappable(): call(public * MyClass. /* s´quence de code devant etre ins´r´e avant un appel */ e ^ e e proceed (). ADAPTABILITE ET SEPARATION DES PREOCCUPATIONS 45 – La partie principale de l’application (le programme de base). apr`s. si e diff´rents fragments de code li´s aux aspects sont ins´r´s au mˆme point de jonction. ou l’ensemble des appels a un constructeur sp´cifi´. e e Deux exemples d’outils qui r´alisent l’AOP sont AspectJ [Kiczales et al. l’ordre e e ee e d’insertion peut ˆtre significatif si les aspects correspondants ne sont pas ind´pendants. ou en combinant des techniques statiques et dynamiques. Le code pr´sent´ Figure e e e e 2. e e Un exemple simple donne une id´e des capacit´s d’AspectJ. ee e a dynamiquement (` l’ex´cution).16 – D´finition d’un aspect en AspectJ. etc.*(. La composition peut ˆtre faite statiquement (` la compilation).4. e e Cette question ne peut g´n´ralement pas ˆtre d´cid´e par le tisseur et n´cessite une e e e e e e sp´cification suppl´mentaire. 2001]. 2001] et JAC e [Pawlak et al. le tisseur d’aspects (aspect weaver ).16 d´crit un aspect.

` ` e e e L’insertion d’intercepteurs permet une extension non-intrusive des fonctions d’un intergiciel. De fait. essentiellement e e e e pour des raisons d’efficacit´. introduction) e e e a une application existante. Ces approches sont principalement fond´es sur l’interception. e En sp´cifiant convenablement les points d’insertion pour une classe donn´e d’intergiciel. PATRONS ET CANEVAS POUR L’INTERGICIEL La premi`re partie de la description d´finit un point de coupure (point cut) comme e e tout appel d’une m´thode publique de la classe MyClass. protocoles de communication). Ainsi des aspects peuvent ˆtre dynamiquement ajout´s a une application e e e ` en cours d’ex´cution. suivi par un ´pilogue sp´cifi´. La composition d’aspects est d´finie e e e par un protocole a m´ta-objets. et le code des classes e d’application est modifi´ lors du chargement des classes.et post-conditions dans une conception par contrat (2. Cela peut ˆtre utilis´ pour ajouter e e e e e e des capacit´s de journalisation a une application existante. e e Beaucoup de syst`mes intergiciels d´finissent un chemin d’appel depuis un client vers e e un serveur distant. syst`me d’exploie tation.4. e e conforme a une norme sp´cifique (par exemple CORBA. u 2. par exemple a l’envoi et a la r´ception des requˆtes et des r´ponses. e – Les point cuts et les advices sont d´finis s´par´ment. Cette possibilit´ doit ˆtre utilis´e avec pr´caution. EJB). mais les appliquent en g´n´ral de mani`re ad hoc. e e Une autre capacit´ d’AspectJ est l’introduction. intergiciel. JAC utilise la modification du bytecode. sans modifier le code des applications ou l’intergiciel lui-mˆme. les intercepteurs peuvent ` e ˆtre rendus g´n´riques et peuvent ˆtre r´utilis´s avec diff´rentes r´alisations de cette norme. car elle peut violer le principe e e e e d’encapsulation. La liaison entre point cuts et e e e advices est retard´e jusqu’` la phase de tissage . ` e – JAC n’est pas une extension de langage. Il permet d’ajouter des capacit´s suppl´mentaires (mise sous enveloppe de m´thodes. mais un canevas qui peut ˆtre utilis´ a e e ` l’ex´cution.1. traversant plusieurs couches (application. mais au prix d’un surcoˆ t a l’ex´cution u ` e dˆ au tissage dynamique des aspects dans le bytecode. ` e Ainsi JAC autorise une programmation souple. La partie indication (advice) e indique qu’un appel a une telle m´thode doit ˆtre remplac´ par un prologue sp´cifi´. JAC diff`re d’AspectJ sur les points suivants. elle repose sur des informations e a fournies dans un fichier de configuration s´par´. suivi ` e e e e e par un appel a la m´thode d’origine. Les intercepteurs peuvent ˆtre ins´r´s en divers e ee points de ce chemin.46 CHAPITRE 2. ou pour ins´rer du code de test e ` e pour ´valuer des pr´. cela revient ` e e e e a placer une simple enveloppe (sans modification d’interface) autour de chaque appel de ` m´thode sp´cifi´ dans la d´finition du point de coupure. e e e e e e e e Les fonctions qui peuvent ˆtre ajout´es ou modifi´es par des intercepteurs sont notamment e e e .3). Cette technique e peut ˆtre consid´r´e comme une mani`re ad hoc pour r´aliser l’AOP : les points d’ine ee e e sertion sont les points de jonction et les intercepteurs r´alisent directement les aspects.3 Approches pragmatiques Les approches pragmatiques de la r´flexion dans l’intergiciel s’inspirent des approches e syst´matiques ci-dessus. qui permet d’ins´rer des d´clarations e e e et m´thodes suppl´mentaires a des endroits sp´cifi´s dans une classe ou une interface e e ` e e existante. JAC JAC (Java Aspect Components) a des objectifs voisins de ceux d’AspectJ.

ou e e e ` a (pour Java) au niveau du bytecode. par exemple les aspects peuvet ˆtre utie e e e lis´s pour modifier les op´rations aussi bien au niveau de base qu’aux m´ta-niveaux. 2.5. des techniques d’optimisation fond´es sur la manipulation de code e de bas niveau peuvent ˆtre appliqu´es. ou ASM [ASM 2002]. la securit´. e 2. e ıt ` e Des r`gles de conception d´velopp´es pour l’architecture et l’urbanisme [Alexander 1964] e e e . Pour ˆtre efficace. La construction modulaire. une approche de la composition syst´matique de programmes comme un assemblage de parties. Ce coˆ t peut ˆtre u ` e u e r´duit par l’usage de l’injection de code. Les approches fond´es sur les aspects (AOP) agissent a un grain plus fin que celles utie ` lisant les MOPs et accroissent la souplesse d’utilisation. NOTE HISTORIQUE 47 la surveillance (monitoring). la journalisation. cette e e e injection doit ˆtre r´alis´e a bas niveau. la e gestion de caches. e e e 3. e Cette technique peut aussi ˆtre combin´e avec un protocole a m´ta-objets.4 Comparaison des approches Les principales approches de la s´paration de pr´occupations dans l’intergiciel peuvent e e ˆtre compar´es comme suit.2. Un exemple d’utilisation de l’injection de code peut ˆtre trouv´ e e dans [Hagimont and De Palma 2002]. Le syst`me d’exploitation THE [Dijkstra 1968] est un des e e premiers exemples de syst`me complexe con¸u comme une hi´rarchie de machines e c e abstraites. a ` e Javassist [Tatsubori et al. grˆce a des outils appropri´s tels que BCEL [BCEL ]. l’intercepe e ` e teur pouvant ˆtre ins´r´ dans la partie r´ifi´e du chemin d’appel (donc dans un m´tae ee e e e niveau). l’enregistrement de mesures. mais apportent des solutions acceptables dans de nombreuses si` tuations pratiques. il doit ˆtre possible d’annuler le processus d’injection de code en revenant au e format de l’interception. apparaˆ a cette p´riode. la duplication. Les techniques d’interception entraˆ ınent un surcoˆ t a l’ex´cution. l’´quilibrage de charge. c’est-`-dire par int´gration directe du code de e a e l’intercepteur dans le code du client ou du serveur (c’est l’analogue de l’insertion (inlining) du code des proc´dures dans un compilateur optimis´). Elles manquent toujours d’un mod`le formel pour les outils de e conception et de v´rification. La notion de programmation par objets est introduite dans le langage Simula-67 [Dahl et al. 1970]. elles entraˆ e e ınent un surcoˆ t potentiel dˆ au va u u et vient entre m´ta-niveau et niveau de base. c’est-`-dire dans le langage d’assemblage. au d´triment de la g´n´ralit´. N´anmoins. e Dans tous les cas. Ce domaine fait l’objet d’une importante activit´. e e 1. Les approches fond´es sur l’interception ont des capacit´s restreintes par rapport e e a MOP ou AOP. Pour pr´server la souplesse d’utie lisation. Les approches fond´es sur les protocoles a m´ta-objets (MOP) sont les plus g´n´rales e ` e e e et les plus syst´matiques. e e e e Les deux approches peuvent ˆtre combin´es´ .5 Note historique Les pr´occupations architecturales dans la conception du logiciel apparaissent vers e la fin des ann´es 1960. e e e 2.4. 2001].

une dizaine d’ann´es plus e e tard [Alexander et al. 1982] : une couche logicielle interpos´e a l’interface des appels e ` syst`me Unix permet de rediriger de mani`re transparente les op´rations sur les fichiers e e e distants. par exemple dans le cadre des syst`mes de bases de donn´es. Schmidt et al. Unix Unie e e ted [Brownbridge et al. 1991] e ` e est introduite pour le langage CLOS. menus. e e La notion de patron de conception vient de la mˆme source. cadres de fenˆtres. Avant mˆme que cette notion soit syst´matiquement utie e lis´e. 1994]. avant e e d’ˆtre utilis´es pour transformer les m´thodes d’acc`s. 1995. Diverses formes de mandataires sont utilis´s pour r´aliser l’ex´cution a distance. cˆt´ client et cˆt´ serveur. e e o L’id´e de la programmation r´flexive est pr´sente sous diverses formes depuis les orie e e gines (par exemple dans le m´canisme d’´valuation des langages fonctionnels tels que Lisp). Des intercepteurs en pile. et e commence a s’introduire dans les syst`mes commerciaux (par exemple via le standard ` e CORBA pour les intercepteurs portables). 1993] sous le nom de subcontracts. V¨lter et al. . dans lesquelles un grand nombre d’objets param´tr´s (boutons. 1988]). Les usines semblent ˆtre d’abord apparues dans la conception d’interfaces e graphiques (par exemple [Weinand et al. L’intergiciel r´flexif e [Kon et al. les bases du calcul r´flexif e e e sont pos´es dans [Smith 1982]. une extension objet de Lisp. avec la cr´ation de la s´rie des conf´rences PLoP [PLoP ] et la publication de plue e e sieurs livres sp´cialis´s [Buschmann et al. l’activit´ se d´veloppe dans ce e e e e domaine. Une utilisation notoire des intere e e e cepteurs est la r´alisation du premier syst`me r´parti de gestion de fichiers. sont e oe oe introduits dans [Hamilton et al. Des formes e ee e e e simples d’enveloppes (wrappers) sont d´velopp´es pour convertir des donn´es depuis un e e e format vers un autre. 2000. 2002]. PATRONS ET CANEVAS POUR L’INTERGICIEL sont transpos´es a la conception de programmes et ont une influence significative sur e ` l’´mergence des principes du g´nie logiciel [Naur and Randell 1969]. La notion de protocole a m´ta-objets [Kiczales et al. 2002] fait l’objet de nombreux travaux depuis le milieu des ann´es 1990. 1977]. Cette m´thode sera plus tard ´tendue [Jones 1993] pour inclure du code utilisae e teur dans les appels syst`me. e e e ee L’exploration syst´matique des patrons de conception de logiciel commence a la fin des e ` ann´es 1980. les patrons ´l´mentaires d´crits dans le pr´sent chapitre sont identifi´s. e e Les premiers essais d’usage syst´matique de cette notion datent du d´but des ann´es 1980 e e e (par exemple le m´canisme des m´taclasses dans Smalltalk-80) .48 CHAPITRE 2. avant que le patron soit identifi´ e e e ` e [Shapiro 1986]. etc.) sont cr´´s dynamiquement. Apr`s la publication de [Gamma et al.

Stefani (version du 19 janvier 2007 . e e e La section 3. d´finition et principes e e Le mod`le de composants Fractal est un mod`le g´n´ral d´di´ a la construction.0/fr/deed.Qu´ma. e e Ce chapitre pr´sente les principes de base du mod`le Fractal (section 3.6 conclut ce chapitre.g.4 pr´sente quelques biblioth`ques de composants disponibles pour le d´veloppement e e e d’applications Fractal.fr) Chapitre 3 Le syst`me de composants Fractal e Les approches a base de composants apparaissent de plus en plus incontournables ` pour le d´veloppement de syst`mes et d’applications r´partis.3 pr´sente le langage e e e e Fractal ADL qui permet de construire des assemblages de composants Fractal. contrˆle. Les autres plates-formes existantes sont pr´sent´es bri`vement en section 3.4. L’accent est mis sur e e e deux d’entre elles.3. L’int´rˆt de la communaut´ industrielle et acad´mique e e ee e e s’est d’abord port´ sur les mod`les de composants pour les applications comme EJB. Les platese e formes mettant en œuvre ce mod`le sont pr´sent´es dans la section 3. les composants se sont ime e e e pos´s comme le paradigme cl´ de l’ing´nierie des intergiciels et de leurs applications dans e e e la seconde moiti´ des ann´es 1990. La section 3. tels les intergiciels ou les syst`mes d’exploitation. la ` e section 3. observation. J. Finalement.10:31) e Licence Creative Commons (http://creativecommons.5 compare Fractal a des mod`les de composants existants. Il s’agit toujours. Il s’agit de faire face a e e e ` la complexit´ sans cesse croissante de ces logiciels et de r´pondre aux grands d´fis de e e e l’ing´nierie des syst`mes : passage a grande ´chelle.org/licenses/by-nc-nd/ 2.2). V.1) d´di´e au d´veloppement d’intergiciels.1 Le mod`le Fractal : historique. le champ d’application des composants s’est e e ´tendu aux couches inf´rieures : syst`mes et intergiciels. Le mod`le de composants Fractal remplit ces conditions. au e e e e e e ` d´ploiement et a l’administration (e. Julia (section 3. e e . La section 3. Coupaye. A partir du d´but des ann´es 2000.2. d’obtenir des entit´s logicielles composables aux interfaces sp´cifi´es contrace e e tuellement.2.2. reconfiguration dynamique) e ` o de syst`mes logiciels complexes. comme pour les e e e applications. administration.NET. d´ployables et configurables .1) et AOKell (section 3. dont Dream (section 3.2. 3. autonomie. mais il s’agit ´galement d’avoir des plates-formes e e a composants suffisamment performantes et l´g`res pour ne pas p´naliser les performances ` e e e du syst`me.Intergiciel et Construction d’Applications R´parties e c 2006 T. CCM e e ` ou .-B. e e ` e Apr`s les objets dans la premi`re moiti´ des ann´es 1990. L.1). Seinturier.

e Les caract´ristiques principales du mod`le Fractal sont motiv´es par l’objectif de poue e e voir construire. Le mod`le est ainsi bas´ sur les principes suivants : e e e – composants composites (i. e e e – capacit´s de (re)configuration pour permettre de d´ployer et de configurer dye e namiquement un syst`me.e. tout en pr´servant l’ene e capsulation des composants.e. il a ´volu´ et sa version 2. d´ployer et administrer des syst`mes complexes tels que des intergiciels ou e e des syst`mes d’exploitation. . – composants partag´s (i. d´finie en janvier 2004 et impl´ment´e en mars 2004. composants qui contiennent des sous-composants) pour permettre d’avoir une vue uniforme des applications a diff´rents niveaux d’abs` e traction. a ´t´ associ´ au mod`le de composants.2. C++. Il est e o ainsi possible d’obtenir un continuum dans les capacit´s r´flexives d’un composant allant e e de l’absence totale de contrˆle a des capacit´s ´labor´es d’introspection et d’intercession o ` e e e (e. Ces composants utilisent des contrˆleurs et des plateso formes existants. Le d´veloppement de contrˆleurs est conduit a l’aide e o ` des m´canismes offerts par les plates-formes : par exemple. contrˆle de son cycle de vie). SmallTalk ou les langages de la plate-forme . 1998].1) ou aspect pour AOKell (voir section 3. – capacit´s d’introspection pour permettre d’observer l’ex´cution d’un syst`me.50 CHAPITRE 3. un langage de description d’architecture. – les d´veloppeurs de contrˆleurs s’int´ressent a la personnalisation du contrˆle e o e ` o offerts aux composants. Ils d´veloppent des composants et des e ` e assemblages de composants a l’aide de l’API Fractal et du langage de description ` d’architecture Fractal ADL. initi´es d`s 2000 a France e e e e ` Telecom R&D dans la lign´e du projet Jonathan [Dumant et al.2). Fractal est un mod`le extensible du fait qu’il permet au d´veloppeur de e e personnaliser les capacit´s de contrˆle de chacun des composants de l’application. D`s le d´part. Les premi`res discussions autour du mod`le Fractal. Ils d´veloppent de nouvelles politiques de contrˆle compore o tant plus ou moins de fonctionnalit´s extra-fonctionnelles et permettant d’adapter e les applications a diff´rents contextes d’ex´cution (par exemple avec des ressources ` e e plus ou moins contraintes). acc`s et manipulation du contenu d’un composant. Il se e ee e pr´sente sous la forme d’une sp´cification et d’impl´mentations dans diff´rents langages de e e e e programmation comme Java. e Par ailleurs. La sp´cification a ´volu´ pour e ee e e e e aboutir en septembre 2003 a une deuxi`me version comportant un certain nombre de ` e changements au niveau de l’API. ` LE SYSTEME DE COMPOSANTS FRACTAL Le mod`le de composants Fractal a ´t´ d´fini par France Telecom R&D et l’INRIA. ont abouti en juin e 2002 avec la premi`re version officielle de la sp´cification et la premi`re version de Julia. e e e qui est l’impl´mentation de r´f´rence de cette sp´cification.NET. e e e e e e est bas´e sur une syntaxe extensible. C. Fractal est organis´ comme un projet du consortium ObjectWeb pour le middleware open e source.2. mixin pour Julia (voir e section 3. Bas´ sur une syntaxe ad hoc au ee e e e d´part. sous-composants de plusieurs composites englobants) e pour permettre de mod´liser les ressources et leur partage.g. Ces e o fonctionnalit´s sont d´finies au sens d’entit´s appel´es contrˆleurs e e e e o Il est ainsi possible de distinguer diff´rents rˆles dans les activit´s de d´veloppement e o e e autour du mod`le Fractal : e – les d´veloppeurs de composants applicatifs s’int´ressent a la construction d’ape e ` plications et de syst`mes a l’aide de Fractal. e e Fractal ADL.

Java) est implant´e a e ` . Les interfaces d’une membrane sont soit externes. La section suivante introduit les ´l´ments disponibles pour le d´veloppement d’appliee e cations et de syst`mes avec Fractal. par o exemple. Un contrˆleur peut.2 introduit e la notion de contrˆleur qui sera reprise dans chacune des sections consacr´es aux plateso e formes existantes (voir respectivement les sections 3. Les contrˆleurs peuvent ˆtre consid´r´s comme des m´tao o e ee e objets. LE MODELE FRACTAL : HISTORIQUE. le langage Fractal ADL constitue le vecteur privil´gi´ pour la composition de e e composants.1. Les liaisons primitives sont ´tablies entre une interface e client et une interface serveur de deux composants r´sidant dans le mˆme espace d’adrese e sage.` ´ 3. La liaison a est ce qui permet aux composants Fractal de communiquer. et les interfaces clients qui correspondent aux services requis par le composant. soit internes. une liaison primitive dans le langage C (resp.3 reviendra sur le langage Fractal ADL e et expliquera notamment comment il est possible de l’´tendre. Un composant Fractal est g´n´ralement compos´ de deux parties : une membrane — e e e qui poss`de des interfaces fonctionnelles et des interfaces permettant l’introspection et la e configuration (dynamique) du composant —.2 sur Julia et AOKell). DEFINITION ET PRINCIPES 51 – les d´veloppeurs de plates-formes fournissent un environnement permettant e d’ex´cuter des applications et des syst`mes ´crits a l’aide de composants Fractal. Chaque contrˆleur a un rˆle particulier : par exemple.2). Une interface implante un type d’interface e qui sp´cifie les op´rations support´es par l’interface. D’autres contrˆleurs permettent de contrˆler le o o comportement d’un composant et/ou de ses sous-composants.2. permettre de suspendre/reprendre l’ex´cution d’un composant. 3. Par exemple.1. Ces composants peuvent ˆtre typ´s. e e e Une interface est un point d’acc`s au composant. Composants et liaisons Un composant Fractal est une entit´ d’ex´cution qui poss`de une ou plusieurs interfaces. On trouve ainsi des plates-formes dans diff´rents langages comme Java ou o e C (voir section 3. La membrane d’un composant est constitu´e e d’un ensemble de contrˆleurs.2. Fie e nalement. alors que les interfaces internes sont accese sibles par les sous-composants du composant.1 et 3. certains contrˆleurs sont o o o charg´s de fournir une repr´sentation causalement connect´e de la structure d’un come e e posant (en termes de sous-composants). Fractal d´finit deux types de e liaisons : primitive et composite. La section 3. e e e ` Un d´veloppeur de plate-forme fournit une impl´mentation des sp´cifications Frace e e tal dans un langage de programmation et des m´canismes pour personnaliser le e contrˆle. Les interfaces externes sont accessibles de l’ext´rieur du composant. La section 3.1 Composants Fractal La base du d´veloppement Fractal r´side dans l’´criture de composants et de liaisons e e e permettant aux composants de communiquer. Il existe deux cat´gories d’interfaces : e e e e les interfaces serveurs — qui correspondent aux services fournis par le composant —.1. et un contenu qui est constitu´ d’un ensemble e fini de sous-composants. e Le mod`le Fractal fournit deux m´canismes permettant de d´finir l’architecture d’une e e e application : l’imbrication (` l’aide des composants composites) et la liaison.

52 CHAPITRE 3. Il e e e permet ´galement de pr´ciser le rˆle de chacune des interfaces (i. La contingence d’une interface indique s’il est e garanti que les op´rations fournies ou requises d’une interface seront pr´sentes ou non a e e ` l’ex´cution : e – les op´rations d’une interface obligatoire sont toujours pr´sentes.1 – Exemple de composant Fractal. e e o ainsi que sa cardinalit´ et sa contingence. La figure 3. Pour une interface e e client. De fa¸on paradoxale.g.1 repr´sente un exemple de composant Fractal. client ou serveur). Notons que les interfaces internes permettent a un composite ` de contrˆler l’exposition de ses interfaces externes a ses sous-composants. Les interfaces o ` externes apparaissant au sommet des composants sont les interfaces de contrˆle du compoo sant. Les liaisons composites sont des chemins de comee munication arbitrairement complexes entre deux interfaces de composants. e Une caract´ristique originale du mod`le Fractal est qu’il permet de construire des come e posants partag´s. r´f´rence). les composants partag´s sont utiles pour pr´server l’enc e e capsulation. il n’est pas n´cessaire a un composant de bas niveau d’exporter e ` une interface au niveau du composite qui l’encapsule pour acc´der a une interface d’un e ` composant partag´.e. Les composants sont e repr´sent´s par des rectangles. Le tour gris du carr´ correspond a la membrane du come e e ` posant. L’int´rieur du carr´ correspond au contenu du composant du composant. Ce syst`me de types autorise e e e e la description des op´rations support´es par les diff´rentes interfaces d’un composant. gris fonc´ e e e pour les interfaces serveurs). De fait. Les liaisons composites sont constitu´es d’un ensemble de composants de liaison (e. Enfin. cela signifie que l’interface doit ˆtre li´e pour que le composant s’ex´cute. Les e e interfaces sont repr´sent´es par des “T” (gris clair pour les interfaces clients . Les fl`ches repr´sentent les liaisons entre composants. e Syst`me de types e Le mod`le Fractal d´finit un syst`me de types optionnel. e e e . ` LE SYSTEME DE COMPOSANTS FRACTAL l’aide d’un pointeur (resp. Un composant partag´ est un composant qui est inclus dans plusieurs e e composites. skeleton) e reli´s par des liaisons primitives. les composants partag´s sont particuli`rement adapt´s a la e e e e ` mod´lisation des ressources. stub. nous avons repr´sent´ e e e e un composant partag´ entre deux composites. En effet. e Figure 3.

a l’aide d’une syntaxe XML.3. LE MODELE FRACTAL : HISTORIQUE. Une cardinalit´ singleton signifie que le composant doit avoir une. la description ADL mentionne deux liaisons : entre les interfaces r du composite et du Client et entre les interfaces s du Client et du Server. Enfin. Fractal n’impose aucune contrainte sur la s´mantique c ` e e op´rationnelle des interfaces de cardinalit´ collection.1.ServerImpl correspond a la classe e ` d’implantation.julia. Ce composite poss`de une interface serveur. Ces interfaces sont g´n´ralement cr´´es e e ee de fa¸on paresseuse a l’ex´cution. Il est ainsi possible de consid´rer les e e e interfaces collection comme une collection d’interfaces dans laquelle chaque ´l´ment est ee trait´ comme une interface de cardinalit´ singleton. des assemblages e ` de composants Fractal. Notons que le syst`me de types d´finit une relation e e de sous-typage qui permet de v´rifier des contraintes sur la substituabilit´ des composants.3 que la DTD de ce langage n’est pas ` fixe. Par ailleurs. Le composant d´crit est un composite dont e e e le nom est HelloWorld.3 donne un exemple de d´finition r´alis´e a l’aide de Fractal ADL. La d´finition du composant Server suit le mˆme principe : une interface sere e veur s est d´finie et org.example. et e seulement une.objectweb.objectweb.2 – Assemblage Fractal correspondant a l’ADL de la figure 3. Pour un composant client. e ` cela signifie que le composant peut s’ex´cuter sans que son interface soit li´e. de nom r et de sie gnature java.ClientImpl et il poss`de une partie de contrˆle de type e o primitive1. L’ase e e ` semblage correspond est repr´sent´ figure 3. Nous verrons a la section 3. ` 1 Les deux mots utilis´s pour d´crire les parties contrˆle des composants (primitive et composite) sont e e o d´finis dans un fichier de configuration qui permet de sp´cifier l’ensemble des contrˆleurs des diff´rents e e o e composants. e e Assemblage de composants Le langage Fractal ADL permet de d´crire. Une cardinalit´ collection signifie que le composant peut e avoir un nombre arbitraire d’interfaces du type T . e e Pour un composant serveur.2. Figure 3. e e La cardinalit´ d’une interface de type T sp´cifie le nombre d’interfaces de type T que le e e composant peut avoir. interface de type T . mais peut ˆtre ´tendue pour prendre en compte des propri´t´s extra-fonctionnelles. e e ee La figure 3. sa classe d’implantation est org. le composite encapsule deux composants : Client et Server.lang. e ` Le syst`me de types permet ´galement de d´crire le type d’un composant comme e e e l’ensemble des types de ses interfaces.` ´ 3.julia. La d´finition du composant Client est int´gr´e a celle du compoe e e ` sant HelloWorld : le composant a deux interfaces (r et s).example. cela peut signifier que l’interface interne compl´mentaire e n’est pas li´e a un sous-composant implantant l’interface. ou de consid´rer que l’invocation de e e e m´thode sur une interface collection provoque la diffusion du message a l’ensemble des e ` composants li´s a cette interface. . DEFINITION ET PRINCIPES 53 – les op´rations d’une interface optionnelle ne sont pas n´cessairement disponibles.Runnable.

} public void bindFc ( S t r i n g c I t f . l a n g . equals (”s” ) ) { service = ( Service ) s I t f . l a n g . B i n d i n g C o n t r o l l e r { // I m p l e m e n t a t i o n de Runnable public void run ( ) { s e r v i c e . } } Figure 3. } public Object lookupFc ( S t r i n g c I t f ) { i f ( c I t f . } } public void unbindFc ( S t r i n g c I t f ) { i f ( c I t f .4 – Impl´mentation des composants Client et Server. Runnable ”/> <component name=” C l i e n t ”> < i n t e r f a c e name=” r ” r o l e=” s e r v e r ” s i g n a t u r e=” j a v a . p r i n t ( ” H e l l o world ! ” ) . Runnable ”/> < i n t e r f a c e name=” s ” r o l e=” c l i e n t ” s i g n a t u r e=” S e r v i c e ”/> <c o n t e n t c l a s s=” o r g . } public c l a s s S e r v e r I m p l implements S e r v i c e { public void p r i n t ( S t r i n g msg ) { System . j u l i a . e q u a l s ( ” s ” ) ) { return s e r v i c e . Object s I t f ) { i f ( c I t f . e q u a l s ( ” s ” ) ) { s e r v i c e = null . B i n d i n g C o n t r o l l e r . example . o b j e c t w e b . c o n t r o l . } } private S e r v i c e s e r v i c e . example . e r r . C l i e n t I m p l ”/> < c o n t r o l l e r d e s c=” p r i m i t i v e ”/> </component> <component name=” S e r v e r ”> < i n t e r f a c e name=” s ” r o l e=” s e r v e r ” s i g n a t u r e=” S e r v i c e ”/> <c o n t e n t c l a s s=” o r g . s ”/> < c o n t r o l l e r d e s c=” c o m p o s i t e ”/> </ d e f i n i t i o n > Figure 3. e ` import o r g . f r a c t a l . p r i n t l n ( msg ) . a p i . r ” s e r v e r=” C l i e n t .3 – Un exemple de d´finition ADL a l’aide du langage extensible Fractal ADL. o b j e c t w e b . public c l a s s C l i e n t implements Runnable . } return null . } // I m p l e m e n t a t i o n de B i n d i n g C o n t r o l l e r public S t r i n g [ ] l i s t F c ( ) { return new S t r i n g [ ] { ” s ” } . o b j e c t w e b . j u l i a . s ” s e r v e r=” S e r v e r . e . r ”/> <b i n d i n g c l i e n t=” C l i e n t . S e r v e r I m p l ”/> < c o n t r o l l e r d e s c=” p r i m i t i v e ”/> </component> <b i n d i n g c l i e n t=” t h i s .54 CHAPITRE 3. ` LE SYSTEME DE COMPOSANTS FRACTAL < d e f i n i t i o n name=” HelloWorld ”> < i n t e r f a c e name=” r ” r o l e=” s e r v e r ” s i g n a t u r e=” j a v a .

Finalement.Runnable. AOKell.2. un composant Fractal fournit une interface Component. La sp´cification e o e Fractal [Bruneton et al. les m´thodes de base fournies par un tel e contrˆleur permettent de d´marrer et stopper l’ex´cution du composant. Par ailleurs. un composant Fractal est une boˆ noire qui ne permet ni introspection. la classe ServerImpl impl´mente le composant Server. Chaque interface a un e nom qui permet de la distinguer des autres interfaces du composant. PLATES-FORMES 55 La figure 3.lang.2. o – le contrˆleur de liaisons pour cr´er/rompre une liaison primitive entre deux ino e terfaces de composants.1. Une deuxi`me plate-forme Java.2 Plates-formes Fractal est un mod`le de composant ind´pendant des langages de programmation.2.1) l’impl´mentation de r´f´rence de Fractal. o ıte ni intercession. le composant e Client manipule sa liaison avec le composant Server : il doit pour cela impl´menter e l’interface BindingController d´finie dans l’API Fractal. – le contrˆleur de cycle de vie pour contrˆler les principales phases comporteo o mentales d’un composant. o e e Au del` de cet ensemble pr´d´fini par les sp´cifications. les d´veloppeurs peuvent a e e e e impl´menter leurs propres contrˆleurs pour ´tendre ou sp´cialiser les capacit´s r´flexives e o e e e e de leurs composants. e Au niveau de contrˆle suivant. au contraire. de cr´er des formes arbitrairement e complexes de membranes implantant diverses s´mantiques de contrˆle. – le contrˆleur de contenu pour ajouter/retrancher des sous-composants au contenu o d’un composant composite. La classe ClientImpl correspond au composant Client et fournit une impl´mentation pour l’interface r de type java. d´velopp´e plus r´cemment est e e e e pr´sent´e en section 3. e 3. Les composants ainsi construits sont comparables aux objets instanci´s e dans les langages a objets comme Java. e Julia (voir section 3. Il permet. La sp´cification Fractal o e e d´finit diff´rents contrˆleurs : e e o – le contrˆleur d’attributs pour configurer les attributs d’un composant. 3. un composant Fractal poss`de des interfaces r´ifiant o e e e sa structure interne et permettant de contrˆler son ex´cution. Par rapport a Julia. AOKell apporte une mise sous forme de e e ` .2.2 Contrˆleurs o Le mod`le de composants Fractal n’impose la pr´sence d’aucun contrˆleur dans la e e o membrane d’un composant. Par exemple. Cette interface donne ` e acc`s aux interfaces externes (clients ou serveurs) du composant. a ´t´ d´velopp´e pour e ee ee e e le langage Java.4 fournit une impl´mentation des composants Client et Server mentionn´s e e dans l’assemblage. En l’abe o sence de contrˆle. e e Plusieurs plates-formes sont ainsi disponibles dans diff´rents langages de programmation. L’int´rˆt de ces composants r´side dans le fait ` ee e qu’ils permettent d’int´grer facilement des logiciels patrimoniaux. Au niveau de contrˆle sup´rieur.3. 2003] d´finit un certain nombre de niveaux de contrˆle. o similaire a l’interface IUnknown du mod`le COM [Rogerson 1997]. Le contrˆleur de liaison notifiera e o cette impl´mentation de l’occurrence de toute op´ration concernant la gestion des liaisons e e de ce composant.

o e o Par exemple.1 Julia Julia est l’impl´mentation de r´f´rence du mod`le de composant Fractal. Ces objets peuvent ˆtre s´par´s en deux groupes : les objets impl´mentant e e e e les interfaces de contrˆle et des intercepteurs optionnels qui interceptent les appels o de m´thodes entrants et sortants. il est n´cessaire de pouvoir e e e construire facilement diverses formes de contrˆleurs et diverses s´mantiques de contrˆle.5) : – Les objets qui impl´mentent le contenu du composant. 3. si l’on consid`re l’interface de contrˆle de liaisons (BindingController). Sa premi`re e ee e e version remonte a juin 2002. ni API e de r´flexivit´.56 CHAPITRE 3. – Les objets qui impl´mentent la partie de contrˆle du composant (repr´sent´s en e o e e gris). v´rification que e e e 2 fractal. Julia est disponible sous licence open source LGPL sur le site ` du projet Fractal2 . Par o ailleurs. il e o est n´cessaire de fournir diff´rentes implantations de cette interface qui diff`rent par les e e e v´rifications qu’elles font lors de la cr´ation/destruction d’une liaison : interaction avec le e e contrˆleur de cycle de vie pour v´rifier qu’un composant est stopp´. Julia est un canevas logiciel ´crit en Java qui permet de programmer les membranes e des composants. Il fournit un ensemble de contrˆleurs que l’utilisateur peut assembler.2. e e Principales structures de donn´es e Un composant Fractal est form´ de plusieurs objets Java que l’on peut s´parer en trois e e groupes (figure 3.3 pr´sente un aper¸u des autres plates-formes e c existantes. Ils peuvent ˆtre des sous-composants (dans le cas de come e e posants composites) ou des objets Java (pour les composants primitifs). les contrˆleurs et les intercepteurs poss`dent g´n´ralement des e o e e e r´f´rences les uns vers les autres.2. o D´veloppement des contrˆleurs e o Fractal ´tant un mod`le de composants extensible.org . e e Celles-ci fournissent une m´thode de cr´ation qui prend en param`tres la description des e e e parties fonctionnelle et de contrˆle du composant. y compris celles qui ne fournissent ni chargeur de classe.objectweb. ` LE SYSTEME DE COMPOSANTS FRACTAL composants des membranes. La section 3. Ces objets n’ont pas ´t´ e ee repr´sent´s sur la figure. Ces objets sont le ee seul moyen pour un composant de poss´der des r´f´rences vers un autre composant. e ee La mise en place de ces diff´rents objets est effectu´e par des fabriques de composants. v´rification que les o e e e types d’interface sont compatibles quand un syst`me de types est utilis´. Julia fournit des m´canismes d’optimisation qui permettent d’obtenir un contie nuum allant de configurations enti`rement statiques et tr`s efficaces a des configurations e e ` dynamiquement reconfigurables et moins performantes. Enfin. Les fonctions de contrˆle n’´tant g´n´ralement e o e e e pas ind´pendantes. ee – Les objets qui r´f´rencent les interfaces du composant (en blanc). Le d´veloppeur d’application peut e ainsi choisir l’´quilibre performance/dynamicit´ dont il a besoin. notons que Julia e e s’ex´cute sur toute JVM.

le cycle de vie et le contrˆleur de contenu. le pr´fixe super sp´cifie les m´thodes qui e c e e e e sont surcharg´es par le mixin. e Il n’est pas envisageable d’utiliser l’h´ritage de classe pour fournir ces diff´rentes ime e plantations. Il permet de e e sp´cifier les membres qui doivent ˆtre pr´sents dans la classe de base pour que le mixin e e e lui soit appliqu´. De fa¸on plus pr´cise. e ` les classes mixin sont des classes abstraites d´velopp´es avec certaines conventions. La classe mixin peut s’appliquer (c’est-`-dire surcharger et ajouter des e a m´thodes) a toute classe qui poss`de les caract´ristiques de cette super-classe. Ces classes e ` e e mixin sont appliqu´es au chargement a l’aide de l’outil ASM [ASM 2002]. 2000] illustr´e sur la e partie gauche de la figure 3. les composants li´s sont parents d’un mˆme composite quand les contrˆleurs de contenu e e o sont utilis´s.3. e e ` e L’application de la classe mixin A a la classe Base d´crite sur la partie gauche de la ` e figure 3. Dans Julia. Par exemple la classe mixin JAM [Ancona et al. pour implanter toutes les combinaisons possibles.7.5 – Un composant Fractal et son implantation Julia. Les m´thodes qui sont requises mais pas surcharg´es sont e e e sp´cifi´es a l’aide du pr´fixe this . etc. La solution adopt´e dans Julia est l’utilisation de classes mixin e [Bracha and Cook 1990] : une classe mixin est une classe dont la super-classe est sp´cifi´e de mani`re abstraite en indiquant les champs et m´thodes que cette super-classe e e e e doit poss´der. elles ne n´cessitent pas l’utilisation d’un compilateur Java modifi´ ou d’un e e pr´-processeur comme c’est le cas des classes mixins d´velopp´es a l’aide d’extensions e e e ` du langage Java. PLATES-FORMES 57 Component membrane BindingController LifeCycleController Objet Interface Objet Contrôleur content interface serveur interface client Modèle Intercepteur Implémentation en Julia Figure 3. Supposons que l’on souhaite effectuer des v´rifications concernant le syst`me e e e 3 = 8 combinaisons possibles de types. Il existe 2 o de ces diff´rentes v´rifications. e e . e e il serait n´cessaire de fournir huit classes. Le mot cl´ e e e inherited en JAM est ´quivalent au pr´fixe super utilis´ dans Julia.6 s’´crit en Julia en pur Java (partie droite).2. En e e l’occurrence. De fait. ce qui engendrerait de nombreuses duplications e de code. En effet cela conduirait a une explosion combinatoire du nombre de classes ` n´cessaires.7 donne la classe C55d992cb 0 repr´sent´e sur la partie droite de la figure 3.

appel´ g´n´rateur ` e e e e d’intercepteurs. p r i n t l n ( ”m” ) . } } Figure 3. Le premier e m´canisme permet de r´duire l’empreinte m´moire d’un composant en fusionnant une pare e e tie de ses objets de contrˆle. D´veloppement des intercepteurs e Julia donne la possibilit´ de d´velopper des intercepteurs dont le rˆle est d’intercepter e e o les appels de m´thode entrant et/ou sortant des interfaces d’un composant. deux o e objets fusionn´s ne peuvent pas impl´menter la mˆme interface.2. Comme nous l’avons expliqu´ au paragraphe 3. } } Figure 3.7 – Application d’une classe mixin. } } abstract c l a s s Compteur { abstract void s u p e r m ( ) . Cette e e g´n´ration est effectu´e a partir d’informations fournies par le d´veloppeur comme par e e e ` e exemple les blocs de code a ex´cuter avant et apr`s l’interception. Les intercepe teurs doivent impl´menter les interfaces intercept´es. public i n t count . chaque interface e serveur de composant est repr´sent´e par un objet qui contient une r´f´rence vers un e e ee . m$0 ( ) . ` e e Optimisations Julia offre deux m´canismes d’optimisation. il est inconcevable de e e d´velopper. } } public c l a s s C55d992cb 0 implements Generated { // from Base private void m$0 ( ) { System . abstract c l a s s Base { public void m ( ) { System . Pour ce faire. En cons´quence. ` LE SYSTEME DE COMPOSANTS FRACTAL mixin Compteur { inherited public void m ( ) . Cependant. p r i n t l n ( ”m” ) .m( ) . public i n t count . public void m ( ) { ++count . s u p e r . Julia fournit un outil.6 – Ecriture d’une classe mixin en JAM et en Julia. Julia fournit un outil utilisant ASM [ASM 2002] o et imposant certaines contraintes sur les objets de contrˆle fusionn´s : par exemple. qui permet de g´n´rer dynamiquement le code de ces intercepteurs.58 CHAPITRE 3. e e e Le second m´canisme d’optimisation a pour fonction d’optimiser les chaˆ e ınes de liaison entre composants : il permet de court-circuiter les parties contrˆle des composites qui n’ont o pas d’intercepteurs.1. out . super m ( ) . intra et inter composants. } // from A public i n t count . out . public void m ( ) { ++count . pour un aspect de contrˆle donn´. autant d’intercepteurs qu’il y a d’interfaces e o e a intercepter dans l’application. public void m ( ) { ++count .

lors du d´marrage d’un composite. o La suite de cette section pr´sente le principe de mise sous forme de composants des e membranes et la fa¸on dont AOKell utilise les aspects.objectweb. Seuls les appels du primitif sont intercept´s (objet i 1 ). le canevas logiciel AOKell [Seinturier et al. e e e Le canevas logiciel AOKell diff`re de Julia sur deux points : l’int´gration des fonce e tions de contrˆle dans les composants est r´alis´e a l’aide d’aspects et les contrˆleurs sont o e e ` o impl´ment´s eux-mˆmes sous forme de composants. Par exemple.2. AOKell est c disponible sous licence open source LGPL sur le site du projet Fractal 3 . c Membranes componentis´es e La membrane d’un composant Fractal est compos´e d’un ensemble de contrˆleurs. Loin d’ˆtre compl`tement autonomes. ces contrˆleurs collaborent entre eux afin de e e o remplir la fonction qui leur est assign´e. e e son contenu doit ˆtre visit´ afin de d´marrer r´cursivement tous les sous-composants 4 . Le respect de l’API Fractal permet ainsi d’ex´cuter e e e telle quelle. e e e o fractal. De e e e e ce fait. ee e En cons´quence. Par rapport a Julia qui utilise un e e e ` m´canisme de mixin [Bracha and Cook 1990] et de la g´n´ration de bytecode a la vol´e e e e ` e avec ASM. Plusieurs autres o e o d´pendances de ce type peuvent ˆtre exhib´es entre contrˆleurs. 3. o e e 4 3 .8 : un composant primitif est reli´ a un composite exportant e e e ` l’interface d’un composant primitif qu’il encapsule.3. Julia court-circuite l’objet r 2 et r1 r´f´rence directement i1 .org Notons que cela ne constitue pas une obligation formelle.8 – Optimisation des chaˆ ınes de liaison. du cycle de vie. Il est tout a fait possible de concevoir une ` fonction de contrˆle pour laquelle le d´marrage n’implique pas cette r´cursion.2 AOKell Comme Julia. e o Chaque contrˆleur est d´di´ a une tˆche pr´cise : gestion des liaisons. Le d´veloppement e de AOKell a d´but´ en d´cembre 2004. 2006] est une impl´mentation e compl`te des sp´cifications Fractal. des applications con¸ues pour Julia ou vice-versa. PLATES-FORMES 59 objet implantant r´ellement l’interface. En cons´quence. il existe deux objets de e r´f´rencement d’interface (r1 et r2 ). o e e ` a e etc.2. e ee r1 r2 i2 Figure 3. avec AOKell. l’objectif d’AOKell est de simplifier et de r´duire le temps de d´veloppement e e de nouveaux contrˆleurs et de nouvelles membranes. Le principe du m´canisme de court-circuitage est e e repr´sent´ sur la figure 3. le contrˆleur de cycle de vie d´pend du contrˆleur de contenu.

En “sp´cifiant e e e contractuellement les interfaces” [Szyperski 2002] de ces composants de contrˆle.10. Cette ape o proche devrait ´galement permettre d’apporter plus de flexibilit´ aux applications Fractal e e en permettant d’adapter plus facilement leur contrˆle a des contextes d’ex´cutions vari´s o ` e e ayant des caract´ristiques diff´rentes en terme de gestion des ressources (m´moire.9 pr´sente le sch´ma de principe de cette solution. AOKell est un canevas logiciel dans lequel les concepts de composant. clarifier l’architecture de la membrane et faciliter le e e d´veloppement de nouveaux composants de contrˆle et de nouvelles membranes. l’impl´mentation des meme e ` e branes sous la forme d’un assemblage permet de d´crire explicitement les d´pendances entre e e contrˆleurs. ou en en d´veloppement des nouvelles.10. mais est le r´sultat e e o e e de leur coop´ration. Cette meme brane fournit cinq contrˆleurs pour g´rer le cycle de vie (LC). L’architecture de cette membrane est illustr´e figure 3. e o e ee Figure 3. De nouvelles membranes peuvent ˆtre e e d´velopp´es en ´tendant les existantes. les liaisons (BC). Par soucis e e de clart´.9 – Les niveaux de composant du canevas logiciel AOKell. chaque composant de contrˆle o e e e e o est aussi associ´ a un aspect qui int`gre cette logique de contrˆle dans les composants de e` e o niveau applicatif.). Chacun d’eux impl´mente une fonctionnalit´ e e de contrˆle particuli`re. AOKell o esp`re favoriser leur r´utilisation. Ainsi. L’architecture pr´sent´e figure 3. . Compar´e a une approche purement objet. Comme expliqu´ pr´c´demment. Elle permet ´galement d’aboutir a des architectures logicielles de contrˆle o e ` o plus explicites. La membrane la plus courante dans les applications Fractal est celle associ´e aux come posants primitifs. ` LE SYSTEME DE COMPOSANTS FRACTAL Jusqu’` pr´sent ces d´pendances ´taient impl´ment´es sous la forme de r´f´rences a e e e e e ee stock´es dans le code des contrˆleurs.10 illustre le fait que la fonction de contrˆle des compoe e o sants primitifs n’est pas r´alis´e simplement par cinq contrˆleurs isol´s. d’interface et de liaison sont utilis´s pour concevoir le niveau applicatif et le niveau de contrˆle. activit´.60 CHAPITRE 3. Une e o membrane AOKell est un assemblage exportant des interfaces de contrˆle et contenant o un nombre quelconque de sous-composants. L’id´e d’AOKell est d’appliquer a la conception de la e o e ` membrane de contrˆle le principe qui a ´t´ appliqu´ aux applications : extraire du code les o ee e sch´mas de d´pendances et programmer celui-ci sous forme de composants. La figure 3. plus ´volutives et plus maintenables. le nommage o e (NC). e e e e etc. les r´f´rences vers les composants parents (SC) et les caract´ristiques communes a ee e ` tout composant Fractal (Comp). e e e e Le code Fractal ADL suivant fournit la description de la membrane de la figure 3. la membrane de contrˆle du troisi`me composant applicatif a ´t´ omise.

aokell.1.fractal.lib.binding-controller"/> <binding client="LC.//component" server="Comp.2.//component"/> <binding client="LC.//super-controller" server="SC.//super-controller"/> <!-.membrane.3.4.//component"/> <controller desc="mComposite"/> </definition> L’apport de l’ing´nierie du contrˆle sous forme de composants a ´t´ exp´riment´ en e o ee e e r´-impl´mentant le canevas logiciel Dream [Leclercq et al. o La DTD permettant d’´crire cet assemblage et l’API Java permettant de le manipuler sont e exactement les mˆmes que ceux utilis´s pour les composants Fractal applicatifs. 2005b] avec AOKell.//binding-controller"/> <binding client="this. PLATES-FORMES 61 Figure 3.//binding-controller" server="//BC.//component" server="Comp.Primitive"> <!-.objectweb.primitive.//name-controller"/> <binding client="this.//name-controller" server="NC.//component" server="Comp. e e` .//lifecycle-controller"/> <binding client="this.Liaisons entre composants de contr^le --> o <binding client="BC.Export des interfaces de contr^le --> o <binding client="this.Composants de contr^le inclus dans une membrane primitive --> o <component name="Comp" definition="ComponentController"/> <component name="NC" definition="NameController"/> <component name="LC" definition="NonCompositeLifeCycleController"/> <component name="BC" definition="PrimitiveBindingController"/> <component name="SC" definition="SuperController"/> <!-.//component"/> <binding client="this. Ce canevas e e logiciel est pr´sent´ a la section 3.10 – Membrane de contrˆle pour les composants primitifs.//binding-controller" server="BC.//lifecycle-controller" server="LC. e e <definition name="org.

Une exception notable est le serveur J2EE e e JBoss [Fleury and Reverbel 2003] dans lequel les services peuvent ˆtre acc´d´s via des ase e e pects d´finis a l’aide du canevas logiciel JBoss AOP [Burke 2003]. permettent ´galement e e e d’int´grer de fa¸on harmonieuse de nouveaux services dans les applications. cet ensemble de services est ferm´ et cod´ en dur dans les conteneurs.62 CHAPITRE 3. Le premier m´canisme est connu dans AspectJ. La loe e o gique d’int´gration repose sur deux m´canismes : l’injection de code et la modification de e e comportement. mais e e d’y impl´menter simplement la logique d’int´gration (i. Avec ce m´canisme. e ` e Cette pratique est mise en œuvre dans AOKell : chaque contrˆleur est associ´ a un o e ` aspect charg´ de l’int´gration de la logique du contrˆleur dans le composant. La r´alisation concr`te de la logique de contrˆle est d´l´gu´e par l’aspect au e e e o ee e contrˆleur impl´ment´ sous la forme d’un objet. ` LE SYSTEME DE COMPOSANTS FRACTAL Int´gration des contrˆleurs a l’aide d’aspects e o ` Les mod`les de composants comme EJB ou CCM fournissent des environnements dans e lesquels les composants sont h´berg´s par des conteneurs fournissant des services teche e niques. La plupart du temps. De nouveaux services e ` peuvent ˆtre d´finis qui seront alors acc´d´s a l’aide de leurs aspects associ´s. correspond en AspectJ a la e ` notion de code dit advice. On obtient ainsi une s´paration des pr´occupations quasi ` e e optimale entre la logique d’int´gration et celle du service a int´grer. e e les aspects peuvent d´clarer des ´l´ments de code (m´thodes ou attributs) qui ´tendent e ee e e la d´finition de classes existantes (d’o` le terme ITD car les aspects sont des types qui e u d´clarent des ´l´ments pour le compte d’autres types. Les blocs e e e de code advice sont alors ex´cut´s autour de ces points. par exemple. comment la fonctionnalit´ intere e e agit avec le reste de l’application) et de d´l´guer la r´alisation concr`te de la fonctionnalit´ ee e e e a un ou plusieurs objets externes. les m´thodes des interfaces de contrˆle sont inject´es dans les classes impl´mentant e o e e 5 . la modification de comportement.e. o e e 5 Ce comportement par d´faut peut ˆtre modifi´ afin. Dans le cas d’AOe ee Kell. des classes). Le code advice est utilis´ dans e e e AOKell pour intercepter les appels et les ex´cutions des op´rations des composants. . le contrˆleur de cycle de vie peut rejeter des invocations tant qu’un composant o n’a pas ´t´ d´marr´. les e aspects int`grent de nouvelles fonctionnalit´s dans les composants et contrˆlent leur e e o ex´cution. e e e e transaction et de gestion de cycle de vie. les sp´cifications EJB d´finissent des services de s´curit´. tout en fournise e e e sant un m´canisme pour modulariser les fonctionnalit´s transverses. Le code inject´ est constitu´ d’une souche qui d´l`gue le traitement a les composants e e ee ` l’objet impl´mentant le contrˆleur. i. Par e e exemple. Cela illustre e c ´galement une des bonnes pratiques de la programmation orient´e aspect : il est conseill´ e e e de ne pas impl´menter directement les fonctionnalit´s transverses dans les aspects. Par exemple. la d´finition d’un aspect est constitu´e de coupes et de e e code advice. e e e e ` e L’id´e g´n´rale illustr´e par le serveur JBoss est que les aspects.e. Les coupes s´lectionnent un ensemble de points de jonction qui sont des points e dans le flot d’ex´cution du programme autour desquels l’aspect doit ˆtre appliqu´. persistance. e o Le second m´canisme. ee e e Avec les m´canismes d’injection de code et de modification de comportement. de conserver des classes libres de e e e toute injection. Ainsi. sous la d´nomination de e e d´claration inter-type (en anglais ITD pour Inter-Type Declaration).

Plasma pour C++ et FractNet pour les langages de la plate-forme . FRACTAL ADL 63 3.NET. Supposons. o a e e le nom du syst`me de journalisation ainsi que son niveau (e. e Elle vise plus particuli`rement le d´veloppement de composants pour les applications e e s’ex´cutant sur les grilles de calcul. e e D’une part. plusieurs autres plates-formes de d´veloppement Fractal a e existent. o qu’un contrˆleur de journalisation (LoggerController) soit ajout´ a un composant. etc.). le mod`le de composants ´tant lui-mˆme extensible. Les architectures mat´rielles les plus e e courantes comme celles a base de processeurs PowerPC. Fassino 2001] est une impl´mentation de Fractal pour e le langage C. error). La motivation pour une telle extensibilit´ est double. 2002.3). 2003] est une impl´mentation de Fractal pour le langage Java. Dans le cadre des travaux en cours sur THINK v3. il est possible d’ase e e socier un nombre arbitraire de contrˆleurs aux composants. warning. FracTalk pour Smalltalk. ` e Le d´veloppement d’applications avec THINK passe par l’utilisation d’un langage pour e la d´finition des interfaces (IDL) des composants et un langage pour la description des e assemblages de composants (ADL). v´rification. c’est-`-dire pour que le d´ployeur d’application puisse sp´cifier.3. e e e Fractal ADL est constitu´ de deux parties : un langage bas´ sur XML et une usine e e qui permet de traiter les d´finitions faites a l’aide du langage. La e seconde motivation r´side dans le fait qu’il existe de multiples usages qui peuvent ˆtre faits e e d’une d´finition ADL : d´ploiement. des activit´s (processus et e e e processus l´gers) et de leur ordonnancement. THINK [Fassino et al. On peut citer en particulier. Nous pr´sentons ces deux e ` e . e 3. e e Finalement. Plasma [Layaida et al. trois autres impl´mentations du mod`le Fractal existent : Frace e Talk [Bouraqadi 2005] pour Smalltalk. ProActive [Baude et al. carte graphique. via l’ADL.g. Ethernet. Cela permet d’obtenir de fa¸on e e c transparente des interactions non bloquantes dans lesquelles les composants client poursuivent leurs traitements pendant l’ex´cution des services invoqu´s. Elle vise plus particuli`rement le d´veloppement de noyaux de syst`mes e e e qu’ils soient conventionnels ou embarqu´s. Cette derni`re e est bas´e sur AOKell. debug. par exemple.3 Fractal ADL Fractal fournit un langage de description d’architecture (ADL) dont la caract´ristique e principale est d’ˆtre extensible. 2004] pour C++ et FractNet [Escoffier and Donsez 2005] pour les langages de la plate-forme . ARM ou x86 sont support´es.NET. des syst`mes de fichiers ou des contrˆleurs e e o mat´riels (IDE.2. THINK est associ´ a KORTEX qui est une e e ` librairie de composants syst`me pour la gestion de la m´moire. l’ADL est en cours de convergence vers Fractal ADL (voir section 3. Chaque composant est muni d’un ensemble de threads qui lui sont propres et qui g`rent l’activit´ de ce composant. Il o e ` est n´cessaire que l’ADL puisse ˆtre ´tendu facilement pour prendre en compte ce noue e e veau contrˆleur. ProActive est bas´e sur la notion d’objet/compoe e sant actif. THINK pour le langage C. analyse.3 Autres plates-formes Au del` de Julia et de AOKell. ProActive pour le langage Java.3. etc. Une deuxi`me caract´ristique originale des compoe e e e sants Fractal/ProActive r´side dans leur s´mantique de communication : un m´canisme e e e d’invocation de m´thode asynchrone avec futur est utilis´.

e e Le composant loader analyse les d´finitions ADL et construit un arbre abstrait e correspondant (AST pour Abstract Syntax Tree). Chaque module — a l’exception du module de base — s’applique a ` ` un ou plusieurs autres modules. soit au module containment pour sp´cifier l’architecture de l’application : le module interface permet e de d´crire les interfaces d’un composant . Il permet a une d´finition d’en ´tendre une autre (via un attribut extends). Ce module d´finit un ´l´ment XML component qui e ee peut ˆtre ajout´ en sous-´l´ment d’un ´l´ment definition ou de lui-mˆme pour sp´cifier e e ee ee e e les sous-composants d’un composant. a un attribut e ee e obligatoire. c’est-`-dire rajoute un ensemble d’´l´ments et d’attributs a ee XML a ces modules. ee etc. Fractal ADL d´finit ace e tuellement trois autres modules qui s’appliquent soit au module de base. Le module de base d´finit l’´l´ment XML qui doit ˆtre utilis´ pour ` e ee e e d´marrer la description de tout composant. Le module de r´f´rencement s’applique au e e ee module containment en ajoutant un attribut definition a l’´l´ment component pour ` ee r´f´rencer une d´finition de composant. liaisons. Par e e 6 Notons cependant que le module de r´f´rencement est n´cessaire pour la description des composants ee e partag´s.11. Par exemple. Le rˆle principal de ces modules ee e o est de faciliter l’´criture de d´finition ADL 6 .2 L’usine extensible L’usine permet de traiter les d´finitions ´crites a l’aide du langage extensible Fractal e e ` ADL. L’AST implante deux API distinctes : une API g´n´rique similaire a celle de DOM [W3C-DOM 2005] qui permet de naviguer dans e e ` l’arbre . Contrairement aux autres e ADL qui fixent l’ensemble des propri´t´s (implantation. Notons ` e e que l’h´ritage propos´ par Fractal ADL est multiple. attributs. ` LE SYSTEME DE COMPOSANTS FRACTAL ´l´ments dans les deux sections suivantes.64 CHAPITRE 3. Il e e est constitu´ d’un ensemble (extensible) de modules permettant la description de divers e aspects de l’application.3. Fractal ADL fournit des modules permettant d’exprimer des relations de r´f´rencement et d’h´ritage entre descriptions ADL. e e 3. qui sp´cifie le nom du composant d´crit. l’ADL Fractal n’impose rien. e e e Diff´rents types de modules peuvent ˆtre d´finis. Elle est constitu´e d’un ensemble de composants Fractal qui peuvent ˆtre assembl´s e e e pour traiter les diff´rents modules de Fractal ADL d´crits pr´c´demment.) qui doivent ˆtre d´crites pour chaque composant. e . La troisi`me section d´crit le proc´d´ d’extension ee e e e e de l’ADL.1 Le langage extensible Le langage ADL de Fractal est bas´ sur le langage XML. Cet ´l´ment. une API typ´e qui varie suivant les modules qui sont utilis´s dans Fractal ADL. Ces composants e e e e sont repr´sent´s sur la figure 3. appel´ name. localisation. appel´ definition. Un exemple typique de module est le e e e module containment qui s’applique au module de base en permettant d’exprimer des relations de contenance entre composants. le module implementation permet de d´crire e e l’implantation des composant primitifs . Notons que l’´l´ment component a un attribut obliee gatoire name qui permet de sp´cifier le nom du sous-composant. o Les modules ne servent pas uniquement a d´crire les aspects architecturaux de l’appli` e cation. Le module d’h´ritage s’applique au module de ee e e base. 3. le module controller permet la description de la partie contrˆle des composants.3.

Le composant le plus a droite dans la chaˆ (basic loader) est responsable ` ıne de la cr´ation des AST a partir de d´finitions ADL. rˆle. Le composant builder d´finit un comportement concret pour les tˆches cr´´es par e a ee le compiler. FRACTAL ADL 65 factory loader (content not shown) compiler (content not shown) builder (content not shown) scheduler Figure 3. le composant binding loader v´rifie les liaisons d´clar´es e e e dans l’AST .g. Les a e tˆches produites par un compiler primitif peuvent d´pendre des tˆches produites par un a e a autre compiler primitif ce qui impose un ordre dans l’ex´cution des compiler. Par exemple. un comportement concret d’une tˆche de cr´ation de composant a e peut ˆtre d’instancier le composant a partir d’une classe Java. exemple. signature. Chaque composant correspond a un e ` module de l’ADL. Par exemple. le composant attribute loader v´rifie les attributs.). Le composant compiler utilise l’AST pour d´finir un ensemble de tˆches a ex´cuter e a ` e (e.11 – Architecture de l’usine Fractal ADL. ´tablissement de liaisons). etc. Par a ` exemple.13).3. Les autres composants effectuent e ` e des v´rifications et des transformations sur les AST. l’API typ´e contient des m´thodes permettant e e e de r´cup´rer les informations sur les interfaces de composants (nom. Le composant builder est e ` . etc.12).3. Chaque compiler primitif produit des tˆches correspondant a un ou plusieurs modules ADL. e le compiler primitif qui produit les tˆches de cr´ation des composants doit ˆtre ex´cut´ a e e e e avant les compilers en charge des liaisons et des attributs.12 – Architecture du composant loader. e e o Le composant loader est un composite encapsulant une chaˆ de composants primitifs ıne (figure 3. Par exemple. cr´ation de composants. Le composant compiler est un e e composite encapsulant un ensemble de composants compiler primitifs (figure 3. si le module interface est utilis´. le composant binding compiler produit des tˆches de cr´ation de liaisons. e binding loader component loader implementation loader type loader interface loader argument loader basic loader Figure 3.

3 Extension de Fractal ADL Cette section d´crit bri`vement la d´marche a suivre pour ´tendre Fractal ADL. e e e ` e Supposons que le d´veloppeur de l’application ait d´fini une interface de contrˆle e e o LoggerController permettant de configurer le nom et le niveau de journalisation de loggers associ´s aux composants (voir figure 3.3.66 CHAPITRE 3. Nous montrons tout d’abord comment le e langage ADL peut ˆtre ´tendu pour autoriser la description de ces deux param`tres dans la e e e description ADL de l’application.13). } Figure 3.14). ` 3.13 – Architecture des composants compiler et builder. e ` e e public i n t e r f a c e L o g g e r C o n t r o l l e r { S t r i n g getLoggerName ( ) . (2) ´criture de “fragments” de DTD sp´cifiant que le module logger permet e e . ` LE SYSTEME DE COMPOSANTS FRACTAL compiler type compiler builder type builder implementation compiler main compiler component compiler implementation builder component builder binding compiler binding builder Figure 3. void setLoggerName ( S t r i n g l o g g e r ) . L’extension du langage consiste a cr´er un module logger qui s’applique aux modules ` e de base containment en permettant de rajouter un ´l´ment logger dont la syntaxe est la ee suivante : <logger name="logger" level="DEBUG"/> Le d´veloppeur du module doit effectuer le travail suivant : (1) d´finition des interfaces e e qui seront implant´es par l’arbre abstrait lorsque le fichier XML aura ´t´ analys´ par le e ee e basic loader . un composite qui encapsule plusieurs builders primitifs (figure 3. Julia fournit actuellement quatre e composants builder qui permettent respectivement de cr´er des composants avec l’API e Java. Par exemple.14 – L’interface LoggerController. Chaque canevas logiciel peut d´finir ses composants builder. l’API Fractal ou de produire du code source permettant d’instancier les composants a partir de ces deux API. void s e t L o g L e v e l ( i n t l e v e l ) . int getLogLevel ( ) . Nous d´crivons ensuite les composants qui doivent ˆtre e e rajout´s a l’usine pour que les loggers soient configur´s lors du d´ploiement de l’application.

1 Dream Dans cette section. la configurabilit´ des MOM a fait l’objet de e e e e moins de travaux. Strom et al. BIBLIOTHEQUES DE COMPOSANTS 67 d’ajouter un ´l´ment XML logger aux ´l´ments definition et component. 1995. Notons. Nous d´crivons les ´l´ments principaux du canevas e ee Dream et illustrons son utilisation par la r´-ing´nierie de Joram. e e 7 . ´v´nement/r´action. il est uniquement n´cessaire de r´cup´rer le logger associ´ au e e e e composant et de l’initialiser a l’aide des informations contenues dans l’arbre abstrait.4. fiabilit´. e Pour faire face a ces limitations. les MOM existants fournissent souvent les mˆmes e propri´t´s non fonctionnelles pour tous les ´changes de messages. Cela r´duit leurs perforee e e mances et rend difficile leur utilisation pour des ´quipements aux ressources restreintes. nous pr´sentons Dream [Qu´ma 2005]. e e e e etc. files de messages. D’un point de vue non fonctionnel. s´curit´. van Renesse et al.` 3. les MOM existants implantent un mod`le e de communication fig´ : publication/abonnement. ` 3. Dream se d´marque des travaux existants par le fait qu’il ne cible pas unie quement les intergiciels synchrones et qu’il int`gre des primitives de gestion de ressources e permettant d’am´liorer les performances des intergiciels construits. ee ee L’extension de l’usine requiert l’ajout de deux composants : un compiler et un builder7 . 1998. ee e e e e joram 2002. e ` 3. Plue e e e sieurs MOM ont ´t´ d´velopp´s ces dix derni`res ann´es [Blakeley et al. 1999]. une biblioth`que de come e e posants d´di´es a la construction d’intergiciels orient´s messages dynamiquement configue e ` e rables plus ou moins complexes : de simples files de messages distribu´es a des syst`mes e ` e publication/abonnement complexes. En revanche. etc. e Le module logger ne n´cessitant pas de v´rifications s´mantiques. e Motivations L’utilisation d’intergiciels orient´s messages (MOM pour Messagee Oriented Middleware) est reconnue comme un moyen efficace pour construire des applications distribu´es constitu´es d’entit´s faiblement coupl´es [Banavar et al. L’implantation du compiler e e est simple : il cr´e une tˆche pour chaque logger a configurer et ajoute une d´pendance e a ` e de cette tˆche vers la tˆche de cr´ation du composant auquel le logger appartient. n´anmoins. Le composant compiler doit cr´er des tˆches qui configureront le nom et le niveau de e a journalisation des loggers d´clar´s dans la description ADL. la biblioth`que Dream propose de construire des ` e architectures modulaires a base de composants pouvant ˆtre assembl´s statiquement ou ` e e dynamiquement. D’un point de vue fonctionnel. Nous montrons que la version r´alis´e a l’aide de Dream a e e e ` des performances comparables et offre un gain de configurabilit´ significatif. 2003]. il n’est pas utile de modifier le e e e composant loader.4 Biblioth`ques de composants e Cette section pr´sente quelques biblioth`ques majeures existant a ce jour pour le e e ` d´veloppement d’applications a base de composants Fractal.4. Les travaux de recherche se sont concentr´s sur le support de propri´t´s non fonctionnelles vari´es : ordonnancement des e ee e messages. msmq 2002. Concera a e nant le composant builder. qu’il serait possible de d´velopper un loader v´rifiant que les noms e e e et niveaux de journalisation d´clar´s dans la description ADL ne sont pas nuls. une implantation open e e source de la sp´cification JMS.

Les tˆches a ` a a de plus haut niveau sont les tˆches applicatives (i. Une interface de sortie ` (output) permet a un composant d’´mettre un message. e . Au contraire. Les a e tˆches de plus bas niveau encapsulent des threads Java. e – Les interfaces d’entr´e et sortie de messages. // Processing of // message m Message pull (Map context){ Component A push(message. Leur but est de g´rer les ressources e e e m´moires consomm´es par les MOM. les composants passifs ne peuvent effectuer d’appels sur e leurs interfaces clients que dans une tˆche d’un composant appelant une de leurs ina terfaces serveurs.e. appel´ contrˆleur de tˆches (task controller). ` LE SYSTEME DE COMPOSANTS FRACTAL Architecture d’un composant Dream Les composants Dream sont des composants Fractal ayant deux caract´ristiques : la pr´sence d’interfaces d’entr´e/sortie de messages e e e et la possibilit´ de manipuler les ressources rencontr´es dans les intergiciels de communie e cation : messages et activit´s. Component B void push (Message m.15 (a)). context) .15 (c)). Une interface d’entr´e e e (input) permet a un composant de recevoir un message. d´truire et dupliquer des messages 8 . ils utilisent des r´serves (pools) e e e de messages permettant de r´duire le nombre d’allocations d’objets. } // Returns a message (a) Principe (b) Connexion Push (c) Connexion Pull Figure 3. Ces composants permettent e de cr´er. Pour ce faire. ee e appel´s gestionnaires de messages (message managers). Les messages sont toujours ` e transmis des sorties vers les entr´es (figure 3.15 (b)). Chaque chunk est ´galement un objet Java implantant des accesseurs (getter) et des mutateurs (setter). Les composants actifs d´finissent des e tˆches a ex´cuter. il faut qu’elle soit enregistr´e aupr`s d’un gestionnaire d’activit´s a e e e e e (activity manager). Dans le mode push. enregistr´es par le MOM).68 CHAPITRE 3. Map context){ // Processing of message m } Input Output Message m = pull(context). Les tˆches d’un composant actif sont accessibles par l’interm´diaire a e d’un contrˆleur sp´cifique. On distingue n´anmoins deux e e modes de transfert : push et pull. l’´change de message est initi´ e e par la sortie qui est une interface client Push li´e au composant auquel le message e est destin´ (figure 3.15 – Les interfaces d’entr´e et de sortie de messages. Pour qu’une o e e o a tˆche soit ex´cut´e. l’´change de message est initi´ par e e e l’entr´e qui est une interface client Pull li´e au composant ´metteur du message e e e (figure 3. e – Les gestionnaires de messages. Les ordonnanceurs sont a en charge d’associer des tˆches de haut niveau a des tˆches de bas niveau. Le canevas Dream d´finit deux intere e faces permettant aux composants de s’´changer des messages. Les messages sont g´r´s par des composants partag´s. Ces concepts sont repr´sent´s a e e 8 Les messages sont des objets Java encapsulant des chunks et des sous-messages. e – Les gestionnaires d’activit´s. Les gestionnaires d’activit´s sont des composants partag´s qui e e encapsulent des tˆches et des ordonnanceurs (schedulers). Dans le mode pull. Dream distingue deux sortes de composants : les e composants actifs et les composants passifs. Ces tˆches permettent au composant de poss´der son propre flot a ` e a e d’ex´cution.

Un exemple typique c e e e e de transformation consiste a rajouter une adresse IP a un message. – Les agr´gateurs/d´sagr´gateurs. Les pompes e ont une activit´ qui consiste a r´cup´rer un message sur l’entr´e et le d´livrer sur la e ` e e e e sortie. Les composants A et B ont enregistr´ trois tˆches qui sont ordone a nanc´es par un ordonnanceur FIFO. etc. BIBLIOTHEQUES DE COMPOSANTS 69 sur la figure 3. Chaque mese sage re¸u sur l’entr´e est transform´.16. Celui-ci utilise pour cela deux tˆches de bas e a niveau. Les files diff`rent par la mani`re dont les e e e messages sont tri´s (FIFO. Le routage peut se faire sur c e le contenu du message. Elle contient ´galement des composants sp´cifiques d´velopp´s pour des persone e e e nalit´s particuli`res de MOM. ` ` – Les pompes sont des composants avec une entr´e pull et une sortie push. e – Les canaux permettent l’´change de messages entre diff´rents espaces d’adressages.4. Elles ont une entr´e — qui est ` e utilis´e par les autres composants pour stocker des messages —. sa destination. et un canal entrant (channel in) — qui permet de recevoir des messages en provenance d’autres espaces d’adressage.` 3. etc. d´truit des messages). Les agr´gateurs sont des composants avec une ou e e e e plusieurs entr´es et une sortie. Les d´sagr´gateurs impl´mentent le comportement inverse c e e e e des agr´gateurs.16 – Exemple de gestionnaire de tˆches. LIFO. etc. Activity manager taskController taskManager Component A schedule Task A1 Task A2 Task B Component B FIFO Scheduler execute schedulerManager Third party Task (thread) Task (thread) Figure 3. et une sortie — que e la file utilise pour d´livrer les messages. puis d´livr´ sur la sortie. ordre causal. e – Les files de messages servent a stocker les messages. a La biblioth`que de composants La biblioth`que de composants Dream contient des e e composants implantant les fonctions que l’on trouve de fa¸on commune dans les diff´rents c e MOM. au minimum. – Les routeurs ont une entr´e et plusieurs sorties. e e Un canal est un composant composite distribu´ qui encapsule. Par manque de place. Le rˆle d’un routeur est de router e o les messages re¸us en entr´e sur une ou plusieurs sorties. . leur comportement dans les e diff´rents ´tats : file pleine (bloque vs.). e e e – Les transformateurs sont des composants avec une entr´e et une sortie. deux e composants : un canal sortant (channel out) — qui permet d’envoyer des messages vers un autre espace d’adressage —. file vide. nous nous contentons de d´crire les e e e composants formant le cœur de la biblioth`que. Leur rˆle est de d´livrer sur la sortie un agr´gat des e o e e messages re¸us en entr´e.

La fie e gure repr´sente ´galement deux networks typiques.18). un canal sortant (TCPChannelOut). l’ex´cution et les communications des agents e e e sont prises en charge par un MOM. chaque serveur e d’agents est constitu´ de trois ´l´ments architecturaux : l’engine est en charge de la e ee cr´ation et de l’ex´cution des agents. atomicit´. ordre causal).70 CHAPITRE 3.17.g. e SCServer Agent Agent Agent SCServer Agent Agent Agent Engine Engine Conduit Network 1 Network 2 Network 3 Network 1 Conduit Network 2 Global message bus Local bus Local bus Figure 3.18 fait e e . Les networks assurent la transmission fiable et causalement ordonn´e des messages. La premi`re e partie traite des messages Dream. L’impl´mentation Dream de la plate-forme ScalAgent ape e porte de nombreux b´n´fices en termes de configurabilit´ : il est ais´ de changer les e e e e propri´t´s non fonctionnelles fournies par le MOM (e. puis nous pr´sentons son impl´mentation a l’aide de Dream. un ensemble d’instructions e e consistant a prendre un message dans le conduit et faire r´agir l’agent destinataire. L’architecture que nous avons pr´sent´e sur la figure 3. L’engine est un composite qui comprend deux parties. La seconde partie correspond au composite e e Repository. Les deux sont des composites qui e e encapsulent un canal entrant (TCPChannelIn). e e ` – La plate-forme ScalAgent [Qu´ma et al.17 – Deux serveurs d’agents interconnect´s e – R´-ing´nierie de l’intergiciel ScalAgent avec Dream e e L’intergiciel ScalAgent a ´t´ r´-ing´nier´ a l’aide de Dream (figure 3. Ses princiee e e e` pales structures (networks. le conduit est impl´ment´ par un routeur dont l’algorithme de e e routage est bas´ sur l’identifiant de l’engine auquel le message est destin´. La file de messages permet de d´coupler les flots d’ex´cution de l’engine e e e e et du network. Par ee e ailleurs. Les agents sont des objets r´actifs qui se comportent conform´ment au e e mod`le “´v´nement → r´action” [Agha 1986]. Il effectue. et un transformateur (DestinationResolver) en charge d’ajouter l’adresse IP et le num´ro de port du destinataire du message. Comme on peut le voir sur la figure 3. Enfin. Le conduit route e e les messages de l’engine vers les networks. Elle est constitu´e d’une file de messages — qui e stocke les messages entrants — et d’un composite (AtomicityProtocol) qui garantit l’atomicit´ de la r´action des agents. Nous commen¸ons par d´crire la plate-forme Scae c e lAgent existante. 2004] permet le d´ploiement et l’ex´cution e e e d’agents. il est possible de modifier le nombre de composants actifs s’ex´cutant dans e un serveur d’agents. en boucle. Celui-ci est constitu´ d’un ensemble de serveurs e d’agents organis´s en bus. Le network 1 encapsule deux composants e suppl´mentaires : le CausalSorter garantit l’ordonnancement causal des messages e ´chang´s. engine et conduit) ont ´t´ pr´serv´es de mani`re a faciliter ee e e e ` la comparaison. La cr´ation. e e – Gain en configurabilit´. Celui-ci est en charge de la cr´ation et de l’ex´cution des agents. Il ` e garantit la persistance des agents et l’atomicit´ de leurs r´actions. ` LE SYSTEME DE COMPOSANTS FRACTAL R´-ing´nierie de JORAM Cette section pr´sente une exp´rimentations qui a ´t´ e e e e ee r´alis´e a l’aide de Dream : la r´-ing´nierie de la plate-forme ScalAgent qui supporte e e ` e e l’ex´cution de JORAM [joram 2002]. Les agents sont persistants et ont e e e e des r´actions atomiques.

[Leclercq et al. Ainsi. Enfin. BIBLIOTHEQUES DE COMPOSANTS 71 Figure 3.18 – Architecture Dream d’un serveur d’agents intervenir trois composants actifs pour un serveur d’agents avec un seul network. de journalisation et de gestion e e e ¦ ¡ ¤    ¤   ¥ § ¦ ¡ ©¤ # "! ¤  ¥ § ¡ ¥     E 8 "  F5 ¥ C ) ¦ ¡ ©¤ # "! ¢  ¡ ¥ ¦ ¥ B 8 ¡ # ¢" ¡ © ¤ A © ¤ # ¢@ ¥    ¥ ¤£ ¥ C D 8 ""  F5 $ 34 02 $0 %&&' 1 %&&' 34 02 01 )% ( %( V ¡ ¥ WS ¦ R ¤ Q ¦ ¥ £ ¢  ¤ ¡ ¤ "7 ¡ 5 ©£6 ¦ ¥ ¤ £ ¢  ¡ ¦ ¡ ¤   ¢ ¨ ¡ ¤ § ¥   ©  E 8 ""  ¢5 ¥ C ¦ ¥ ¤ ¦ "8  7£  5 ¡9 # 8 ¡  ¡ ¤ ¡ HG ©¤  ¨ ¡ ¤ § ¦ © ¦ ¥ B 8 ¡ # " ¡ © ¤ A © ¤ # ¢@ ¥    ¥ ¤£ ¥ C D 8 ""  ¢5 T ¡ ¥ US ¦ R ¤ ¢Q ¥  " ©  PI . Des mesures de performances ont montr´ que les e performances obtenues par la r´-ing´nierie a l’aide de Dream ´taient tout a fait e e ` e ` comparables a celles obtenues par la plate-forme ScalAgent. Par exemple. la r´duction du nombre de c e e composants actifs peut permettre des am´liorations de performances de l’ordre de e 15% pour certaines applications. de politiques de concurrence (mutex. Il est possible d’obtenir une impl´mentation mono-thread´e en supprimant les files de e e messages de l’engine et du network. Parmi les biblioth`ques existantes nous pouvons citer : e – Le projet Perseus [Chassande-Barrioz and Dechamboux 2003] d´finit une bie blioth`que de composants Fractal pour la construction de services de persistance e de donn´es. lecteurs/´crivain FIFO. de e r´serves (pools). optimiste). e e – Comparaison des performances.` 3. 2005a] pr´sente une modificae tion du serveur d’agents permettant son d´ploiement sur un ´quipement mobile. lece e teurs/´crivain avec priorit´ aux ´crivains.4. ces mesures ` ont montr´ qu’il ´tait possible d’avoir des gains de performances significatifs en e e configurant le MOM de fa¸on ad´quat. 3.2 Autres biblioth`ques e Plusieurs autres biblioth`ques de composants Fractal ont ´t´ d´velopp´es.4. Il s’agit dans e ee e e la plupart des cas de fournir des briques de base pour la construction d’intergiciels. il est possible d’adapter la plate-forme a ` des environnements contraints. Il fournit des composants de base pour la gestion de cache. Par ailleurs.

EJB. Il permet de construire des moniteurs transactionnels conformes a diff´rents standards (par exemple JTS. De mˆme. Les caract´ristiques de ces mod`les varient. mais autorise l’utie e e lisation de diff´rentes technologies. Le projet Tuscany e e [Tuscany 2006] fournit une impl´mentation en Java et en C++ de ces sp´cifications. quant a lui. CCM et COM+/. Dans e ee e e e le domaine des intergiciels. JMS ou IIOP pour mettre en œuvre e ces liaisons. Des composants sont ´galement disponibles pour d´crire les sc´narios de test de charge. allant de composants avec des propri´t´s d’ine e ee trospection (COM+). l’initiative SCA [SCA 2005] a d´fini un e e mod`le de composants pour des architectures orient´es services.72 CHAPITRE 3. enti`rement r´flexif et introspectable. – CLIF [Dillenseger 2004] est un canevas logiciel pour l’injection de charge. le e e e stockage et l’analyse du r´sultat des tests.5 Comparaison De nombreux mod`les de composants ont ´t´ propos´s ces dix derni`res ann´es. contrˆler et superviser des injecteurs e o de charge. Le ` mod`le Fractal est. Par e e contraste.). sous l’impulsion d’IBM. Il permet ´galement de g´rer des sondes pour mesurer l’´tat de rese e e sources syst`mes telles que le CPU.NET sont tous les trois accompagn´s e d’un mod`le fig´ de services techniques offerts par des conteneurs aux composants. Fractal est bas´ sur un mod`le ouvert. les propositions peuvent ˆtre class´es selon qu’ils sont issus e e d’initiatives industrielles. e – Le projet GoTM [Rouvoy 2004] est une biblioth`que de composants Fractal pour e la construction de moniteurs transactionnels. SCA n’impose pas une forme pr´d´termin´e de liaison. la m´moire ou tout autre type de ressources e e logicielle ou mat´rielle. dans lequel les services techniques sont e e enti`rement programmables via la notion de contrˆleur. a des composants avec liaisons et cycle de vie (OSGi et CCM). la collecte. ` LE SYSTEME DE COMPOSANTS FRACTAL de d´pendances. 2PC presume e commit. de la communaut´ du logiciel libre ou d’´quipes de recherche e e acad´miques. e Initiatives industrielles La premi`re cat´gorie comprend les mod`les issus d’initiatives e e e industrielles comme EJB (voir chapitre 5). e e e L’impl´mentation de ce composant repose sur des m´canismes syst`mes externes a e e e ` Fractal comme par exemple l’utilisation de /proc sous Unix. 3. Fractal autorise diff´rents types de liaisons et n’impose pas de e e technologie particuli`re. comme SOAP. autorise des liaisons e ` e e selon diff´rentes s´mantiques de communication et fournit un mod`le hi´rarchique autorie e e e sant le partage. SCA e e propose la notion de liaison pour l’assemblage et de module pour la cr´ation de hi´rarchies e e de composants. Chaque sonde est repr´sent´e par un composant Fractal. Les composants Perseus sont utilis´s notamment pour construire e e Speedo [Chassande-Barrioz 2003] qui est une impl´mentation des sp´cifications e e JDO [JDO 2002] de Sun. e o Plus r´cemment. etc. COM+/. Il constitue un des ´l´ments du projet ObjectWeb JMOB pour la mesure des performances ee des intergiciels. 2PC presume abort. Par ailleurs. OTS ou WS` e AT) et supportant diff´rentes formes de protocoles de validation (2PC.NET. e . CCM ou OSGi (voir chapitre 7). CLIF permet de d´ployer.

e o e e ee les contrˆleurs. e e Une caplet est une partie d’une capsule qui contient un sous-syst`me de l’application. si comme dans Fractal/AOKell les binders et les loaders sont aussi des composants. OpenCOM fournit les quatre notions suivantes : capsule. les loaders et les binders sont eux-mˆmes des composants. les composants e e OpenCOM fournissent des interfaces et requi`rent des r´ceptacles. les PDA et les syst`mes embarqu´s. 2001] et v2 [Coulson et al. Sans ˆtre exhausee e e e e tif. Les caplets.6 Conclusion Ce chapitre a pr´sent´ le syst`me de composants Fractal. les e e e intergiciels.3.6.1 est consacr´e a la pr´sentation du mod`le de composant Fractal. 2002]. les capsules et les caplets sont similaires aux composants come ` posites. Initiatives acad´miques Plusieurs mod`les de composants ont ´galement e e e ´t´ propos´s par des ´quipes de recherche acad´miques. L’architecture d’une e e application OpenCOM est introspectable et peut ˆtre modifi´e dynamiquement. e e Depuis la version 2. ces mod`les sont moins ouverts et extensibles que ne e e e e l’est Fractal. e Compar´ a Fractal. on peut citer ArchJava [Aldrich et al. OpenCOM v1 [Clarke et al. Ce` o pendant les contrˆleurs Fractal ne sont pas limit´s a ces deux types de propri´t´s extrao e ` ee fonctionnelles et peuvent englober d’autres services techniques. Carbon [Carbon 2004] et Plexus [Plexus 2004] qui ciblent les conteneurs de composants de type EJB. Il cible les syst`mes e e devant ˆtre reconfigur´s dynamiquement et en particulier les syst`mes d’exploitation. Pico [PicoContainer 2004] e e e et Hivemind [Hivemind 2004] qui ciblent la configuration de logiciel. Deux parties sont mises en avant dans un composant Fractal : le contenu et la membrane. Elle est compos´e d’entit´s ´l´mentaires. 2005]. Au niveau applicatif. soit composite et e e u e contenir des sous-composants (primitifs ou composites). le langage de description d’architecture et les biblioth`ques permettant e de d´velopper des syst`mes a base de composants Fractal. Les binders et les loaders sont quant a eux comparables aux contrˆleurs. Par ailleurs. Fractal/AOKell va au-del` et permet de r´ifier compl`tement l’architecture de contrˆle sous la forme d’un a e e o assemblage de composants. les principales plates-formes le e e e mettant en œuvre. caplet. o e e e . qui impl´mentent des interfaces dites de contrˆle. Le mod`le de composant o e o e Fractal est ouvert au sens o` il ne pr´suppose pas un ensemble fini et fig´ de contrˆleurs : de u e e o nouveaux contrˆleurs peuvent ˆtre ajout´s par les d´veloppeurs en fonction des besoins. De mani`re g´n´rale. 3. Ke Component [Dowling and Cahill 2001]. Kilim [ObjectWeb 2004]. FuseJ [Suv´e et al. Une capsule est l’entit´ qui contient et g`re les composants applicatifs. OpenCOM est certainement le mod`le le plus proche de Fractal. loader et binder. C’est un e ` e e mod`le hi´rarchique au sens o` les composants peuvent ˆtre soit primitif. CONCLUSION 73 Initiatives du monde du logiciel libre Dans la cat´gorie des mod`les de composants e e issus d’initiatives de type logiciel libre. e e ` La section 3. Cette derni`re fournit un niveau e m´ta de contrˆle et de supervision du contenu. Spring [Spring 2004]. Les e binders et les loaders sont des entit´s de premi`re classe qui offrent diff´rentes s´mantiques e e e e de chargement et de liaison pour les composants. nous pouvons notamment citer Avalon [Avalon ] qui est un mod`le de composants g´n´ral. 2004].

l’unification des styles de d´veloppement a e e ` . C. de nombreuses activit´s de recherche sont conduites autour e e e e de Fractal. Nous aurions pu ´galement mentionner e e les outils qui existent autour de Fractal. les syst`mes autonomiques. o e oe c Finalement. ee e Le d´veloppement des contrˆleurs se fait a l’aide d’un syst`me de classes mixin. Le langage de description d’architecture Fractal e ADL (voir section 3. AOKell utilise des techniques issues de la programmation orient´e aspect pour e l’int´gration des niveaux de base et de contrˆle. Par ailleurs. nous pouvons citer les travaux sur les approches formelles e et les calculs de composants. allant d’un simple service de e e o gestion de noms a des services plus complexes de gestion de persistance ou de transaction. Le mod`le Fractal est ind´pendant des langages de programmation. comme Fractal GUI qui permet de concevoir graphiquement une architecture de composants et de g´n´rer des squelettes de code.74 CHAPITRE 3. la s´curit´ et l’isolation e e e des composants. Plusieurs biblioth`ques de composants sont disponibles pour faciliter la tˆche des e a d´veloppeurs Fractal. C++ et les langages de la plate-forme . qui permet de d´velopper des intergiciels. ` Apr`s une premi`re version stable diffus´e en juillet 2002. Contrairement a e ` nombre d’ADL existants. la v´rification de comportements. ` Un composant Fractal est une entit´ logicielle qui poss`de des interfaces fournies (dite e e serveur) et/ou des interfaces requises (dites client).2 e e a pr´sent´ deux plates-formes. Julia et AOKell. La section 3. Fractal e e Explorer [Merle et al. 2004] qui est une console graphique d’administration d’applications Fractal. Julia est la plate-forme de r´f´rence du mod`le Fractal. la DTD de Fractal ADL n’est pas fig´e et peut ˆtre ´tendue e e e avec de nouvelles balises permettant d’associer des caract´ristiques suppl´mentaires aux e e composants.NET. AOKell e o ` e a ´t´ d´velopp´ par la suite et apporte une approche a base de composants de contrˆle ee e e ` o pour le d´veloppement des membranes. la version 2 des sp´cifications e e e e Fractal parue en septembre 2003 a permis d’en consolider l’assise. dont e e e Dream. ` LE SYSTEME DE COMPOSANTS FRACTAL De mˆme.3) permet de d´crire ces architectures de fa¸on plus concise qu’avec e c une simple API. e o L’API Fractal permet de construire d’assembler des composants ´l´mentaires afin de ee construire des applications compl`tes. Nous en avons pr´sent´es quelques unes dans la section 3. Un m´canisme d’extension permet de d´finir les traitements a ex´cuter lorsque e e ` e ces nouvelles balises sont rencontr´es. D’autres plates-formes existent pour les langages Smalltalk.4. Les composants o e de contrˆle sont eux-mˆmes des composants Fractal qui sont contrˆl´s de fa¸on ad-hoc. Fractal est maintenant une sp´cification stable et mature grˆce a laquelle de nombreux syst`mes et applications ont e a ` e pu ˆtre d´velopp´s. la granularit´ des contrˆleurs est quelconque. Fractal ADL est un langage ouvert bas´ sur XML. Celles-ci sont des assemblages de composants de e contrˆle qui g`rent et administrent les composants du niveau de base. Sans ˆtre exhaustif. Le concept de liaison permet de d´finir e des chemins de communication entre interfaces clientes et serveurs. Notons enfin que l’outil Fractal ADL d’analyse et e d’interpr´tation d’un assemblage est lui mˆme une application Fractal (donc un assemblage e e de composant Fractal). mettant en œuvre ce mod`le pour le e e e langage Java. La granularit´ des e liaisons est ´galement quelconque allant d’une simple r´f´rence dans l’espace d’adressage e ee courant a des liaisons plus complexes mettant en œuvre des m´canismes de communication ` e distante. Fractal RMI qui permet de construire des assemblages de composants distribu´s e communicants via un m´canisme d’invocation de m´thodes a distance et Fractal JMX pour e e ` l’administration de composants a l’aide de la technologie JMX.

6. le d´ploiement. la gestion de la qualit´ de service ou les composants e pour les grilles de calcul. Au del` de leur int´rˆt propre. ces travaux devraient ´galement a ee e servir de terreau pour compl´ter Fractal sur plusieurs points qui sont actuellement peu pris e en compte comme le paquetage (packaging). la s´mantique des interfaces e e collection ou les mod`les de composants pour les architectures orient´es service. e e .3. CONCLUSION 75 base de composants et d’aspects.

` LE SYSTEME DE COMPOSANTS FRACTAL .76 CHAPITRE 3.

comportementaux et non-fonctionnels des services.fr) Chapitre 4 Les Services Web L’acc`s aux syst`mes d’information s’appuie aujourd’hui de plus en plus sur des teche e nologies Internet. It has an interface described in a machine-processable format (specifically WSDL 1 ). ou institutionnelles) pour l’utilisation de l’Internet et ont permis l’´mergence e des services Web comme support de d´veloppement des applications accessibles par Ine ternet.-C. e ee e Ci-dessous.2 discute de la mod´lisation des interace e tions support´es par un service Web en abordant les deux points de vue. e ` La section 4.1 Services Web : historique. Puis la section 4. en forme de conclusion.org/licenses/by-nc-nd/ 2. structurel et e comportemental.1 commence par donner quelques d´finitions et principes n´cessaires a e e ` la compr´hension de la suite. M. Ainsi. et principes e Plusieurs d´finitions des services Web ont ´t´ mises en avant par diff´rents auteurs. Finalement e la section 4. les technologies associ´es aux services Web sont devenues incontournables e pour le d´veloppement d’applications interagissant les unes avec les autres par le biais de e l’Internet. Fauvet (version du 19 janvier 2007 . Dans la section 4. come merciales. Les efforts de standardisation dans ce contexte ont accentu´ l’engouee ment des personnes et des organisations (aussi bien acad´miques. Dumas. d´finition. nous citons une d´finition g´n´ralement accept´e et fournie par le consortium e e e e W3C [W3C-WSA-Group 2004] : A Web service is a software system designed to support interoperable machineto-machine interaction over a network.4 nous d´crivons quelques outils existants pour la mise en œuvre de services Web. Nous proposons dans ce chapitre de faire un point sur le sujet des services Web. quelques perspectives faisant actuellement l’objet de recherches.10:31) Licence Creative Commons (http://creativecommons.Intergiciel et Construction d’Applications R´parties e c 2006 M.0/fr/deed. 4. qu’industrielles. La section 4.5 donne. L’objectif de la discussion est de traiter des aspects conceptuels de la mod´lisation des e services aussi bien que des aspects li´s a leur implantation. Other systems interact with 1 Web Service Description Language .3 donne un ´clairage sur les principaux standards pour la e description de services Web en les distinguant selon leur capacit´ a traiter des aspects e ` structurels.

LES SERVICES WEB the Web service in a manner prescribed by its description using SOAP 2 messages. De fa¸on similaire. mˆme o e s’ils sont g´n´ralement produits et consomm´s en XML ou en utilisant des interfaces e e e de programmation bas´es sur les concepts d’´l´ment et d’attributco d´finis par le e ee e mod`le dit « XML Infoset ». permet de d´gager au moins deux principes e fondamentaux : – Les services Web interagissent au travers d’´changes de messages encod´s en XML. certains auteurs proposent l’utilisation de messages XML (sans les extensions apport´es par SOAP) ´chang´s directee e e ment sur le protocole HTTP. en utilisant le langage WSDL qui. e – Les interactions dans lesquelles les services Web peuvent s’engager sont d´crites e au sein d’interfaces. e Une ´tude plus approfondie des points communs partag´s par les diff´rentes d´finitions e e e e et par les usages qui sont faits des services Web. En revanche. La d´finition W3C restreint la port´e des interfaces des sere e vices Web aux aspects fonctionnels et structurels. Par exemple. sans ˆtre contraints par des stane dards comme c’est le cas de CORBA qui d´finit des ponts sp´cifiques entre le langage e e de d´finition IDL4 et diff´rents langages de programmation.78 CHAPITRE 4. la d´finition officielle du consortium W3C c e fait sp´cifiquement r´f´rence au protocole HTTP. Ainsi par exemple. les services Web ne sont pas concern´s par la fa¸on dont e e c les messages sont produits ou consomm´s par des programmes. mais en pratique.4). D’autres d´finitions similaires adoptent un point de vue plus g´n´ral en ne prescrivant e e e pas l’usage exclusif de WSDL pour la description des interfaces de service ou celui de SOAP pour le traitement des messages 3 . Ainsi.3. e 4 Interface Definition Language 3 2 . d’autres auteurs proposent d’aller plus loin et de consid´rer e aussi les aspects comportementaux et non-fonctionnels comme nous le verrons dans la section 4. Cependant. ne permet de d´crire que des noms d’op´rations et des types de e e messages. IBM Websphere ou . les messages sont plutˆt transmis dans un encodage binaire.Net (voir le chapitre 6) offrent un environnement pour des m´thodes de d´veloppement tr`s sophistiqu´es. des plates-formes plus lourdes telles que BEA WebLogic. d’autres protocoles e ee sont aussi utilis´s (voir Section 4. Ceci permet aux vendeurs e d’outils de d´veloppement d’offrir diff´rentes m´thodes et interfaces de programmation e e e au-dessus de n’importe quel langage de programmation. ce qui explique e que la d´finition ci-dessus essaye d’imposer ces standards. il est possible e d’offrir des environnements pour des m´thodes de programmation de services Web minie malistes au-dessus de plates-formes relativement l´g`res comme c’est le cas de NuSOAP e e (pour le langage PHP) ou d’Axis (voir la section 4. e e e e Simple Object Access Protocol Il faut noter que WSDL et SOAP sont des standards d´finis par le consortium W3C. En d’autres termes. e e Dans certains cas. les fournisseurs d’oue e tils de d´veloppement peuvent facilement diff´rencier leurs produits avec ceux de leurs e e concurrents en offrant diff´rents niveaux de sophistication. Par rapport a d’autres plates-formes pour le d´veloppement d’applications distribu´es ` e e telles que CORBA (voir le chapitre 1) et Java RMI (voir le chapitre 5). l’une des diff´rences e primordiales est que les services Web n’imposent pas de mod`les de programmation e sp´cifiques. typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards. essentiellement.4).

De e e o plus. comme nous le discuterons dans la section 4. Dans une e e interface. un client et un fournisseur. Une s´quence de telles interactions est appel´e e e une conversation.2 4. nous utilisons des diagrammes d’activit´ UML e ` e . aussi bien du point de vue structurel (types de messages e ´chang´s) que du point de vue comportemental (flot de contrˆle entre interactions). bien que simples. la figure 4. Une orchestration e peut ˆtre vue comme un raffinement d’une interface qui inclut des actions qui ne sont e pas n´cessairement pertinentes pour les clients du service mais qui servent a remplir e ` les fonctions que le service fournit et doivent donc ˆtre prises en compte dans son e implantation. Une orchestration d´crit un ensemble d’actions communicationnelles e et d’actions internes dans lesquelles un service donn´ peut ou doit s’engager (afin de e remplir ses fonctions) ainsi que les d´pendances entre ces actions. e 4. a e – Orchestration. Cependant. MODELISATION DE SERVICES WEB 79 Les principes a la base des services Web.3. Une chor´graphie d´crit.1 Mod´lisation de services Web e Points de vue dans la mod´lisation de services e Les services Web interagissent les uns avec les autres par le biais d’envois de messages. ces interactions peuvent ˆtre vues d’une fa¸on globale. Une interface d´crit un ensemble d’interactions dans lesquelles un service e donn´ peut ou doit s’engager et les d´pendances entre ces interactions. est aussi un point fort des services Web. d’une part un ensemble d’interactions qui e e e peuvent ou doivent avoir lieu entre un ensemble de services (repr´sent´s de fa¸on e e c abstraite par des rˆles). Afin de laisser la description de cette chor´graphie a un niveau abstrait. c’est-`-dire ` c a du point de vue d’un service donn´. les interactions sont d´crites du point de vue du service concern´ sous forme e e d’actions communicationnelles. De ce fait. expliquent leur adoption ` rapide : le nombre d’outils associ´s au services Web a connu un essor consid´rable dans e e une p´riode de temps r´duite. il est possible de distinguer e trois types de mod`les de services : e – Chor´graphie. une interaction entre deux services. Selon cette dimension. o e – Interface. Dans ce cadre. c’est-`-dire d’envois et de r´ceptions de messages. En particulier. des efforts de recherche et de d´veloppement plus approfondis e sont n´cessaires afin de r´ellement exploiter ce principe dans des outils ou des m´thodes e e e de d´veloppement. l’usage e des descriptions comportementales et non-fonctionnelles des services requi`rent davantage e d’attention de la part de la communaut´ de recherche.2. De e cette interaction peuvent d´couler d’autres interactions. e e ` La description explicite des interactions entre les services Web.2. A titre d’exemple.´ 4. au cours desquelles les rˆles de e o client et de fournisseurs peuvent s’inverser. c’est-`-dire du point de vue e c a d’un ensemble de services participant a une collaboration. la mod´lisation de services Web met en jeu la description d’interactions e et de leurs interd´pendances. ou de fa¸on locale. assurant ainsi que les technologies associ´es aux services e e e Web seront utilis´es pour de nombreuses ann´es a venir.1 pr´sente une chor´graphie correspondant a un processus e e ` de gestion de commandes dans le domaine commercial. et d’autre part les d´pendances entre ces interactions. est d´crite e par un envoi de message par le client et la r´ception de ce message par le fournisseur.

et en particulier des flots de contrˆle. dans l’activit´ « Commande ». Bien entendu. nous faisons e e r´f´rence a l’envoi du Bon de Commande (BdC) par le client au fournisseur. soit la e r´ception. e e Il est a remarquer aussi que les diagrammes d’activit´ permettent de mod´liser des ` e e aspects comportementaux. ee ` le fournisseur doit ex´cuteur l’action correspondant a la r´ception de ce message. ` o pour chaque ´change de message le diagramme montre soit l’envoi de ce message. e e e Client Fournisseur Entrepôt Commande [envoyer BdC à fournisseur] Vérification de Stock [envoyer demande de disponibilité à entrepôt recevoir avis de disponibilité de entrepôt] Disponible Pas disponible Acceptation [envoyer acceptation à client] Rejet [envoyer rejet à client] Demande de Livraison [envoyer bordereau d’expédition à entrepôt] Expédition [envoyer avis d’expédition à client] Paiement [envoyer copie d’ordre de Facturation [envoyer facture à client] Confirmation de Livraison [recevoir avis de livraison du client] transfert à fournisseur] Figure 4. fournisseur et entrepˆt en l’occurrence). Par exemple. En effet. Pour simplifier. mais pas les deux. Ils ne permettent pas o cependant de mod´liser des aspects structurels tels que les types de donn´es d´crivant le e e e contenu des messages ´chang´s. LES SERVICES WEB dans lesquels les actions correspondent a des interactions entre des rˆles correspondant ` o a des types de service (client.1 n’adopte le point de vue e e e d’aucun des services (ou plus pr´cis´ment des rˆles) concern´s. Ceux-ci peuvent ˆtre d´crits au travers de diagrammes de e e e e classe mais nous omettons ces d´tails car ils ne contribuent pas a la compr´hension du e ` e concept g´n´ral de chor´graphie.80 CHAPITRE 4. mais e ` e nous ne pr´sentons pas cette action duale dans le diagramme d’activit´s.1 – Une chor´graphie e Il faut noter que la chor´graphie pr´sent´e dans la figure 4. cette chor´graphie e e o e e .

comme par exemple un service cens´ jouer le rˆle de fournisseur dans e e o l’exemple en question. Parfois. chaque ´l´ment e e e ee de la s´quence correspond a une r´ception (par exemple Recevoir bon de commande) ou un e ` e envoi de message (par exemple Envoyer demande de disponibilit´). dans le cadre des services Web on e e s’int´resse a des descriptions plus riches. o e e e Recevoir bon de commande Envoyer demande de disponibilité Recevoir avis de disponibilité Disponible Envoyer acceptation Non disponible Envoyer rejet Envoyer bordereau d’expédition Envoyer facture Recevoir copie d’ordre de transfert Figure 4. Mais alors que traditionnel` e lement le concept d’interface est associ´ surtout a une description structurelle (c’est-`e ` a dire une description des param`tres d’une op´ration). ou ee ` de l’interface qu’un service est cens´ fournir dans le cadre d’une chor´graphie. l’interface correspondant au rˆle de fournisseur dans la chor´graphie de o e la figure 4. L’ensemble des types e de messages ´chang´s mod´lisent la dimension structurelle de l’interface alors que le flot e e e de contrˆle exprim´ par la s´quence mod´lise la dimension comportementale de l’interface.2. incorporant des aspects comportementaux. A e ` titre d’exemple. o e Selon que l’on se r´f`re a l’interface qu’un service existant est capable de fournir. l’interface d’un service existant est identique ou compatible avec . Dans ce cas.2 – Interface correspondant au rˆle de fournisseur dans la chor´graphie de la figure 4.1. entre le fournisseur et son entrepˆt. Le concept d’interface est d´riv´ des langages de programmation et des e e intergiciels a base d’appels de proc´dures tels que CORBA. Dans cette derni`re figure. on parle e e d’interface fournie ou d’interface requise (voir chapitre 2). d´riv´e de la chor´graphie donn´e ` e e e e dans la figure 4.´ 4. MODELISATION DE SERVICES WEB 81 inclut des interactions entre le client et le fournisseur. on s’int´resse a voir des interactions du point de vue d’un e e ` service sp´cifique.1 est repr´sent´e sur la figure 4. L’interface pr´sent´e dans la e e figure 4. Une interface de service d´crit un ensemble d’interactions dans lesquelles un service donn´ peut e e ou doit s’engager. o et entre l’entrepˆt et le client. Lorsqu’on passe a des ´tapes ult´rieures dans le cycle de o ` e e d´veloppement de services.2.2 correspond a l’interface requise du fournisseur. on utilise la notion d’interface (voir chapitre 2).1.

dans l’interface requise. consid´rons le cas o` l’interface repr´sent´e sur la figure 4. Certains auteurs consid`rent ainsi qu’une ore e e e e chestration est une implantation d’un service (voir par exemple [Peltz 2003]). e e l’ordre d’exp´dition et la facture sont envoy´s dans n’importe quel ordre.3 – Exemple d’interface fournie. Ce probl`me est connu sous le nom d’adaptation de services et fait l’objet de e plusieurs efforts de recherche (voir section 4.3. alors que dans l’interface requise le e service peut r´pondre par une acceptation ou un rejet. LES SERVICES WEB l’interface requise pour participer a une chor´graphie. A titre d’exemple. alors que dans e e l’interface requise l’envoi de la facture et la r´ception de l’ordre de paiement pr´c`dent e e e l’envoi de l’ordre d’exp´dition. l’interface fournie diff`re e e de l’interface requise en deux points. mais nous nous limitons ici a pr´senter une e ` e seule action non-expos´e pour ´viter de compliquer l’exemple. Ceci peut faire penser qu’une orchestration est un programme ex´cutable.3 e u e e est l’interface fournie par un service que l’on voudrait utiliser pour remplir le rˆle de o fournisseur dans la chor´graphie de la figure 4. ceci n’est pas toujours ` e le cas.1. Cependant. interfaces qui a leur tour. dans l’interface fournie il r´pond e e avec le mˆme type de message quel que soit le cas. Plus g´n´ralement.82 CHAPITRE 4. Cette orchestration rajoute une action (indiqu´e en lignes pointill´es) qui n’est e e pas expos´e dans l’interface. Une orchestration peut ˆtre con¸ue comme un mod`le d´crivant le mode op´ratoire e c e e e d’un service. Dans ce contexte. on peut attendre qu’une orchestration e e e u introduise davantage d’actions non-expos´es. Recevoir bon de commande Envoyer demande de disponibilité Recevoir avis de disponibilité Envoyer réponse à bon de commande Réponse négative Réponse positive Envoyer facture Recevoir copie d’ordre de transfert Envoyer bordereau d’expédition Figure 4. ` peuvent ˆtre d´riv´es d’une chor´graphie. la figure 4.5. Ce mod`le peut manquer de quelques d´tails pour ˆtre ex´cutable.1). Premi`rement. Dans ce contexte. il est n´cessaire de r´concilier ces deux e e e interfaces. Enfin. auquel e e e e cas il doit ˆtre raffin´ davantage pour pour pouvoir ˆtre ensuite implant´ dans un langage e e e e . ce qui n’est pas tout a fait e ` exact.4 pr´sente une orchestration correspondant a l’interface de la fie ` gure 4. En r´alit´ bien sˆ r. une ore e e e chestration est un raffinement d’une ou plusieurs interfaces. Deuxi`mement.

e e e ` L’int´rˆt de cette interface requise. De cette mani`re. En r´sum´. 4. ´tant donn´e la chor´graphie d´crite ee e e e e e . MODELISATION DE SERVICES WEB 83 de programmation tel que Java ou BPEL (voir Section 4. a condition de ` masquer ses op´rations qui ne doivent pas ˆtre expos´es. Par exemple. o e e e Par exemple. peut ainsi ˆtre contrˆl´e.´ 4. Recevoir bon de commande Envoyer demande de disponibilité Recevoir avis de disponibilité Envoyer réponse à bon de commande Réponse négative Réponse positive Envoyer facture Recevoir copie d’ordre de transfert Vérifier paiement Envoyer bordereau d’expédition Figure 4. Ces e e interd´pendances peuvent ˆtre exploit´es au cours du processus de d´veloppement pour e e e e effectuer des contrˆles de coh´rence entre les points de vue et pour g´n´rer du code. Ceci a pour avantage de faire co¨ ıncider l’interface fournie d’un service avec l’interface telle qu’elle est requise par les services qui l’utilisent.2. au cours de la phase de d´veloppement des seree e vices a ´t´ soulign´ plus haut. une interface requise peut constituer le point de d´part de la g´n´ration e e e d’une « ´bauche d’orchestration »qui est ensuite compl´t´e par la description d´taill´e e ee e e des op´rations internes pour enfin ˆtre raffin´e jusqu’` obtenir le mod`le complet d’ore e e a e chestration.2 Relations entre points de vue Les points de vue discut´s ci-dessus ne sont pas ind´pendants les uns des autres. les utilisations d’un mod`le d’orchestration sont : e e e – La g´n´ration de l’interface requise pour chacun des services amen´s a collaborer. il est pose e oe e sible de d´tecter des situations o` l’ordre des envois effectu´s par un service ne correspond e u e pas a l’ordre attendu par les services destinataires avec lesquels il est cens´ collaborer. La ` e r´solution de ces incompatibilit´s s’appuie. un mod`le d’orchestration exise e e e tant peut ˆtre utilis´ pour g´n´rer son interface fournie. soit sur la modification du mod`le d’orchestrae e e tion. soit sur la fourniture d’une enveloppe devant effectuer la m´diation entre l’interface e fournie et celle requise.3. De plus.4 – Exemple d’orchestration raffinant l’interface de la figure 4.2. La coh´rence de l’interface fournie e e e e e r´sultante avec l’interface requise.4).

e c une famille de standards pour le d´veloppement de services pour le commerce ´lectronique. les donn´es peuvent ˆtre d´finies selon un sch´ma. Il faut noter que ces concepts ee ` apparaissent parfois avec des noms diff´rents dans la litt´rature. Casati et e e al. Cette structure n’est pas e ` e e aussi rigide que celle d’une base de donn´es relationnelle par exemple. Les langages pr´sent´s dans cette section sont fond´s sur XML (eXtensible Markup Lane e e guage) [W3C-XML ]. e la valeur ajout´e apport´e par UDDI est difficile a identifier.3. o – Le contrˆle. la structure des donn´es est fournie par le biais de l’utilisation de e balises (comme en SGML Standard Generalized Markup Language [Goldfard 1990]. aussi bien que sur leurs aspects non-fonctionnels (section 4. [Alonso et al. 2005a.3. e e l’interface fournie est appel´e « profil de protocole de collaboration »(collaboration proe tocol profile en anglais) alors que l’interface requise est appel´e « accord de protocole de e collaboration »(collaboration protocol agreement). e e e Dans un document XML. LES SERVICES WEB figure 4. pour soumettre e e e des requˆtes a base de mots-cl´s sur ces r´pertoires et pour naviguer au travers des descripe ` e e ´ tions obtenues par le biais de ces requˆtes. en ebXML [UN/CEFACT and OASIS 1999].3 Description de services Web Dans cette section sont discut´es les questions li´es a la description des interfaces des e e ` services. au moment de la conception. de remplir son rˆle. Dans un document e XML. Par exemple. Cette description peut porter sur les aspects structurels (section 4. De fa¸on similaire. La ee ` r´solution de telles incompatibilit´s fait l’objet de recherches en cours (voir par e e exemple [Benatallah et al. il est possible de d´river les interfaces requises des services fournisseur. e e e e Cette ´bauche peut ensuite ˆtre d´taill´e dans la perspective.3. la capacit´ du e e e service a assumer le rˆle qu’il est sens´ jouer dans cette chor´graphie est v´rifi´e. 2003] utilisent le terme « protocole de collaboration »pour se r´f´rer au ee concept de chor´graphie.3). ` o e e e e – La g´n´ration d’une ´bauche d’un mod`le d’orchestration pour chaque participant. XML est un standard de repr´sentation de donn´es semi-structur´es. mais en s’affranchissant des aspects li´s a la pr´sentation des donn´es). le lecteur peut se r´f´rer a [Dijkman and Dumas 2004]. d’interface et d’orchestrae e tion. 4.1) et/ou comportementaux (section 4. Ainsi. pour chaque particie e e e pant. e client et entrepˆt.2) des services. Le lecteur int´ress´ par les probl`mes li´s a la d´tection d’incompatibilit´s e e e e ` e e entre interfaces fournies et interfaces requises peut se r´f´rer a [Martens 2005]. UDDI d´finit une interface de programmae e tion pour publier des descriptions de services dans des r´pertoires d´di´s.1. Fauvet and Ait-Bachir 2006]).84 CHAPITRE 4. de la coh´rence de l’interface existante o e d’un service avec le mod`le de chor´graphie auquel il participe. Peu d’architectures a base e e ` ` . mais cela n’est pas obligatoire et e e e e le sch´ma peut laisser quelques parties partiellement sp´cifi´es. e e e Une probl´matique g´n´ralement associ´e a la description de services est celle de e e e e ` leur publication et de leur d´couverte. et d’autres e technologies pour la gestion de r´pertoires tels que LDAP [Koutsonikola and Vakali 2004]. o Pour une d´finition formelle des concepts de chor´graphie. Un standard propos´ pour s’attaquer a cette e e ` probl´matique est UDDI [OASIS UDDI 2005]. Etant donn´e l’existence de moteurs de recherche e e sophistiqu´s aussi bien pour des Intranets qu’au niveau de l’Internet tout entier.

Les descriptions WSDL sont en fait e l’´quivalent des interfaces IDL (Interface Definition Language) de CORBA par exemple.org/wsdl/soap/" xmlns="http://schemas.xsd"> <xsd:complexType name="Commande"><xsd:sequence> <xsd:element name="dateCommande" type="xsd:date"> <xsd:element name="LigneDeCommande" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType><xsd:sequence> <xsd:element name="R´f´renceProduit" type="xsd:string"/> e e <xsd:element name="Quantit´" type="xsd:positiveInteger"/> e </xsd:sequence></xsd:complexType></xsd:element> </xsd:sequence></xsd:complexType> . e e L’´l´ment definitions constitue la racine du document et fournit les espaces de noms. La mise en correse pondance (implementation binding) entre l’interface et son implantation est fournie.w3. e Dans le langage WSDL.yothuyindi. La description abstraite contient : (i) la d´finition des messages qui sont consomm´s et g´n´r´s par le service (les entr´es et e e e ee e les sorties).yothuyindi.4.yothuyindi.yothuyindi. malgr´ les associations souvent e e e faites entre UDDI et la probl´matique de la description de services. Un point d’entr´e consiste en la descripe e e tion abstraite d’une interface et de son implantation.org/wsdl/"> Les types de donn´es. La description WSDL de l’interface donn´e figure 4. e 4. DESCRIPTION DE SERVICES WEB 85 de services s’appuient aujourd’hui sur UDDI et le futur de ce standard est incertain. param`tres d’entr´e et/ou de sortie sont ´ventuellement d´crits e e e e e ensuite en XMLSchema [W3C-XMLSchema ].fr:8080/exemple/fournisseur.xmlsoap. un service est vu comme une collection de messages pour les ´changes et d’une collection de points d’entr´e. et (ii) la signature des op´rations offertes par le service. en XML.3. chacun dans ` une quantit´ non nulle donn´e.xmlsoap. e e <types> <schema targetNamespace="http://www.2 du service de r´ception d’une commande offert par le fournisseur est e e ´bauch´e ci-dessous. ee <?xml version="1.fr:8080/exemple/fournisseur.3.fr:8080/exemple/fournisseur.wsdl" xmlns:xsd="http://www. des services ind´pendamment de la plate-forme et du langage utilis´s et sous une forme que des e e personnes ou des programmes peuvent interpr´ter. L’objectif est de fournir la description. Par cons´quent.0"?> <definitions name="RecevoirBdC" targetNamespace="http://www.wsdl" xmlns:xsdl="http://www.1 Description fonctionnelle et structurelle : WSDL WSDL (Web Services Description Language) [W3C-WSD-Group ] est un langage de la famille XML permettant de d´crire les types de donn´es support´s et les fonctions e e e offertes par un service Web. Elle contient essentiellement l’indication du protocole utilis´ pour ´changer des messages avec e e le service (par exemple SOAP au-dessus de HTTP) et les associations entre la description de l’interface abstraite du service et les types de messages support´s par le protocole e de communication sous-jacent (par exemple SOAP).org/2001/XMLSchema/" xmlns:wns="http://www.xsd" xmlns:soap="http://schemas. nous ne d´taillons pas UDDI dans ce chapitre.fr:8080/exemple/fournisseur. La description d’une commande est d´crite e ci-dessous comme une date et une liste non vide de produits a commander.

output pour celui en sortie et fault pour un message e d’erreur ´mis par le service. WSDL permet l’existence de plusieurs points d’entr´e dans un mˆme document. Un e e e point d’entr´e (´l´ment portType) fournit la signature de chaque op´ration et doit par la e ee e suite ˆtre associ´ a une implantation particuli`re (voir plus loin la description de la partie e e` e binding). Les valeurs fournies pour les attributs e e e element sont des noms de types XML Schema ou d´finis dans la partie types ci-dessus... l’autre est l’accus´ de r´ception renvoy´.. la mˆme op´ration peut ˆtre rendue disponible au travers d’implantations diff´rentes. e e e e <portType name=pt_RecevoirBdC> <operation name="op_Commande"> <input message="wsn:SoumissionBdC"> <ouput message"=wsn:R´c´piss´BdC"> e e e </operation> <operation name=. – R´ception .86 CHAPITRE 4. e ee La d´finition de la signature d’une op´ration s’appuie sur trois sous-´l´ments possibles : e e ee input pour le message en entr´e. e ´ – Emission (sous-´l´ment output) : le service envoie un message (d’alerte par exemple) ee a un client. C’est le mod`le classique RPC (Remote Procedure e Call. </portType> Dans la description ci-dessus les valeurs des attributs message font r´f´rence a un ee ` message d´fini plus haut (´l´ment message du document WSDL). ´ – Emission . Les combinaisons possibles de ces sous-´l´ments permettent e ee de d´crire divers mod`les d’op´rations : e e e – R´ception de message (sous-´l´ment input) : le service re¸oit un message envoy´ par e ee c e un client . le client r´pond sous forme d’un message de retour.retour (sous-´l´ment output suivi de input et ´ventuellement de fault) : ee e le service envoie une requˆte a un client (suite a une inscription pr´alable) sous forme e ` ` e d’un message .. ` . LES SERVICES WEB . le document e e d´crit deux messages pour l’interaction : le premier message est la requˆte re¸ue par le e e c service. . Ici. e <message name="SoumissionBdC"> <part name="body" element="xsdl:Commande"/> </message> <message name="R´c´piss´BdC"> e e e <part name="body" element="xsd:string"/> </message> Les op´rations offertes par le service sont expos´es par le biais de points d’entr´e.</schema> </types> Vient ensuite la description de la liste des d´finitions des messages ´chang´s e e e ind´pendamment de l’implantation du service et du protocole utilis´.. e e Ainsi.´mission (sous-´l´ment input suivi de output et ´ventuellement de e e ee e fault) : le service re¸oit une requˆte sous forme d’un message puis ´met une r´ponse c e e e sous forme d’un retour de message. voir chapitre 1) ..

org/soap/http"/> <operation name="op_Commande"> <soap:operation soapAction="http://www.fermeture de la balise racine --> </wsdl:definitions> Le document final est obtenu par la concat´nation des extraits fournis ci-dessus.xsd" encodingStyle="http://schemas. ces contraintes sont assez simples.3.xmlsoap.xmlsoap.fr/exemple/fournisseur. DESCRIPTION DE SERVICES WEB 87 La derni`re partie du document fixe la mise en correspondance entre chaque point e d’entr´e (un ensemble d’op´rations) et son implantation.xsd" encodingStyle="http://schemas.xmlsoap.yothuyindi.yothuyindi. ci-dessous est donn´e une description r´sum´e d’une des interfaces d´finie par le e e e e . e ` e l’implantation des points d’entr´e s’appuie sur SOAP. Ces outils prennent en entr´e e e e la description du service sous forme d’une classe Java (ou une archive jar) ou d’un objet COM. D’autres fois. et permet de d´finir quels sere e e vices sont associ´s a quelle mise en correspondance.fr/exemple/op_Commande"/> <input> <soap:body use="literal" namespace="http://www.2 Description comportementale La port´e de WSDL est limit´e la description des types des donn´es incluses dans e e e les messages qu’un service est capable de recevoir ou d’´mettre.org/soap/encoding"/> </output> </operation> </binding> <service name=ServiceFournisseur> <documentation> Service de r´ception des commandes </documentation> e <port name="PortSoumissionCommande" binding="bd_opCommande"> <soap:address location="//www. Dans de nombreuses e applications. ces descriptions uniquement structurelles n’offrent pas assez d’information sur les contraintes r´gissant les interactions dans lesquelles un service peut ou est cens´ e e s’engager. la production de documents WSDL est un e e travail fastidieux dont le programmeur peut ˆtre d´charg´ grˆce a l’utilisation d’outils e e e a ` pour la g´n´ration automatique de la description WSDL. comme par exemple : « le fournisseur n’envoie le bordereau de livraison qu’apr`s avoir re¸u la confirmation e c du paiement ».yothuyindi. Dans le fragment donn´ ci-dessous. ces contraintes peuvent ˆtre relativement complexes.fr/exemple/fournisseur. e <binding name="bd_opCommande" type=pt_RecevoirBdC> <soap:binding style="document" transport="http://schemas.yothuyindi.4.3.org/soap/encoding"/> </input> <output> <soap:body use="literal" namespace="http://www. Par e exemple.fr/exemple/fournisseur"/> </port> </service> <!-. Dans certains cas. e Comme le sugg`re l’exemple trait´ ici. 4.

. 2005]. il serait possible de d´finir chacun des messages ´chang´s dans le protocole e e e ci-dessus.88 CHAPITRE 4. et les clauses throw/catch pour le traitement des exceptions). e BPEL) [Andrews et al. 2003] et le langage de description de chor´graphies de services e Web (Web Services Choreography Definition Language. 2005]. e e et de lier ces actions au travers d’op´rateurs de flot de contrˆle (par exemple la s´quence.. ces d´pendances comportementales doivent ˆtre document´es en langue e e e naturelle et c’est ensuite aux d´veloppeurs d’assurer que : (i) les services remplissent les e contraintes exprim´es dans leur documentation . BPEL est un langage fond´ sur XML et permettant de d´crire aussi bien des interfaces e e comportementales (au sens d´fini dans la section 4.. un extrait du code BPEL correspondant a l’interface RosettaNet ` ´nonc´e plus haut : e e <sequence> <receive operation="BdC"/> . WS-CDL) [Kavantzas et al. BPEL permet de d´crire des actions communicationnelles e e (envois et r´ceptions de message dont les types sont d´crits en WSDL et XML Schema).. dans ce dernier cas le fournisseur r´pond avec e un « R´c´piss´ d’Annulation de BdC ». une ou plusieurs « R´ponses a BdC »au client jusqu’` avoir e e ` a donn´ une r´ponse (une acceptation ou un rejet) pour chacune des lignes du e e BdC.com. et (ii) les applications utilisent les services e conform´ment avec leur documentation. e Plusieurs initiatives de recherche. e o e le choix. De telles initiatives s’appuient sur des r´sultats de ree e cherche dans le domaine des syst`mes a base de composants [Yellin and Strom 1997] et e ` des syst`mes orient´s-processus [Dumas et al. En quelques mots.. Cependant. LES SERVICES WEB consortium RosettaNet5 pour le traitement de bons de commandes : Lorsqu’un fournisseur re¸oit un « Bon de Commande (BdC) »de la part d’un c client. le fournisseur ne doit plus e e e e envoyer de « R´ponses a BdC »au client. Au cours de ce processus. le fournisseur peut recevoir une « Annulation de BdC »de la part du client. <while . D`s lors. Dans des syst`mes e ` a e tels que CORBA. <onMessage operation="annulation-de-BdC" . e ` En WSDL. de d´veloppement et de standardisation sont en cours e afin de d´finir des langages de description de services prenant en compte des aspects come portementaux.. le fournise e e e seur enverra z´ro. Par la suite. et d’utiliser ces descriptions « comportementales »lors du d´veloppement e et de l’ex´cution des services. Nous e montrons ci-dessous..rosettanet.. Deux efforts de standardisation dans e e ce domaine sont sur le point d’aboutir : le langage de description de processus m´tiers e ex´cutables pour services Web (Web Services Business Process Execution Language. l’it´ration.2) que des orchestrations compl`tement e e ex´cutables. il doit r´pondre avec un « R´c´piss´ de BdC ».> <invoke operation="reponse-a-BdC"/> </while> . il ne serait pas possible d’exprimer que le fournisseur peut envoyer « plusieurs r´ponses a un BdC jusqu’` recevoir une annulation ».> <throw faultName="annulationEnCours"/> </onMessage> 5 Voir http ://www..

beaucoup plus de d´tails seraient n´cessaires./> </catch> . . A ce jour.. l’outillage autour de BPEL est presqu’inexistant. 2004] e e e e ainsi que pour le suivi et analyse d’ex´cutions de services. en ` tant que langage de description d’interfaces. WSDL et BPEL permettent de d´crire les op´rations fournies par un service e e Web.pi4tech. ont e e e e e e e besoin d’ˆtre d´crits de fa¸on pr´cise selon des conventions standards.. </sequence> Dans cet extrait.. BPEL est incorpor´ dans plusieurs e outils de construction d’applications a base de services (voir Section 4. On peut remarquer que le code BPEL ci-dessus se limite a d´crire ` e des actions communicationnelles et leurs d´pendances. a tout moment (clause onMessage) un message de e ` type annulation-de-BDC peut ˆtre re¸u et alors une exception est lev´e et ensuite attrap´e e c e e au travers des constructions throw et catch que l’on retrouve aussi dans des langages de programmation. 2005b]. peuvent ˆtre v´rifi´es statiquee e e e e e ment. DESCRIPTION DE SERVICES WEB 89 . et de telle mani`re e e c e e que leurs descriptions puissent ˆtre utilis´es au maximum pour automatiser le processus e e de d´veloppement et de d´ploiement des futurs services devant interagir avec un service e e existant. que ce soit en temps e r´el [Baresi et al.. e e En tant que langage d’implantation de services.. ils ne permettent e e pas de d´crire des aspects non-fonctionnels des services tels que leur capacit´ a garantir e e ` 6 Voir par exemple Pi4Tech : http ://www. L’id´e de WS-CDL est que les e a e chor´graphies d´crites dans un langage semi-ex´cutable.. mais aussi a la description de chor´graphies a diff´rents niveaux de d´tails. et dans le cas des chor´graphies d´finies au niveau le plus e e e d´taill´ elle peuvent ˆtre utilis´es pour g´n´rer automatiquement les interfaces correspone e e e e e dant a chacun des rˆles mis en jeu. Cependant. Pour un aper¸u et une analyse sur WS-CDL sont tr`s loin d’avoir atteint leur maturit´ e e c critique de WS-CDL.4). e e e e e et les d´pendances comportementales entre ces op´rations. et invoke pour l’envoi. <catch faultName="annulationEnCours"> <invoke operation="RecepisseAnnulation-de-BdC" .3. Ces actions sont compos´es en utilisant les op´rateurs e e e de s´quencement et d’it´ration (sequence and while) que l’on retrouve dans les langages e e de programmation imp´ratifs. voir [Barros et al. test´es par simulation. Si l’on voulait utiliser BPEL pour e implanter le service correspondant. 4. allant ` e ` e e de la mod´lisation conceptuelle jusqu’` l’implantation. 2005].com. En outre. Quelques travaux de recherche montrent comment des interfaces comportementales d´crites en BPEL peuvent ˆtre utilis´es pour la v´rification statique [Fu et al. les types de donn´es des messages devant ˆtre ´chang´s pour invoquer ces op´rations. les outils de d´veloppement de services bas´s ` o e e 6 . Cependant. on distingue deux types d’actions communicationnelles : receive pour la r´ception.3 Description d’aspects non-fonctionnels : « WS-Policy » Les services Web ´tant g´n´ralement d´velopp´s par des ´quipes ind´pendantes. Cependant. 2004] ou a posteriori [Aalst et al. ee e Ce dernier commentaire s’applique ´galement a WS-CDL. qui essaye d’aller plus e ` loin que BPEL en s’attaquant non seulement a la description d’interfaces comportemen` tales.3. ces techniques n’ont e pas encore ´t´ adopt´es dans des outils commerciaux.4.

` 4. Par exemple.4 nous introduisons rapidement deux implantations de . « WS-Policy »est un langage extensible permettant d’exprimer des politiques (ou r`gles) d’usage sous forme de conjonctions et de disjonctions (au sens logique) e d’assertions [Kaler and Nadalin ].4. Cependant. Dans la section 4. une solution concurrente pour l’implantation de services Web. nous discutons des principaux outils permettant la mise en œuvre de services Web. de r´putation. De mˆme. Nous d´crivons tout d’abord les principes de base du protocole SOAP (voir e section 4. LES SERVICES WEB une certaine qualit´ de service par rapport a des pr´occupations telles que la s´curit´. Il ne faut pas s’attendre a ce que toutes ces propri´t´s fassent ` ee l’objet de standardisation ou soient prises en compte dans des outils de d´veloppement de e services car la plupart d’entre elles touchent a des aspects socio-techniques et varient selon ` les domaines d’application. la journalisation des acc`s ou la gestion de transactions (voir le chapitre 1). des ´l´ments e ee de comparaisons de SOAP avec REST. 2002]). Une polie tique d’usage est une ´nonciation explicite des possibilit´s et des restrictions d’usage d’un e e service Web. Cependant. pour faciliter l’adoption des services e Web dans des applications de type business-to-business. pour r´aliser la vision de services Web comme e entit´s ind´pendantes.2). et l’adressage. en utilisant les types d’assertion d´finis dans « WS-Reliablee e e Messaging ». il est possible d’exprimer qu’un service requiert e que tous les messages soient sign´s ou qu’ils soient sign´s et encrypt´s avec une cl´ pue e e e blique donn´e. e e Ce manque est en partie compens´ par le concept de politiques d’usage. on peut exprimer qu’un service donn´ op`re selon un protocole de renvoi e e de messages permettant d’assurer que les messages arrivent au moins une fois.90 CHAPITRE 4. Dans ce contexte. Cependant.1). la fiabilit´.3. les types d’assertion d´finis dans « WS-Addressing »permettent par e exemple d’exprimer qu’un service peut envoyer le r´sultat d’un appel d’op´ration a une e e ` entit´ diff´rente de celle ayant initi´ l’appel. ou exactement une fois. etc. la e ` e e e fiabilit´. davantage d’efforts de recherche sont n´cessaires afin de d´boucher e e e e sur des mod`les et des langages permettant de d´crire l’environnement organisationnel e e dans lequel les services Web ´voluent. puis la sp´cification d’en-tˆtes permettant de transmettre des informations e e particuli`res (voir section 4.4. e e e « WS-Policy »constitue un pas en avant vers des mod`les de d´veloppement d’applicae e tions r´parties bas´es sur des descriptions d´taill´es couvrant des aspects aussi bien fonce e e e tionnels que non-fonctionnels. « WS-Policy »ne e e e d´finit pas des types d’assertions d’usages particuliers. en utilisant les types d’assere ` e e e tion d´finis dans « WS-Security-Policy ». il serait souhaitable d’avoir des descriptions de services couvrant des garanties de disponibilit´ et de temps de r´ponse.4. ainsi e e que des politiques de prix et de p´nalit´s.4. Enfin. de modalit´s de paiement. de telles descriptions non-fonctionnelles pourraient constituer un outil d’´valuation et de s´lection lors des phases initiales (c’est-`-dire au cours e e a de l’analyse du domaine) dans la construction d’applications a base de services. une assertion est une donn´e par lae quelle un service exprime qu’il permet aux clients (ou qu’il requiert des clients) de proc´der e d’une certaine mani`re lorsqu’ils acc`dent aux op´rations du service. Nous donnons ensuite. Ainsi.4 Implantation de services Web Dans cette section. e e e e (voir [O’Sullivan et al. qui d´finissent respectivement des types d’ase sertion li´s a la s´curit´. « WSe e Reliable-Messaging »et « WS-Addressing ». ces types d’assertions e sont d´finis par d’autres standards propos´s tels que « WS-Security-Policy ». dans la section 4.

SOAP offre diverses possibie lit´s d’interactions entre les services : soit des ´changes de documents. et l’ine e e formation requise pour acheminer le message au destinataire. Ainsi. un message SOAP e e e e e ` e est constitu´ de deux parties : un en-tˆte et un corps.4. ` e SOAP n’est pas fondamentalement li´ a la notion d’appel de proc´dure.4.1 SOAP (Simple Object Access Protocol ) Les interactions entre services Web s’effectuent par le biais d’envois de messages structur´s au format XML. Ainsi. Dans le jargon des services e e Web. Mais a la diff´rence des technologies RPC. . la ` e ee liaison SOAP au-dessus de HTTP d´finit que les messages sont encod´s dans un « type e e de m´dia »appel´ « application/soap+xml »(c’est-`-dire en XML avec quelques extene e a sions). l’encodage des messages (n´cessaire en particulier lorsque le protocole sous-jacent e utilise un format binaire). et les protocoles de transport e e orient´s-message de Microsoft et IBM. et la fa¸on dont diff´rents messages (y compris e e c e les messages d’erreur) appartenant a la mˆme interaction sont corr´l´s. l’encodage des noms e e d’op´rations (appel´s « SOAP Actions »). (ii) l’appel d’une op´ration offerte par le service e destinataire. Le corps du message peut contenir : (i) un document quelconque . e ` La mani`re d’implanter SOAP au-dessus d’un protocole de transport donn´ est appel´e e e e une liaison SOAP (« SOAP binding »en anglais). e e ` e ` et en particulier de XML-RPC [Winer 1999]. e Une autre caract´ristique de SOAP est de faire abstraction de la couche de transport e sous-jacente. Une liaison SOAP d´finit. soit des interactions e e de type RPC. et que les messages dans une interaction sont ´chang´s e e e au travers des m´thodes POST et GET fournies par HTTP. Bien que la pratique la plus r´pandue soit d’utiliser SOAP au-dessus de e HTTP.5 discute de BPEL un langage orient´ processus. que le nom de l’op´ration correspondant a une requˆte est donn´ dans un en-tˆte e ` e e e HTTP appel´ « SOAPAction ». Par exemple. D’autres r`gles (dont nous ne e e donnons pas les d´tails) d´finissent la mani`re dont les messages appartenant a un mˆme e e e ` e ´change (y compris les messages d’erreur) sont corr´l´s en exploitant les caract´ristiques e ee e des m´thodes POST et GET. SOAP permet d’encoder des interactions orient´es-RPC mais aussi des interactions e orient´es-document. SOAP e` e vise a faciliter l’´change de messages XML. ou bien (iv) un message d’erreur.4. sans se limiter a des messages dont le contenu ` e ` encode des param`tres d’appel de proc´dure et sans favoriser des ´changes bidirectionnels e e e de type requˆte-r´ponse comme c’est le cas des protocoles RPC. L’en-tˆte indique l’objet du message e e e (l’appel d’une op´ration ou le retour de r´sultats). SOAP d´finit une structure standard de messages dans laquelle le contenu des mese sages est s´par´ des m´ta-donn´es li´es a l’´change des messages. en particue lier. IMPLANTATION DE SERVICES WEB 91 SOAP. avec les valeurs pour les param`tres d’entr´e . Le protocole SOAP (Simple Object Access Protoe col) [W3C-XMLP-Group ] fournit le cadre permettant ces ´changes. SOAP est originellee ment issu de tentatives pr´c´dentes visant a standardiser l’appel de proc´dures a distance.4. e Outre la d´finition ´changes de messages en faisant abstraction de la couche de transe e port. il existe aussi des implantations de SOAP au-dessus d’autres protocoles tels que le protocole d’´change de messages ´lectroniques SMTP. la m´thode pour l’´change de messages. (iii) les valeurs produites en e e r´sultat d’un appel . En effet. a savoir MSMQ et MQSeries respectivement. Finalement la section 4. e 4. la description de l’exp´diteur.

a la fiabilit´.4). par une application du client. e Il existe plusieurs m´canismes pour construire. l’application du fournisseur transmet.92 CHAPITRE 4. sous forme d’une requˆte SOAP. Chez le fournisseur.2 Extensions de SOAP : sp´cifications WS-* e Comme indiqu´ ci-dessus. C . 4.4. et ´changer des messages e e SOAP dans des langages vari´s tels que Java. Ces implantations e permettent de g´n´rer les en-tˆtes de messages SOAP et de mettre en correspondance le e e e contenu du corps du message avec les structures de donn´es d´finies dans le langage hˆte e e o (voir Section 4. analyser. Lorsque c e les v´rifications de disponibilit´ des articles command´s et les interactions avec l’entrepˆt e e e o sont termin´es. ou a d’autres e ` ` e ` e e ` propri´t´s traditionnellement associ´es aux interactions distribu´es (voir le chapitre 1).5 – Interactions entre les partenaires Client et Fournisseur La figure 4. etc. Chaque sous-en-tˆte permet e e ee e de transmettre des informations li´es a l’adressage. Perl. Le client transmet une commande au fournisseur en lui envoyant un bon de e commande. Ce dernier d´code le message e e re¸u et effectue les appels aux proc´dures correspondantes de l’application locale. chacun encod´ sous forme d’un ´l´ment XML.4. le serveur d’application re¸oit la requˆte (sous e c e forme d’une requˆte HTTP) et la transmet au moteur SOAP. a la s´curit´. LES SERVICES WEB Client Service Application moteur SOAP moteur SOAP récépissé reçu de fournisseur BdC envoyé à fournisseur couche transport récépissé envoyé à client BdC reçu de client Légende : appels de méthodes moteur SOAP moteur SOAP requête SOAP Application Service message SOAP Fournisseur Figure 4. Ces m´ta-donn´es prennent la forme d’un nombre de e e e e (sous-)en-tˆtes. ee e e Il est en principe possible d’inclure n’importe quel ensemble d’en-tˆtes dans un message e . de la mˆme mani`re. Ce bon de commande est transmis. C++. l’en-tˆte d’un message SOAP est destin´ a contenir des m´tae e e` e donn´es sur l’´change des messages. la facture au e e e serveur d’application du client (les serveurs d’application ne sont pas figur´s).5 sch´matise un sc´nario d’interaction entre les partenaires Client et Foure e nisseur d´j` introduits dans la section 4.2 (les interactions avec l’entrepˆt ne sont pas ea o montr´es).

org/soap/envelope/" xmlns:xsd="http://www.yothuyindi. charset=utf-8 Accept: application/soap+xml.org/2001/XMLSchema" xmlns:xsi="http://www. Cet en-tˆte est utile par exemple e e e e lorsque la r´ponse a une requˆte est envoy´e au travers d’une deuxi`me connexion e ` e e e HTTP ´tablie ult´rieurement (selon le mode d’interaction dit asynchrone). e POST /orabpel/default/Supplier HTTP/1.w3. Y. et c’est au service destinataire de d´terminer ceux qu’il peut interpr´ter et ceux e e e qu’il peut ignorer. le message HTTP suivant correspond a l’envoi d’un bon de com` mande par un client. IMPLANTATION DE SERVICES WEB 93 SOAP. au lieu e e d’ˆtre incluse dans le message de retour de la connexion HTTP courante (selon le e mode d’interaction dit synchrone).xmlsoap.1/Supplier/SupplierRequester . d´finissent des ensembles d’en-tˆtes SOAP per¸us e e c comme ´tant particuli`rement importants pour un grand nombre d’applications.org/ws/2003/03/addressing" xmlns:orabpel="http://schemas.oracle. L’attribut XML mustUnderstand peut ˆtre associ´ a chaque en-tˆte pour e e` e exprimer si cet en-tˆte doit obligatoirement ˆtre interpr´t´ par le destinataire ou si il peut e e ee ˆtre ignor´. u ee ` e – From. Un fournisseur peut en th´orie exprimer que son service est capable de recevoir e des en-tˆtes X. et les programmeurs des e e applications qui acc`dent a ce service sont alors libres de les utiliser ou pas.w3. connues g´n´rae e e e lement sous le nom collectif WS-*.fr/default/Customer~1.2. et qu’il ne lui est pas possible d’interpr´ter. e – Reply-to : qui donne l’adresse de retour. avec une certaine s´mantique pour chacun. WS-Security (pour l’authentification et la non-r´pudiation) et WSe Reliable-Messaging (pour le renvoi r´p´t´ de messages afin de garantir leur livraison fiable e ee et ordonn´e).. application/dime. WS-Addressing d´finit les (sous-)en-tˆtes suivants : e e e – MessageID : o` l’on peut associer un identificateur au message.3-3 </MessageID> <ReplyTo xmlns="http://schemas.org/ws/2003/03/addressing"> <Address> http://GA2550:9710/orabpel/default/Customer/1. Z.xmlsoap. e ee e Diff´rentes sp´cifications (certaines en passe de devenir des standards). text/* User-Agent: Axis/#axisVersion# SOAPAction: "BdC" . multipart/related. <soapenv:Envelope xmlns:soapenv="http://schemas. c’est-`-dire l’URL a laquelle des r´ponses a ` e ´ventuelles au message doivent ˆtre envoy´es.0 Content-Type: text/xml. Par exemple.1/301-BpInv0-BpSeq0. Ce message inclut un e e identificateur de message et une adresse a laquelle l’´ventuelle r´ponse doit ˆtre exp´di´e ` e e e e e ult´rieurement.org/2001/XMLSchema-instance"> <soapenv:Header> <MessageID xmlns="http://schemas. De fa¸on e ` c sym´trique.. Le destinataire est tenu de renvoyer un message d’erreur s’il d´tecte un en-tˆte e e e e qui devrait ˆtre interpr´t´ obligatoirement. To : qui fixent l’exp´diteur et le destinataire du message.4.4. u – RelatesTo : o` l’on peut faire r´f´rence a l’identificateur d’un message ant´rieur.xmlsoap. une application peut envoyer un message SOAP avec n’importe quel ensemble e d’en-tˆtes. A titre d’exemple. Trois e e des sp´cifications les plus avanc´es en terme de leur standardisation sont WS-Addressing e e (pour l’adressage). d’apr`s l’interaction d´crite dans la section 4.com/bpel" > bpel://www.

Une applicae e tion donn´e peut alors appeler chacune de ces op´rations en utilisant la m´thode HTTP e e e POST. et toutes e e ` les op´rations de ce service (demande de devis.unservicedevente. </ReponseBonDeCommande> </soapenv:Body> </soapenv:Envelope> Pour une description relativement compl`te de WS-Addressing et autres sp´cifications e e WS-*. text/* User-Agent: Axis/#axisVersion# Host: GA2550:9710 SOAPAction: "ResponseBdC" . et en incluant le nom de l’op´ration concern´e par la requˆte dans l’en-tˆte HTTP e e e e « SOAPAction ». placement de bon de commande. .w3. REST e Dans la section 4.3 Le d´bat SOAP vs.xmlsoap..org/2001/XMLSchema" xmlns:xsi="http://www. </BonDeCommande> </soapenv:Body> </soapenv:Envelope> La r´ponse du fournisseur peut alors ˆtre envoy´e au travers d’une deuxi`me connexion e e e e HTTP.org/2001/XMLSchema-instance"> <soapenv:Header> <RelatesTo xmlns="http://schemas.1/301-BpInv0-BpSeq0. Dans cette ` liaison.1..xmlsoap.) peuvent ˆtre fournies sur cette mˆme URL. etc.yothuyindi.4.fr/default/Customer~1. <soapenv:Envelope xmlns:soapenv="http://schemas.org/ws/2003/03/addressing"> bpel://www.org/soap/envelope/" xmlns:xsd="http://www. application/dime.0 Content-Type: text/xml.1/Supplier/SupplierRequester HTTP/1. LES SERVICES WEB </Address> </ReplyTo> </soapenv:Header> <soapenv:Body> <BonDeCommande> . ` 4.4. nous avons indiqu´ que la fa¸on la plus r´pandue d’utiliser SOAP e c e consiste a s’appuyer sur le protocole HTTP en utilisant la liaison SOAP-HTTP. charset=utf-8 Accept: application/soap+xml. 2005].. suivi e de bon de commande.fr/serviceweb.. il est possible d’associer plusieurs op´rations a la mˆme URL.. e Un exemple de message de r´ponse est donn´ ci-dessous : e e POST /orabpel/default/Customer/1.w3. Cette r´ponse doit ˆtre envoy´e a l’adresse indiqu´e dans l’en-tˆte « ReplyTo »du e e e ` e e message ci-dessus. et doit se r´f´rer a l’identificateur du message du message ci-dessus au ee ` travers de l’en-tˆte « RelatesTo ».. Par exemple. le lecteur peut se reporter a [Weerawarana et al.94 CHAPITRE 4. un sere ` e vice de ventes peut ˆtre plac´ a l’URL www.3-3 </RelatesTo> </soapenv:Header> <soapenv:Body> <ReponseBonDeCommande> . multipart/related.

Le d´bat SOAP vs. e e e ´liminant ainsi le besoin de plates-formes implantant SOAP. qui dans certains cas peuvent e ˆtre consid´r´es comme ´tant plus « lourdes »et plus difficiles a utiliser. ainsi que d’autres caract´ristiques de SOAP. En conclusion. mais les standards et l’infrastructure correspondant ne sont pas en place. accessibles sous forme de services Web « style REST »(voir e http ://developer.com/rest). Il repose sur l’infrastructure HTTP existante. Une approche alternative pour l’implantation de services Web appel´e REST (REe presentational State Transfer) a ´t´ d´finie [Fielding 2000]. il est n´cessaire d’utiliser des e outils sp´cifiques (voir la section 4. (iii) ils ne requi`rent pas de garanties de s´curit´ au del` de celles offertes e e e a . Dans le cas de SOAP. la fiabilit´ et l’adressage et routage e ` e e e de messages. il serait possible de faire de mˆme en utilisant l’approche u e REST. IMPLANTATION DE SERVICES WEB 95 Cette approche. qui rend une partie de e ses fonctionnalit´s. ont fait l’objet de nome breuses critiques. il rend difficile. e – SOAP peut op´rer au-dessus d’autres protocoles que HTTP. en particulier sur des e protocoles permettant des communications asynchrones telles que SMTP.4. Bien sˆ r. SOAP permet de e e prendre en compte des aspects li´s a la s´curit´. MSMQ et MQSeries. l’approche REST est viable (voire pr´f´rable) dans le cas de services ee Web avec les caract´ristiques suivantes : (i) ils n’ont besoin d’ˆtre expos´s que sur HTTP e e e ou HTTPS . Les avantages et d´savantages relatifs de SOAP et REST peuvent e e ˆtre r´sum´s comme suit : e e e – REST ne requiert pas d’infrastructure sp´cifique pour le d´veloppement et e e l’ex´cution des services Web. chaque ee e op´ration d’un service est associ´e a une URL distincte et l’acc`s a chaque URL peut ˆtre e e ` e ` e r´alis´ en utilisant l’une des quatre m´thodes fournies par HTTP : POST. e ee e ` Plusieurs services Web populaires disponibles a l’heure actuelle utilisent l’ap` proche REST (appel´e aussi « XML sur HTTP »). GET.ebay. JMS. et e la possibilit´ d’utiliser des biblioth`ques existantes pour l’´change de messages sur HTTP.com/webservices).4. REST est encore ouvert et les avis divergent consid´rablement e e dans la communaut´.4) qui sont parfois difficiles a d´ployer et n’ont e ` e pas compl`tement fait leurs preuves. voire impossible. De nombreux outils de programmation d’applications au-dessus de HTTP existent. et peuvent ˆtre e combin´s avec des outils de manipulation de documents XML pour construire des e services Web « style REST ». qui constitue sans doute l’un e des points forts de HTTP. (ii) les communications asynchrones (et donc l’adressage explicite) ne sont pas requises . Dans cette approche. et la distinction entre e en-tˆte et contenu de message est laiss´e a la charge des applications qui requi`rent cette e e ` e distinction. Le contenu des messages est alors encod´ en XML. et (ii) en associant e plusieurs op´rations a une mˆme URL. – Lorsqu’il est utilis´ en conjonction avec des sp´cifications WS-*. Les arguments principaux mis en avant contre SOAP reposent sur le fait que : (i) il rajoute peu de fonctionnalit´s au-dessus de ce qu’il est d´j` possible de e ea faire avec HTTP et XML (sans les extensions apport´es par SOAP) . PUT e e e et DELETE. Il en est de mˆme du site de vente par Internet e Amazon (voir http ://www. qui a e fait ses preuves dans le contexte des applications HTML classiques. l’utilisation de e ` e l’infrastructure de « caching »associ´e au protocole HTTP.amazon. Le r´sultat est un ensemble de conventions plus simples que celles de SOAP. Ceci est le cas notamment e de la maison de ventes au ench`res en ligne eBay.4.

e La version Java d’Axis est constitu´e d’un ensemble de biblioth`ques qui implantent e e l’API Java JAX-RPC d’une part. e e e 4. Beehive s’appuie sur trois types d’annotations : @WebService pour sp´cifier quelle classe e est expos´e comme service Web . se pr´sente sous forme d’un ensemble de o e biblioth`ques : une version Java est actuellement disponible. et (iv) la fiabilit´ peut facilement ˆtre trait´e au niveau des applications. Le moteur Axis. Pour chaque op´ration. est a base de biblioth`ques. permet de sp´cifier les classes et les m´thodes a exposer. Ces biblioth`ques e e e peuvent ˆtre empaquet´es comme une application Web. L’id´e est d’offrir e e e un outil pour le d´veloppement de services Web qui seront ensuite rendus disponibles par e le biais de n’importe quel moteur SOAP. puis rendues disponibles par le e e biais d’une servlet. Le moteur Axis propose une op´ration de d´ploiement (et e e e une autre inverse de suppression) qui prend en entr´e le programme Java compil´ et la e e description du d´ploiement (Web Service Deployment Descriptor ). des outils pour faire de la journalisation. de la g´n´ration et de l’analyse de documents WSDL. Axis. Il suffit de placer ce programme (non e e compil´) dans le r´pertoire d´di´ a l’application Web Axis. si elle a le m´rite e e e e` e e d’ˆtre simple. qui se distinguent par leur principe : l’une.96 CHAPITRE 4. l’annotation @WebParam e e permet d’en d´clarer les param`tres. est a base d’annotations (voir [W3C-XMLP-Group ] pour obtenir une ` liste des implantations de SOAP). ee e Beehive [Beehive ] est un autre projet Apache dont l’objectif global est de d´finir un e mod`le d’annotations pour Java dans la perspective de r´duire la quantit´ de code Java a e e e ` produire pour d´velopper des applications J2EE (voir chapitre 5). a pour inconv´nients d’obliger le fournisseur a montrer le code source et de e e ` ne pas ˆtre adapt´e au d´ploiement d’applications complexes. comme par exemple Axis. soit a l’ensemble des ex´cutions du service. Cette seconde m´thode. @WebMethod pour indiquer les op´rations du service. et e e pour chacune la m´thode qui l’implante. Beehive. Palliant ces inconv´nients. le e e e e second mode de d´ploiement s’appuie sur la description des ´l´ments d’un service (classes e ee et m´thodes) qu’il faut exposer. Axis [Axis ] est un projet du groupe Web Services d’Apache [Apache ]. Cette m´thode. La dur´e de vie des objets g´n´r´s par l’ex´cution du service peut ˆtre associ´e e e ee e e e soit a la requˆte. LES SERVICES WEB par HTTPS . qui joue le rˆle de client et de serveur SOAP. ` e l’autre. elle permet surtout de pouvoir sp´cifier la dur´e de vie des objets e e e e g´n´r´s par l’ex´cution du service et de permettre l’utilisation de composants Java (Java e ee e Beans). une autre en C++ est en e cours de d´veloppement.4. Axis ` e ` e ` prend a sa charge la s´rialisation/d´s´rialisation des classes Java a condition qu’elles aient ` e ee ` ´t´ implant´es dans des composants Java.4 Exemples d’implantations de SOAP Nous donnons ci-apr`s un aper¸u de deux implantations Open Source du protocole e c SOAP. e Une partie du projet Beehive est consacr´e a l’implantation de JSR181 (Java Specificae ` tion Request . A l’inverse de e ` e e ` la premi`re m´thode. et fournissent d’autre part. e e . soit enfin a la session. e e ` sp´cifique a Axis. Axis propose un premier mode de d´ploiement grˆce auquel un programme Java est e a imm´diatement expos´ comme un service Web.Web Services Metadata for the Java Platform) [JSR 181 ] qui fixe un mod`le e d’annotations pour la construction de services Web d´velopp´s en Java.

des r`gles de type ´v´nement-action e e e e e (event handlers) peuvent ˆtre associ´es a des blocs (scope). Les e e e e activit´s primitives sont : la r´ception (receive) qui bloque l’ex´cution jusqu’` l’arriv´e e e e a e d’un message correspondant a une op´ration . SAP XI et l’outil de gestion de processus BPEL d’Oracle supportent BPEL a des degr´s divers d´montrant ainsi l’int´rˆt r´el de ce ` e e ee e langage. La manipulation des donn´es s’effectue par le biais de variables. la s´lection (pick) pour choisir l’un parmi les messages entrants ou e e e les timers . il est quelques fois judicieux e e de casser le paradigme « tout service »de BPEL. C’est dans cet esprit qu’a ´t´ d´finie ee e 7 Pour obtenir la liste des outils mentionn´s ici. un fichier. e Plus pr´cis´ment. comme dans un e langage de programmation imp´rative. ou une application patrimoniale.org/wiki/BPEL e . Le concept de bloc issu des langages de programmation e structur´e est pr´sent dans BPEL par le biais de la notion de port´e (scope). un processus exprim´ en BPEL est construit a partir d’activit´s e e e ` e primitives qui peuvent ˆtre compos´es pour d´finir d’autres activit´s plus complexes. le syst`me de gestion de fichiers.wikipedia. la transmission (throw) d’erreur et la e e e fin (exit) pour terminer l’ex´cution. la logique des interactions e e entre un service et son environnement est d´crite par le biais d’une composition d’actions e ´l´mentaires de communication (´mission. e Dans le langage BPEL.4. et e e e conditionnelle. telle qu’une base de donn´es.3. Ces actions ee e e e e sont reli´es les unes aux autres par un flot de contrˆle sp´cifi´ par des constructions e o e e telles que la composition parall`le (avec un nombre fix´ de branches). Lorsqu’une ressource. BPEL offre plusieurs constructions pour e la programmation concurrente : la composition parall`le (flow) pour ex´cuter plusieurs e e activit´s en parall`le . et l’it´ration (while). des d´pendances de pr´c´dences (link) peuvent ˆtre d´finies entre des activit´s e e e e e e qui autrement s’ex´cuteraient en parall`le. Ces r`gles sont d´clench´es e e ` e e e par la r´ception d’un message ou a l’expiration d’un d´lai. Comme bri`vement indiqu´ dans la section 4. r´ception ou ´mission/r´ception).5 Implantation ` base d’un langage sp´cifique : BPEL a e BPEL est aujourd’hui un standard de facto pour implanter des services Web selon un point de vue orient´ processus. ActiveBPEL est une autre proposition assez compl`te dans le domaine de l’Open e Source 7 . le choix (switch) pour exprimer un branchement e conditionnel. e e e En plus de ces op´rateurs de composition. est utilis´e par un service. IMPLANTATION DE SERVICES WEB 97 4. Pour pouvoir utiliser BPEL dans des environnements o` toutes les u ressources ne sont pas forc´ment expos´es comme des services. ou l’application e e comme des services.4. a n’importe quel moment au e ` e ` cours de l’ex´cution du bloc correspondant.4. Des plates-formes matures et reconnues. telles que BEA e WebLogic. e La plupart des op´rateurs de composition propos´s par BPEL correspondent a ceux e e ` d´j` pr´sents dans les langages de programmation imp´rative : la s´quence (sequence) ea e e e pour imposer un ordre dans l’ex´cution. Finalement. l’attente (wait) qui e ` bloque l’ex´cution pour une p´riode de temps fix´e . des r`gles de type ´v´nement-action et des clauses de capture/transmission e e e d’erreur. s´quentielle. l’appel (invoke) et la r´ponse (reply) qui ` e e chacune effectue un envoi de message correspondant a une op´ration . IBM WebSphere. e e il est n´cessaire d’exposer le SGBD. Microsoft BizTalk. voir http ://en. en BPEL. l’affectation (assign) ` e qui associe une expression (´crite en XPath ou XSLT) a une variable . tout est service : un processus ex´cutable est l’implantae tion d’un service qui s’appuie sur d’autres services.

Ce squelette montre comment e e les op´rateurs de flot de contrˆle sequence../> ./> e <receive name="recevoirOrdreDeTransfert" . e Ci-dessous. nous fournissons un squelette du processus ex´cutable BPEL correspone dant au service « fournisseur »mod´lis´ dans la figure 4.. les actions envoyerBordereauExp´dition et o e recevoirOrdreDeTransfert peuvent s’ex´cuter en parall`le ou dans n’importe quel ordre e e puisqu’elles sont emboˆ ees dans une activit´ de type flow. une extension de BPEL avec laquelle il est possible d’int´grer du e code Java dans un programme BPEL.... /> <partnerLink name="entrep^t" . La consid´ration u e de BPEL dans les deux plates-formes . LES SERVICES WEB BPELJ [Blow et al.. et le e e client et l’entrepˆt d’autre part.. 2004]. inputVariable="BdC" outputVariable="disponibilit´"/> e <switch> <case .1 sont utilis´s ici pour d´finir les types des variables et les types des mese e sages envoy´s et re¸us par les actions receive.. Cette approche est similaire a celle des JSPs (Java ` Server Pages) o` du code Java est inclus dans des programmes HTML. reply et invoke.. De plus... Le squelette montre aussi ıt´ e comment BPEL est li´ avec WSDL : les types et les op´rations d´finis en WSDL dans e e e la section 4.. les exp´diteurs e c e et destinataires des messages envoy´s sont sp´cifi´s par le biais des liens de communicae e e tion (« partner links ») qui devront ˆtre associ´s aux services d´crits dans la description e e e WSDL.Initialiser la variable r´ponseBdC avec r´ponse positive --> e e <reply name="R´pondreBdC" e partnerLink="client" portType="pt_Commande" operation="op_Commande" inputVariable="r´ponseBDC"/> e <flow> <invoke name="envoyerBordereuExp´dition" . switch et flow sont combin´s pour exprie o e mer l’ordre dans lequel les messages sont ´chang´s entre le fournisseur d’une part. /> o </partnerLinks> <variables> <variable name="BdC" type="xsld:Commande"/> <variable name="r´ponseBDC" messageType= "string" /> e <variable name="disponibilit´" type="string"/> e </variables> <sequence> <receive name="recevoirBdC" partnerLink="client" portType="pt_Commande" operation="op_Commande" variable="BdC" createInstance="yes"/> <invoke name="demanderDisponibilit´" e partnerLink="entrep^t" o .> <!-.98 CHAPITRE 4.3. En particulier.Net et Java laisse a penser que d’autres dialectes ` proches de BPEL vont ´merger.cas disponible --> <!-. <process name="ProcessusFournisseur"> <partnerLinks> <partnerLink name="client" .2..

Le second point de vue est inverse : la trace des ´v´nements est suppos´e correcte car elle refl`te ce qui se passe e e e e r´ellement.. 2005a].5. soit des langages alternatifs. BPEL manque d’abstractions de haut niveau lorsqu’il s’agit de d´velopper des services qui mettent en jeu des multicasts avec e des conditions de synchronisation partielles. test de conformit´ et adaptation e Dans les architectures a base de services. Ces derni`res peuvent ainsi ˆtre per¸ues e e c comme un contrat entre les services. Lorsque le probl`me est ´tudi´ selon e e e e la dimension structurelle des interfaces. Par exemple.. des efforts de recherche portent sur la r´solution ` e de ces probl`mes et proposent soit des extensions de BPEL. Tout ce dont un service peut ˆtre sˆ r au sujet des autres services avec lese u quels il interagit s’appuie sur l’ensemble des messages qu’il envoie et de ceux qu’il re¸oit. Il est alors extrˆmement utile de e e e e pouvoir d´river les nouvelles interfaces des traces.1 Perspectives Fouille d’interface. il est donc d’attendu que les services respectent leur interface. Pour ces raisons. De plus. 2003] l’op´rateur link e e e est dans une certaine mesure redondant avec les op´rateurs switch et flow dans le sens e que tout processus BPEL ´crit en utilisant switch et flow peut ˆtre r´´crit en utilisant un e e ee seul flow et un certain nombre de links. comme par exemple dans le cas d’un service « client »qui requiert des devis de plusieurs services « fournisseurs » [Barros et al.cas indisponible --> <!-. c L’existence de traces des ´v´nements qui se sont pass´s ainsi que la donn´e des intere e e e faces permettent de poser la question de la confrontation de « ce qu’il s’est pass´ »` « ce e a qui ´tait pr´vu qu’il se passe ». sa complexit´ pose probl`me. la description structu` ea relle et comportementale des services s’appuie sur la notion d’interface. les services sont ind´pendants les uns e des autres et ne peuvent exercer aucun contrˆle les uns sur les autres. ` e ee puisqu’elles sp´cifient la mani`re dont les services partenaires doivent se comporter. Comme le montre [Wohed et al.4. e 4.. Cette question peut ˆtre ´tudi´e selon deux points de e e e e e vue. PERSPECTIVES 99 </flow> </case> <case . la trace peut contenir une s´quence d’´v´nements impossible e e e selon les interfaces. </case> </switch> </sequence> </process> Bien que BPEL offre des constructions sp´cifiques pour le d´veloppement de services e e Web.> <!-. Dans ce cas. Le premier consiste a prendre les interfaces des services comme ´tant la r´f´rence. Cependant..Initialiser la variable r´ponseBdC avec r´ponse n´gative --> e e e . nous l’avons d´j` vu. se pose le probl`me de savoir si les interfaces ne sont plus vae e lides et en cons´quence si elles doivent ˆtre modifi´es. cela revient a comparer un ensemble de messages ` en XML a un sch´ma exprim´ dans un langage tel que XMLSchema [W3C-XMLSchema ] ` e e .5 4. o un service ne peut jamais ˆtre sˆ r que les autres se comportent comme convenu dans e u leur interface. La e e question est alors de savoir si les ´v´nements enregistr´s dans la trace sont coh´rents avec e e e e les interfaces. ce qui traduit une violation du contrat.5. On peut s’attendre a ce que dans le futur.

2004]. Ce qui conduit a la situation o` le mˆme e ` u e service peut participer a diverses collaborations qui n´cessitent diff´rentes interfaces four` e e nies. 2005a. les propri´t´s transactionnelles de ces services peuvent ˆtre exploit´es lors ee e e de leur composition pour r´pondre a des contraintes et des pr´f´rences ´tablies par le e ` ee e concepteur et l’utilisateur final. l’adaptation des r`gles e e ` e e d’usage devrait tr`s vite devenir un sujet important et crucial.3. e 4. une interface peut ˆtre e d´crite selon la dimension structurelle. la r´conciliation de diff´rentes politiques de s´curit´) est par contre l’objet de e e e e peu de recherche. comportementale ou encore non-fonctionnelle. Ainsi e l’adaptation doit ˆtre ´tudi´e selon chacune de ces dimensions. (ii) assurer ces propri´t´s de fa¸on automatis´e en exploitant e ee c e les propri´t´s transactionnelles des services composants. Fauvet and Ait-Bachir 2006]. L’adaptation des r`gles d’usage (par e exemple. Moins d’attention a ´t´ e ee consacr´e a la r´solution des probl`mes de test de conformit´ et de fouille d’interfaces en e ` e e e prenant le point de vue de la dimension comportementale des interfaces. 2004]. il y a deux solutions : (1) adopter l’interface requise comme e interface fournie et modifier le service en cons´quence . compl´mentaire a celui de la e e ` conformit´.5. 2004]. La premi`re solution est e e en g´n´ral mauvaise car le mˆme service peut interagir avec plusieurs autres services pare e e tenaires qui consid`rent son interface originale. ee L’ex´cution de services compos´s avec propri´t´s transactionnelles s’appuie sur e e ee l’ex´cution de transactions distribu´es. e Altenhofen et al. Il est possible d’envisager la r´solution de ces probl`mes en appliquant des m´thodes de fouille de proe e e cessus [Aalst et al.100 CHAPITRE 4.2 Transactions Certains services web. de services professionnels. de places de spectacle. complexes. 2003] ou de tests de conformit´ de processus [Rozinat and Aalst 2005]. Aujourd’hui cependant. les langages et outils disponibles permettant de programmer des transactions sur des services Web ne fournissent pas de concepts de haut niveau pour : (i) exprimer les propri´t´s transactionnelles d´sir´es au ee e e niveau du service compos´ . e L’adaptation des interfaces est un autre probl`me saillant. 2005. en particulier dans le domaine du commerce ´lectronique. Lorsqu’il s’av`re. le probl`me de l’adape e tation selon la dimension comportementale est en cours d’´tude [Benatallah et al. Ceci est le cas notamment ee e ına des services associ´s a la gestion de ressources (au sens large). e Quelques investigations pr´liminaires sur le probl`me de la fouille d’interfaces comportee e mentales sont rapport´es dans [Dustdar et al. etc. comme par exemple la e ` r´servation de chambres d’hˆtel. souvent de longue dur´e. qui e e e ´ventuellement peuvent mettre en œuvre des m´canismes de compensation (une op´ration e e e . Gaaloul et al. e o En principe. un ´tat de l’art sur ce sujet). (2) introduire un adaptateur qui e r´concilie l’interface fournie avec celle requise par les partenaires. ont e des propri´t´s transactionnelles inh´rentes [Ba¨ et al. Le probl`me de l’adaptae e e e tion structurelle se ram`ne essentiellement a celui de la r´conciliation entre des types de e ` e messages. Comme nous l’avons vu dans la section 4. 2004. que l’interface fournie d’un service ne correspond pas a l’interface e ` que ses partenaires requi`rent. que ce soit a priori par une comparaison. La technologie des services Web gagnant en maturit´ et tendant a ˆtre e `e utilis´e dans le cadre de l’int´gration de projets a grande ´chelle. ou a posteriori par e e un test de conformit´. La seconde solution pallie ce d´faut par la fourniture d’autant d’adaptateurs que e d’interfaces requises. LES SERVICES WEB (voir aussi [Bertino et al. A l’inverse. Il existe sur ce sujet de tr`s nombreuses ´tudes et plusieurs syst`mes sont come e e mercialis´s (par exemple Microsoft’s BizTalk Mapper).

PERSPECTIVES 101 de compensation est une op´ration dont l’objectif est d’annuler les effets d’une autre e op´ration qui n’a pas pu ˆtre termin´e avec succ`s). dans ce protocole.2) : par exemple. puisqu’il n’est pas acceptable de verrouiller des ressources dans une transaction qui s’ex´cute sur une dur´e prolong´e.asp . Il est bien connu que les approches traditionnelles pour assurer les propri´t´s ACID ee d’une transaction (Atomicity. n’est pas applicable aux ` e e e services composites car. il est fortement e e probable que son syst`me de gestion de transactions ne r´ponde pas aux besoins de e e la composition vue comme un tout. une composition s’appuie sur des commuee naut´s et non plus sur des services directement. Durability) ne sont typiquement pas ad´quates pour les transactions de longue dur´e telles que celles rencontr´es dans le e e e domaine des services web.1 e e et 4.5. 2002b] et pour la conduite de travaux de recherche (voir par exemple [Arregui et al. de mani`re dynae mique [Benatallah et al. Une communaut´ poss`de une interface au travers de laquelle sont accessibles e e les op´rations qu’elle offre.3 S´lection dynamique e Il est courant que plusieurs services offrent les mˆmes fonctionnalit´s (la mˆme capacit´ e e e e de service). des syst`mes distribu´s et des ee e e e e environnements coop´ratifs (voir par exemple [Elmagarmid 1990. Papazoglou 2003]). De nombreux mod`les de transactions e e e e e ont ´t´ propos´s dans le domaine des bases de donn´es. il peut ˆtre appropri´ de relaxer les contraintes d’atomicit´ tout-ou-rien. 2003. 2002a]. Le concept de « Communaut´ de services »a ´t´ propos´ dans la perspective e ee e de composer un nombre potentiellement grand de services Web et ce. Au moment de l’ex´cution. Dans ` ce contexte. un service peut choisir d’interagir avec un autre par le biais de la 8 http ://msdn.microsoft.asp ?url=/library/en-us/dnWebsrv/html/wsacoord. ce qui n’est pas toujours le cas dans le cadre des services web.com/library/default. Hagen and Alonso 2000. 2005]). Vidyasankar and Vossen 2003. de sorte que l’ensemble des partee e naires intervenant dans la composition n’est pas connu a priori. Ainsi. Isolation. Lorsqu’un service est int´gr´ comme composant. Un service Web peut s’enregistrer aupr`s d’une ou de plusieurs e e communaut´s. 2005b]. Et une communaut´ peut s’enregistrer aupr`s d’une autre communaut´. 2000. au moment de l’ex´cution du service compos´. A e e e cela s’ajoutent des probl`mes d’int´gration. e Alonso et al. Limthanmaphon and Zhang 2004. Pour que ee e les services deviennent disponibles au travers d’une communaut´. Gray and Reuter 1993. e e e e Le choix d’un service entrant dans une composition peut ainsi ˆtre effectu´ dynamie e quement.5. Ce dernier aspect est la motivation principale pour l’´mergence de protocoles tels que WS-Coordination [Cabrera et al. Cette possibilit´ n’est pas e sans impact sur les probl`mes soulev´s dans les deux sections ci-dessus (voir sections 4. Fauvet et al.5. la s´lection d’un e e e service parmi ceux disponibles est op´r´e par la communaut´ correspondante. couramment utilis´ dans les syst`mes distribu´s.5. Les services peuvent rejoindre et quitter une communaut´ a n’importe quel e e` moment. consid´r´ e c ee individuellement. Consistency.4. Une communaut´ d´crit les capacit´s de services sans faire e e e r´f´rence au fournisseur du service Web. 4. ils doivent s’enregistrer e aupr`s d’elle. il est fait l’hypoth`se que tous les partenaires e de la transaction supportent les op´rations de pr´paration et de validation indispensables e e a sa mise en œuvre . e WS-AtomicTransaction8 [Cabrera et al. puisque chaque service composant s’appuie e e sur un syst`me de gestion de transactions choisi ou con¸u pour le composant. le protocole de validation e e e a deux phases. De plus.

102 CHAPITRE 4. e e . de r`gles d’usages. au moment de l’ex´cution. LES SERVICES WEB s´lection dynamique. ou encore en fonction des propri´t´s transactionnelles e e ee expos´es (pour augmenter les chances de terminer la transaction avec succ`s par exemple). en fonction de crit`res de coˆ t. de quae e e u lit´ de services.

g´n´ralement projet´ dans une base e e e e e e de donn´es relationnelle.Intergiciel et Construction d’Applications R´parties e c 2006 P. C’est le cas par exemple de e e e la couverture des standards de Corba de l’OMG autour de la gestion d’objets r´partis. offre un support au d´veloppement.1 Introduction La synth`se propos´e par ce chapitre s’attache a ´tudier les principes structurants e e ` e qui gouvernent la mise en œuvre de J2EE. La derni`re section conclut sur la synth`se pr´sent´e et dessine e e e e e quelques perspectives sur les ´volutions en cours de cet environnement. e des standards du W3C autour de la gestion de documents XML ou encore du support des services Web. Les trois sections qui suivent introduisent les principales fonctions techniques offerte par l’environnement. e e . Deux e e e sections sont ensuite consacr´es aux deux principaux mod`les de programmation de come e posants applicatifs. D´chamboux (version du 19 janvier 2007 . permettant de garantir un certain nombre de propri´t´s ee n´cessaires aux applications d’entreprise vis´es. et d’autre part e les composants portant la logique dite m´tier. e Le chapitre commence par une introduction de l’environnement J2EE. suivie par une pr´sentation des principes de construction et d’assemblage d’application J2EE a base e ` de composants. au e e d´ploiement. ayant souvent un caract`re critique. La vue qui est donn´e de l’environnement e J2EE ne se veut pas exhaustive. Certains aspects couverts par le standard J2EE sont de simples d´clinaisons Java d’autres standards plus g´n´raux.0/fr/deed. Cet environnement. a savoir d’une part les composants de pr´sentation Web permettant de ` e g´rer la logique d’interaction avec les utilisateurs munis d’un navigateur.fr) Chapitre 5 La plate-forme J2EE Ce chapitre se propose de fournir une vue synth´tique des grands principes qui goue vernent la mise en œuvre de l’environnement J2EE [J2EE 2005]. Ces derniers sont pr´sent´s dans le chapitre 4. e 5. comme par e a e e exemple des applications Web ou des applications r´parties offrant des prises de service. Ces derniers incluent notamment les come posants repr´sentant le mod`le d’informations m´tier. ainsi qu’` l’ex´cution d’applications s’ex´cutant en mode serveur.org/licenses/by-nc-nd/ 2.10:31) e Licence Creative Commons (http://creativecommons. propos´ dans le contexte de Java par Sun Microsystem.

LA PLATE-FORME J2EE 5. Java est d´sormais bien install´ dans l’´cosyst`me des applications d’entreprise et e e e e est devenu le principal concurrent de l’environnement . Sun a structur´ l’offre e e e technique autour des serveurs d’application Java a travers le standard J2EE. les syst`mes de communication asyn` e chrone (en anglais Message-Oriented Middleware). mais aussi de syst`mes de description des applications e construites pour cet environnement ainsi que de format de paquets utiles au d´ploiement.1. A son origine. dont l’objectif est la construction programmatique de pages Web. en anglais applet). Suivront alors la version e e e 1. e e 5. puis la version 1. J2EE est intimement li´ au langage Java et a l’environnement d’ex´cution standard e ` e J2SE [J2SE 2005] qui l’accompagne. Le langage lui-mˆme a acquis de la perennit´ puisqu’on compte c e e d´sormais plus de 4 millions de d´veloppeurs Java dans le monde. Cela positionne l’environnement comme une base logi- .1 Historique L’environnement Java pour l’entreprise a commenc´ a ´merger assez rapidement apr`s e`e e les d´buts de Java au milieu des ann´es 90. deux nous paraissent primordiales : – Le spectre fonctionnel couvert. e Parmi les principales forces de l’environnement J2EE. Apr`s ces premiers pas et un relatif succ`s de ces technologies. Java ´tait destin´ aux environnee e e e ments contraints (par exemple des petits ´quipements ´lectroniques). la r´sistance a des charges d’ex´cution importantes ou u e e ` e encore la s´curit´.2 J2EE.104 CHAPITRE 5. d´ployer et ex´cuter ee c e e e des applications r´parties pour le monde de l’entreprise. [Gray and Reuter 1993]). Le d´veloppeur dispose probablement d’une tr`s large e e palette de fonctions pour construire des applications d’entreprise. l’un des objectifs ´tant de garantir un niveau ´lev´ de productivit´.1. Il a en fait perc´ dans e e e l’environnement du Web. L’objectif ` de ce dernier est de f´d´rer dans un cadre coh´rent toutes les technologies n´cessaires a e e e e ` la mise en oeuvre des applications de l’entreprise (applications orient´es « serveur »). Ce contexte de l’entreprise se e caract´rise g´n´ralement par la n´cessit´ d’assurer des niveaux de qualit´ de service tels e e e e e e que la sˆ ret´ de fonctionnement. pour quoi faire ? J2EE a ´t´ con¸u comme un environnement pour d´velopper.4 en 2003 incluant un support complet des standards XML et le support des services Web. Les premi`res d´clinaisons e e de Java dans l’environnement des serveurs sont apparues en 1997 avec les servlets. C’est notamment le cas de la e e e e connectivit´. ou e e encore des protocoles divers.NET de Microsoft dont le chapitre 6donne un aper¸u.3 de J2EE en 2001. La e premi`re version des sp´cification de J2EE est publi´e en 1999. J2EE est construit comme une agr´gation e coh´rente de fonctions sp´cifi´es dans d’autres normes r´pondant a diff´rents besoins des e e e e ` e applications d’entreprise. pour laquelle J2EE offre des m´canismes tels que l’appel de proc´dure e e e a distance (en anglais Remote Procedure Call). Nous voyons dans la suite comment ces diff´rents aspects sont pris en e e e charge. En fait. puis avec les Entreprise Java Beans dont l’objectif est le support de code m´tier n´cessitant un contexte d’ex´cution e e e transactionnel (cf. Toutes ces normes se mat´rialisent sous la forme d’API permete tant d’utiliser lesdites fonctions. l’acc`s aux bases de donn´es. notamment dans les navigateurs pour le support d’interfaces graphiques riches (notion d’appliquette Java.

IBM. De grands ´diteurs (BEA. ainsi que leurs d´pendances vis-`-vis d’autres composants ou des ´l´ments de l’environe a ee nement d’ex´cution (par exemple le syst`me transactionnel).1. J2EE d´finit un cadre architectural. C’est d’autant plus rassurant pour les utilisateurs qui investissent dans la technologie que la portabilit´ des applicae tions est r´ellement av´r´e. les contrats qu’ils respectent (comportement transactionnel. Il est aussi n´cessaire de bien maˆ e ıtriser les concepts sous-jacents a J2EE (notamment les principes des ` transactions) pour l’utiliser efficacement. Ce cadre architectural se base sur la notion de composant et d’assemblage de composants.2. WML. 5. Les contrats associ´s aux composants sont pris en charge par la notion de conteneur lors du e d´ploiement et de l’ex´cution des composants. Mae cromedia. Un conteneur correspond a la notion de e e ` canevas telle que pr´sent´e dans la section 2. Sun met a disposition pour cela des outils de v´rification de la confore ` e mit´ d’applications au standard J2EE [Sun 2005]. le monde a de l’open source participe lui aussi de l’abondance de l’offre a travers des produits ` comme JBoss [JBoss Group 2003]. persistance. deux architectures sont possibles : – Architecture client l´ger : dans ce cas. e e ` e Ils sont mat´rialis´s par des paquetages qui contiennent a la fois le code des composants e e ` ainsi que toutes les informations descriptives sur ces composants et leur assemblage.5. – Une offre produit importante.1. le terminal embarque un m´canisme qui pere e met d’interpr´ter les informations de pr´sentation et d’interaction avec l’utilisateur e e produite par le serveur. e La richesse et la puissance de l’environnement J2EE en font aussi un d´faut car la e phase d’apprentissage reste lourde si l’objectif est la connaissance de l’ensemble. Les assemblages sont euxe e mˆmes d´crits avec les composants a travers la d´finition des liaisons entre composants. INTRODUCTION 105 cielle pertinente pour l’int´gration d’applications (en anglais Entreprise Application e Integration). Cela peut ˆtre un navigateur qui interpr`te des pages XML e e (XHTML.3 Principes d’architecture La principale cible fonctionnelle de l’environnement J2EE est l’application Web mettant en œuvre des pages dynamiques. permettant d’organiser leur code. Les composants sont des biblioth`ques de code Java qui d´crivent les services qu’ils e e fournissent. si l’utilisateur reste dans le cadre des fonctions standard e ee ´videmment. Sun. etc). Oracle. etc) ont bˆti leur offre sur ce socle intergiciel. JOnAS [The Objectweb Consortium 2000] et Geronimo [The Apache Software Foundation 2006]. ou VoiceXML suivant la modalit´ utilis´e) produite par le serveur e e . e e La vue architecturale propos´e correspond a une d´composition de la chaˆ d’ex´cution e ` e ıne e d’application du terminal jusqu’aux diff´rents serveurs intervenant dans l’ex´cution d’une e e application. Les ´l´ments propos´s par cette d´composition sont d´crits ci-apr`s. dit multi´tage ` e e (en anglais multitier ). c’est a dire des pages calcul´es dont le contenu ` e d´pend du contexte (par exemple l’utilisateur). ee e e e e L’´tage client e L’´tage client est repr´sent´ par le terminal et prend en charge l’interaction avec l’utie e e lisateur. Du point de cette interaction. Outre l’ensemble des fonctions n´cessaires e e a la mise en œuvre de telles applications. Par ailleurs.1.

SWT. ` Le choix entre ces deux architectures est un probl`me de compromis entre la facilit´ de e e d´ploiement. La communication avec le serveur passe g´n´ralement par le protocole HTTP e e dans le cas du Web ou des interfaces vocales. la complexit´ de gestion de versions de logiciels avanc´s au niveau du terminal e e e d’un cˆt´.106 CHAPITRE 5. Cela peut en simplifier le d´ploiement mˆme si cela pose des probl`mes de compatibilit´ e e e e de version de JVM ou encore de gestion de politique de s´curit´. Swing. voire JMS. l’environnement J2EE fournit un support d’ex´cution pour aider la partie cliente a se lier facilement avec la partie serveur. Une telle application peut d’ailleurs elle-mˆme ˆtre ex´cut´e sous e e e e la forme d’une applet dans le contexte d’un navigateur supportant une JVM. D’autres approches e e technologiques ´mergent actuellement comme par exemple AJAX qui s’appuie sur e la machine Javascript dont le support est g´n´ralis´ dans les navigateurs Web et sur e e e des interactions a base de services Web entre le client riche et le code serveur. La communication avec la partie serveur peut passer ici par les diff´rents moyens disponibles dans le cadre J2EE : RMI. le terminal ex´cute une e application Java utilisant g´n´ralement des couches graphiques ´volu´es de J2SE e e e e ou d’autres (AWT. et l’exp´rience ergonomique per¸ue par l’utilisateur d’autre part. le navigateur VoiceXML est lui-mˆme ex´cut´ par un serveur vocal connect´ au tere e e e minal par un canal voix classique (RTC. LA PLATE-FORME J2EE Figure 5. Dans le cas du WAP (pages WML).1 – Architecture multi´tages dans l’environnement J2EE e J2EE. le protocole utilis´ est WTP qui ne fait pas partie des protocoles support´s e e en standard par l’environnement J2EE. e ` . GSM. etc). etc). sachant que dans ce dernier cas. notamment oe e c pour les interfaces graphiques. Dans la seconde architecture. – Architecture client riche (ou client lourd) : dans ce cas. Web e Services.

Dans ce cas. INTRODUCTION 107 L’´tage serveur e L’´tage serveur ex´cute le code applicatif J2EE pour le compte de plusieurs utilisateurs e e simultan´ment. L’´tage information e L’´tage information (´tage EIS dans la figure 5. Ces informations e peuvent ˆtre fournies par d’autres applications patrimoniales.1) se compose des syst`mes qui foure e e nissent les informations de l’entreprise n´cessaires aux applications. ces sese sions pouvant ou non contenir des donn´es propres. Les composants de session g´re le code m´tier e e e repr´sentant un session d’interaction entre un utilisateur et l’application. L’objectif est e e donc de rendre l’utilisation de ces services la plus transparente possible au programmeur.5. e e e certains de ces services peuvent ˆtre compliqu´s a mettre en œuvre.3.1. – L’´tage m´tier : cet ´tage correspond au code d´finissant le m´tier ou la fonction e e e e e mˆme de l’application. pour la gestion de donn´es de sessions Web. L’autre rˆle pris en charge par les conteneurs concerne le d´ploiement des composants o e qu’ils g`rent. e e 5.1. simplifiant au maximum l’utilisation des services proe pos´s en permettant d’exprimer des contrats d´claratifs associ´s aux composants. Cette interposition utilise g´n´ralement le patron d’architecture e e d’interception tel que d´crit en 2. Cela signifie notamment que dans le code de la classe de l’objet intercept´. Les composants de donn´es ene e capsulent l’acc`s aux bases de donn´es relationnelles. ou encore la persistance des objets m´tier dans les bases de donn´es.4 Mod`les de programmation et conteneurs e Un des grands int´rˆts de l’environnement J2EE est qu’il fournit des mod`les de proee e grammation pour le d´veloppeur. De ce point de vue. En effet. Ce mˆme code est a son tour d´compos´ en deux ´tages distincts : e e ` e e e – L’´tage pr´sentation : cet ´tage ex´cute le code des interfaces utilisateur de type client e e e e l´ger. le programmeur manipule explicitement e les intercepteurs qui implantent la mˆme interface que l’objet intercept´ plutˆt que cet e e o objet. le proe grammeur doit toujours passer par l’intercepteur s’il veut que les contrats demand´s soit e pris en compte. C’est le cas pour la e e ` gestion de la s´curit´.5. ou directement par des bases e de donn´es. le conteneur fournit aux composants le moyen de se lier e . pour la gestion des trane e e sactions. C’est le rˆle d´volu aux conteneurs qui s’interposent entre les composants applicatifs et o e les services qu’ils utilisent. L’environnement J2EE propose plusieurs types de compe sants pour mettre en œuvre cet ´tage. e Ces principes d’architecture ont un impact sur l’organisation des diff´rentes phases du e cycle de vie d’une application J2EE : sur la phase de d´veloppement avec les principes e d’organisation du code mais aussi sur les phases de d´ploiement et d’ex´cution. Enfin les composants r´actifs e e e permettent au code m´tier de r´agir sur l’arriv´e d’´v´nements provenant d’applicae e e e e tions externes ou d’´v´nements internes a l’application (programmation asynchrone e e ` dans le cadre d’une application J2EE). Il produit g´n´ralement des pages XML qui sont retourn´es a un navigateur e e e e ` repr´sentant l’´tage client qui se charge alors de les interpr´ter pour construire le e e e rendu attendu.

la troisi`me partie (JAXR) donne acc`s aux annuaires de Web Services e e (par exemple un annuaire UDDI).108 CHAPITRE 5. ou ` a travers des sujets (topic) permettant la publication et la r´ception anonyme de ` e messages (tous les consommateurs recoivent tous les messages). ce dernier ne proposant l’acc`s a aucune des fonctions de l’environnement J2EE. Parmi ces services. Pour l’´tage client. La partie basse (SAAJ) e est le canevas SOAP pour Java avec le support des attachements pour le transport de donn´es binaires. La partie haute (JAX-RPC) implante la fonction de RPC au-dessus de SOAP. il s’agit du ` e ` e e conteneur d’application cliente J2EE et du conteneur d’applet.2 – Conteneurs J2EE Quatre types de conteneurs sont propos´s par l’environnement J2EE.2. Ces services comprennent : e e – La pile Web Service : elle est compos´e de trois parties. Deux sont li´s e e a l’´tage client et deux autres a l’´tage serveur J2EE. LA PLATE-FORME J2EE aux autres composants ou aux ressources dont ils ont besoin pour leur ex´cution. Elle d´finit aussi e . Il permet d’adapter SOAP a diff´rents protocoles de transport e ` e des appels. Enfin. certains peuvent ˆtre e e appel´s depuis n’importe quel ´tage client ou serveur. Cˆt´ serveur. il y a le conteneur e ` oe de composants de pr´sentation / servlets (conteneur Web) et le conteneur de composants e m´tier (conteneur EJB). e Figure 5. que ce soit a travers des queues garantissant e e ` l’acheminement d’un message d’un producteur a un consommateur de messages. e Comme le montre la figure 5. les conteneurs (sauf le conteneur d’applet) donnent acc`s aux services de l’environnement J2EE. La sp´cification JMS d´finit la ee e e e mani`re de g´rer des files de messages. – Le support de communication asynchrone : les communications asynchrones sont un ´l´ment important pour l’int´gration d’applications.

offrant ainsi un moyen de notifier des ´v`nements a e e ` des utilisateurs externes. e – Le support d’envoi de messages ´lectroniques : il permet d’envoyer des e-mail a e ` partir d’une application J2EE. Cette fonction d’instrumentation est ainsi disponible aussi bien au niveau des composants de la plate-forme J2EE (les services disponibles) que des composants applicatifs. Cette plate-forme e e implante aussi les m´canismes permettant de d´ployer et d’ex´cuter les composants e e e . pour son assemblage e puisqu’il se base sur la notion de composants. de contrˆler l’acc`s a ces ressources ou e o e ` encore de g´rer ces ressources en mode transactionnel. La sp´cification JACC d´finit la mani`re d’installer.5. concernant pour l’ese e e sentiel des autorisation d’acc`s. INTRODUCTION 109 diff´rents niveaux de qualit´ de service concernant la d´livrance de messages (par e e e exemple aucune perte). Il supporte deux modes d’interace e tions : les interactions a l’initiative du serveur J2EE ou celles a l’initiative du syst`me ` ` e externe. A un premier niveau. – Le support d’autorisation pour les conteneurs : il permet d’ajouter au niveau des conteneurs des modules d´finissant des politiques de s´curit´. La ` e sp´cification JTA offre ainsi le moyen de garantir l’atomicit´ d’un ensemble d’actions e e sur des syst`mes g´rant des donn´es critiques (comme par exemple des bases de e e e donn´es ou des files de messages). e La plupart de ces fonctions sont d´crites plus en d´tail et illustr´es dans la suite du e e e chapitre. Il propose des solutions pour le d´veloppement de l’application. Un agent d’administration permet g´n´ralement e e d’agr´ger l’acc`s a ces composants administrables pour les outils d’administration e e ` (par exemple une console d’administration graphique). La sp´cification JavaMail offre donc les APIs pour effectuer e ce type d’action et fournit un le moyen de sp´ciliser la mani`re de traiter ces envois e e (interface fournisseur / SPI). – Le support d’administration : il permet a travers la sp´cification JMX de d´finir ` e e des composants administrables. e – Le support des connecteurs J2EE : il permet de se connecter a des syst`mes externes ` e g´rant des ressources qui peuvent ˆtre critiques.5 Les acteurs dans l’environnement J2EE : organisation des rˆles o L’environnement J2EE prend en charge une grande partie du cycle de vie d’une application. Voici une liste des fournisseurs ainsi que leur rˆle : o – Le fournisseur de la plate-forme serveur : il fournit la plate-forme logicielle implantant les diff´rents services propos´s par l’environnement J2EE.1. pour son d´ploiement. L’autre groupe contient les services qui ne sont accessibles qu’au code des composants s’ex´cutant dans le serveur J2EE. e e e e de configurer et d’utiliser (v´rification de droits d’acc`s) un module fournissant cette e e politique d’acc`s. Il d´finit des contrats pour les connecteurs qui permettent a la plate-forme e ` J2EE de g´rer les ressources de connexion. nous distinguons deux types d’ace teurs : les fournisseurs de technologies et leurs utilisateurs. o e c’est a dire leur d´marrage (begin) et leur terminaison (rollback ou commit).1. et enfin pour son e ex´cution et son administration. 5. Ces services comprennent : e – Le support des transactions : il permet de contrˆler la d´marcation des transactions.

configuration. on trouve des outils de ce type. il va devoir agir sur le param´trage de la plate-forme. Il s’ape e puie pour cela sur les APIs des diff´rents services propos´s par l’environnement J2EE e e (cf. ` . Des outils d’aide a l’empaquetage (fabrication ` des paquetages introduits pr´c´demment) sont aussi fournis car le paquetage est e e un passage oblig´ pour d´ployer le code sur des plates-formes J2EE. De la mˆme mani`re.110 CHAPITRE 5. u e e Du cˆt´ des utilisateurs. Il utilise pour cela les outils d’administration tels que d´crits e e pr´c´demment pour effectuer ces diff´rentes actions : d´ploiement. notamment dans e e le monde open source o` les acteurs sont plus sp´cialis´s. voire pour les e e phases de mise au point. conteneurs). En effet. C’est le cas d’agents d’agr´gation ` e de fonctions ou d’informations d’administration. Il est clair que le d´veloppeur doit dans la plupart des cas maˆ e ıtriser aussi les deux autres rˆles. ou encore des consoles d’administration. Ces assemblages sont ensuite empaquet´s afin d’ˆtre pris en charge par les conteneurs ad´quats suivant le type e e e des composants qu’ils contiennent (par exemple paquetages de composants Web ou paquetages de composants m´tiers ou les deux). lorsqu’il met au point les composants qu’il d´veloppe. il doit les o e empaqueter pour pouvoir les d´ployer sur le plate-forme qui va lui servir a ex´cuter ses e ` e essais. endossant ainsi le rˆle d´volu e o e a l’administrateur. LA PLATE-FORME J2EE (cf. C’est le cas par exemple ` e e des capacit´s de clustering qu’on retrouve dans la plupart des plates-formes mais e qui sont ind´pendantes du mod`le de programmation J2EE. Il utilise les outils d’aide au d´veloppement et a la mise au e ` point tels que pr´sent´s pr´c´demment. dimensionnement des e pools de ressources). Mˆme si certaines parties sont intimement li´es e e e a la plate-forme. Il d´finit pour cela e e les liaisons effectives des composants vers les ressources qu’ils utilisent (par exemple une base de donn´es). mˆme si nous pourrions d´tailler beaucoup plus les rˆles. Elle implante aussi les interfaces n´cessaires a l’administration de e ` la plate-forme elle-mˆme. e – L’administrateur d’application : c’est lui qui d´ploie l’application. – Le fournisseur d’outils d’administration : lors de la mise en exploitation d’une application J2EE. section suivante). il faut disposer d’outils permettant de l’administrer en mˆme temps e que la plate-forme J2EE elle-mˆme. Concernant la e partie d´veloppement. s’il doit effectuer des essais de performance ou de mont´e en e e e charge. ainsi que les liens qui les unissent. e e – Le fournisseur d’outils de d´veloppement : il fournit g´n´ralement des outils permete e e tant de faciliter le d´veloppement et l’empaquetage des applications. sachant qu’elles sont standardis´es. e e e e – L’assembleur d’application ou de composants : il d´crit l’ensemble des composants e qui composent une application ou une partie d’application (il peut s’agir d’un assemblage partiel). IBM. ou Sun cumulent les trois rˆles mais il est e o n´anmoins possible de trouver des fournisseurs positionn´s sur un seul. e e Certains grands ´diteurs comme BEA. les oe e e o acteurs qui nous semblent les plus pertinents vis-`-vis de J2EE sont les suivants : a – Le d´veloppeur de composants : il cr´e et valide des composants applicatifs. Ces outils sont souvent fortement adh´rents aux plates-formes qu’ils ciblent e car une bonne partie des fonctions a g´rer sont sp´cifiques. e e e e param´trisation des services de la plate-forme (par exemple. on retrouve des outils de mise au point mais aussi des outils e de profilage pour les performances.

par exemple par ´tage. L’utilisation de contextes de nommage et de noms est e e courante tout au long du pr´sent chapitre. Il doit maˆ e e ıtriser la plate-forme. cet aspect e ` est port´ par la sp´cification JNDI. des intere faces et des informations descriptives.` 5.1 Mod`le de composants e Le mod`le de composants propos´ par J2EE est un mod`le plat a deux niveaux : le e e e ` niveau de base d´finit les composants J2EE et le niveau sup´rieur une application J2EE e e qui est un assemblage des composants du premier niveau. Dans le cadre de J2EE. mˆme si dans de grosses structures ces e e e d´veloppeurs peuvent ˆtre sp´cialis´s. Ce tout est ensuite empaquet´ e e e dans un format de paquet standard.1.3 – Empaquetage de composants J2EE Un composant J2EE est un ensemble logiciel d´fini par des classes. au minimum les outils de d´veloppement associ´s. bien trait´ dans des ouvrages sur les bonnes e pratiques architecturales [Alur et al. Comme dans les autres mod`les de composants e . La mani`re d’architecturer ee e des applications J2EE est un point primordial. e Figure 5. e e e e e 5.2. e e e 5.2 Approche ` composants a L’environnement J2EE propose de construire des applications par parties qui sont ensuite assembl´es pour former un tout coh´rent et complet.6 R´f´rences utiles ee Mˆme s’il s’agit d’un outil puissant. et particuli`rement dans cette section traitant e e de la d´finition et de l’assemblage de composants. qui peut ˆtre d´ploy´ sur n’importe quel serveur J2EE. J2EE comme tout environnement informatique qui e se respecte n’a d’int´rˆt que s’il est correctement mis en œuvre. 2003]. APPROCHE A COMPOSANTS 111 Cette d´finition des diff´rents rˆles fait ressortir l’ampleur des comp´tences qui doivent e e o e ˆtre mises en œuvre par le d´veloppeur J2EE. les services de l’environnement J2EE ainsi que les bons e e principes d’architecture a mettre en œuvre. 2003] ou sur les mauvaises [Dudney et al. 5. e e e Cette section d´crit les principes de cette d´marche de d´composition et d’assemblage.2. C’est un d´fi majeur en termes de formation ` e n´cessaire pour avoir un d´veloppeur efficace. Nous supposons comme acquis le principe de gestion de r´f´rence pour la mise en liaison ee d’entit´s logicielles a partir d’un service de nommage.

xml . Web. Il peut aussi d´finir un a e certain nombre de param`tres permettant d’adapter sa configuration a diff´rents contextes e ` e de d´ploiement.war .ear Application cliente : client. e e Une application J2EE est donc un assemblage de composants qui sont empaquet´s e dans un paquetage qui lui est associ´. La liste ci-dessous ´num`re les diff´rents ´l´ments d´ployables dans e e e e ee e un environnement J2EE (applications et composants) accompagn´s des noms types des e descripteurs associ´s ainsi que de l’extension du fichier d’archive utilis´e : e e Application : application.3.jar Module Web : web. e e e L’environnement J2EE ne propose donc que du d´ploiement centralis´ de composants ase e sembl´s statiquement au moment de ce d´ploiement. J2EE distingue les e e e e suffixes des paquetages par ´tage comme le montre la figure 5. La principale diff´rence e e entre ces paquetages est le fichier de description de leur contenu.4 montre bien que les liaisons e e cr´´es entre les composants a l’assemblage font fi des fronti`res d´finies entre les paqueee ` e e tages tels que d´finis dans la figure 5.2.xml . Les deux processus d’assemblage et d’empaquee tage sont n´anmoins relativement ind´pendants.4 – Assemblage de composants J2EE Les deux sections qui suivent d´crivent comment s’organisent les deux processus d’eme paquetage et d’assemblage d’application. Au minimum. elle est d´ploy´e dans une plate-forme J2EE unique.2 Empaquetage de composants et d’applications Le paquetage est l’unit´ de d´ploiement dans l’environnement J2EE. Toutes ces informations sur le composant sont d´crites dans un descripteur e e qui est utilis´ lors de son assemblage au sein d’une application et lors de son d´ploiement.jar. La figure 5. il se d´finit comme un ´l´ment logiciel proposant des intere ee faces de service (en g´n´ral une seule dans le cas de J2EE) et explicitant ses d´pendances e e e vis-`-vis d’autres composants en exhibant ses interfaces requises. Hormis lorsqu’une e e e application contient un ´tage client.112 CHAPITRE 5. aussi nomm´ descripe teur de d´ploiement. e Figure 5. N´anmoins. et pour chaque connecteur. Cet environnee e ment pr´sente deux niveaux d’empaquetage : le paquetage de l’application J2EE et les e modules des diff´rents ´tages empaquet´s dans des sous-paquetages. 5. une application J2EE distingue e e e les paquetages par ´tage client. pour des raisons de lisibilit´. e e Tous les paquetages J2EE sont bˆtis comme des fichiers d’archive Java dont le sufa fixe est g´n´ralement .3 . LA PLATE-FORME J2EE [Szyperski and Pfister 1997]. m´tier. Il reste que la politique d’empaquetage suit e ` g´n´ralement une logique de pr´-assemblage. un composant d’un paquetage peut tr`s bien ˆtre e e e reli´ a un composant d’un autre paquetage. Cela signifie qu’il e e y a toujours au minimum deux niveaux d’empaquetage : le niveau applicatif et le niveau d’empaquetage de composants par ´tage.xml .

Comme le montre la figure 5.` 5.. il s’agit d’archives Java classiques contenant un r´pertoire META-INF e avec un fichier MANIFEST. La d´finition n’est pas compl`te.ear.rar Dans tous les cas. </application> Nous ne donnons pas une vue exhaustive de ces descripteurs de d´ploiement. e <application> <display-name>A1</display-name> <description>Application description</description> .war et le second e est le module m´tier d´fini dans ejb1.jar e Connecteur : ra. <module> <web> <web-uri>w1.5.xml du r´pertoire META-INF du paquetage e a1. .jar</ejb> </module> .xml .MF donnant des informations sur le paquetage et le descripteur de d´ploiement correspondant. ` e Figure 5. <module> <ejb>ejb1. par exemple le fichier web..jar. des fichiers HTML ou JSP). Ces e archives contiennent aussi les r´pertoires o` se trouvent les binaires des classes et des intere u faces des composants d´finis dans le paquetage. Le premier est le module Web d´fini dans w1. ainsi que toute autre ressource n´cessaire e e a l’ex´cution de ces composants (par exemple.2.xml . les paquetages e e de ces modules doivent donc ˆtre stock´s a la racine du fichier a1..3.xml pour un module Web. la suite e du chapitre montrant des ´l´ments d’autres types de descripteur pour illustrer diverses ee constructions J2EE. Elle montre la d´finition de deux des modules e e e composant l’application A1.5 – Une archive d’application J2EE Le descripteur XML qui suit est celui de l’application J2EE A1 de la figure 5..ear pour pouvoir ˆtre e e ` e pris en charge au d´ploiement.. Il correspond au contenu du fichier application.war</web-uri> <context-root>monsite_a1</context-root> </web> </module> . APPROCHE A COMPOSANTS 113 Module m´tier : ejb-jar..

6. Cette interface est utilis´e par la suite e e . La liaison e e avec un composant se fait la plupart du temps a travers une interface de type usine (cf. – Information de typage : une ou deux interfaces sont g´n´ralement associ´es a un e e e ` composant.6. l’assemblage entre les composants s’effectue d’abord au niveau de la description des composants. un servlet ne d´finit pas d’interface fournie puisqu’on la connait exactement : e c’est javax. Par ailleurs. C’est g´n´ralement une interface usine comme l’est l’interface Ejb1Home e e associ´e au composant CM1 dans la figure 5. Un composant m´tier d´finit des interfaces m´tier fournies. Un exemple d’une telle d´finition est l’´l´ment ejb-name utilis´ comme ee e ee e nom du composant CM1 dans la figure 5. Ce nom est ensuite utilis´ par les autres composants qui veulent y faire e e r´f´rence.3. Par e e exemple.2). il est naturel de constater qu’un composant logiciel g`re des instances d’un mˆme type.114 CHAPITRE 5. LA PLATE-FORME J2EE 5. Une seule est vraiment importante : c’est celle qui permet de se lier au composant. ce patron d’architecture e e est utilis´ par le serveur d’application J2EE pour avoir le contrˆle sur le cycle de vie des e o instances par interception des fonctions de l’usine. Dans un monde objet tel que celui de Java. e e e comme le composant CM1 avec l’interface Cm1Home. Cette description contient la d´finition des e interfaces fournies et des interfaces requises (les d´pendances vers d’autres composants).2. e En fait. la d´finition de ces composants est sp´cifique au type de composant. deux e informations importantes sont d´finies dans le descripteur : e – Information de nommage : un nom est associ´ a chaque composant. Ce nom idene ` tifie de fa¸on unique un composant dans le contexte du paquetage dans lequel il c est d´fini.3 Principes d’assemblage Le principe de base d’une approche a composants est que leur code soit aussi ` ind´pendant que possible du contexte dans lequel ils vont ˆtre d´ploy´s et ex´cut´s.servlet. ` section 2. sachant que l’interface Cm1 n’est l` que a pour signaler l’interface m´tier support´e par les instances de ce composant. J2EE ne d´roge pas a cette c ` e e ` r`gle. Cela lui permet d’op´rer la gestion e de ressources ad´quate a l’ex´cution et d’optimiser par exemple cette gestion pour des e ` e raisons de mont´e en charge. Pour les composants auxquels on va pouvoir se lier.Servlet. e Figure 5. de e e e e e e fa¸on a les rendre notamment le plus r´utilisables possible.6.6 – Description d’un assemblage entre deux composants Comme le montre la figure 5.

2. Il utilise le nom identifiant le composant dans le cadre de l’application en question. APPROCHE A COMPOSANTS 115 pour v´rifier la conformit´ d’un assemblage avant le d´ploiement d’une application. Les liaisons dans le code sont g´n´ralement mises en œuvre au moment de la cr´ation d’une instance. L’exemple de la figure 5. Elle est bien souvent d´finie dans un descripteur suppl´mentaire propre au e e produit.6 montre le lien du composant CP2 vers le composant m´tier CM1. ee e Dans le cas des r´f´rences vers d’autres ressources comme une queue JMS. Ce lien est d´fini par . e – Le lien vers le composant utilis´ dans le cas d’une r´f´rence vers un composant e ee m´tier : l’´l´ment ejb-link utilis´ dans ce cas exprime une mise en liaison effective e ee e de deux composants. Prenons le cas du e e e composant de pr´sentation CP2 pour lequel la m´thode init est appel´e par le conteneur e e e . e ea e L’expression des d´pendances est elle aussi sp´cifique au type de composant d´crit./ejb1. Malgr´ le manque d’homog´n´it´ dans e ee e e e e e l’expression de principes communs. une source ee de donn´es JDBC. la d´finition de la liaison e ` e effective n’est pas couverte par le standard J2EE. pour un type de r´f´rence donn´. elles ee e e doivent ˆtre activ´es dans le code a l’ex´cution.xml).` 5.xml que dans un descripteur ejb-jar. par exemple Cm1Home de e ee e CM1. Les ´l´ments e ee importants exprim´s pour ces d´pendances sont les suivants : e e – Le nom de la r´f´rence : c’est le nom qui va ˆtre utilis´ dans le code du composant ee e e pour r´cup´rer la liaison effective vers le composant r´f´renc´. e e e cet assemblage ´tant comme nous l’avons d´j` signal´ statique.6. La figure 5.war). L’expression des d´pendances e e e e est sp´cifiques au type de composant r´f´renc´. nous pouvons observer que la d´pendance vers le composant m´tier e e CM1 est d´fini en dehors de la d´finition du composant de pr´sentation CP2. e e e Dans la figure 5. Elle est donc sp´cifique a chaque e ` produit. ou encore une usine a connection JCA. est bien conforme au type du composant attendu par le r´f´ren¸ant. Il est bien souvent e e ee e pr´fix´ par le type de composant ou de ressource auquel on se lie. e e e dans le cas des servlets. ici CmxHome ee c dans la r´f´rence de CP2 (c’est a dire Cm1Home est CmxHome ou bien l’´tend (relation ee ` e d’h´ritage)). le r´f´ren¸age d’un composant m´tier s’exprime de la mˆme e ee c e e mani`re dans un descripteur web. En effet.. Il suffit e ` e pour cela de v´rifier que le type du composant r´f´renc´. Il est accessible par tous les composants sous un nom unique "java :comp/env". Ceci est g´n´ralement fait a la cr´ation e e ` e e e ` e d’une instance d’un composant. ces d´pendances ee e e sont d´finies de la mˆme mani`re quel que soit le type de composant dans lequel elles e e e sont utilis´es (par exemple. e e e e ces d´pendances sont associ´es au composant lui-mˆme.jar/ejb1 de fa¸on e e c a identifier compl`tement le composant dans le paquetage de l’application a partir ` e ` du paquetage dans lequel la r´f´rence est d´finie (ici le paquetage w1. les d´pendances exprim´es sont communes a tous les composants e e ` de pr´sentation d´finis dans un mˆme paquetage.6 e e montre deux types de r´f´rences : deux r´f´rences vers des composants m´tier dont ee ee e le nom est pr´fix´ par ejb/ et une r´f´rence vers un connecteur pr´fix´e par jca/. Dans le cas d’un composant m´tier. Une fois que les liaisons ont ´t´ d´finies dans les descripteurs de d´ploiement. e e ee e e – Le type du composant auquel on cherche a se lier : il permet de v´rifier la validit´ ` e e des liaisons d´finies a l’assemblage (cas d’un lien vers un composant m´tier). Au d´ploiement d’un composant. l’environnement J2EE e lui associe un contexte de nommage propre dans lequel sont d´finies toutes les liaisons e vers les autres composants ou vers les ressources requises par celui-ci.

la description d’un composant est attach´e a ce dernier plutˆt que d’ˆtre age ` o e glom´r´e dans un descripteur g´n´ral.. il suffit de changer le lien dans son descripteur de ` d´ploiement en sp´cifiant un autre composant : par exemple. . cette section d´crit l’environnement propos´ pour d´ployer une application e e e e e . on pri` e e e vil´gie l’utilisation des annotations pour toutes les informations relatives au comportement e du composant (propri´t´s d´claratives telles que les propri´t´s transactionnels ou les proee e ee pri´t´s li´s a la persistance). Le m´canisme de mise en liaison dans le code est donc le mˆme quel que soit le type e e de composant ou de ressource : il s’effectue par un lookup appropri´ sur le contexte correse pondant a l’environnement propre au composant. CmxHome). } Il est clair ici que le code du composant r´f´ren¸ant est ind´pendant de celui du comee c e posant r´f´renc´.116 CHAPITRE 5.4 D´ploiement d’application e Apr`s avoir vu comment une application est empaquet´e et assembl´e dans les sections e e e pr´c´dentes.. aucune information relative a CM1 n’est pr´sente dans le code ee e ` e de CP2. donnant ainsi acc`s e a un v´ritable environnement de r´utilisation de code. 5. // Appel´e a la cr´ation de l’instance du composant \emph{servlet} e ` e public void init(ServletConfig config) throws ServletException { Context envContext = new InitialContext(). Il suffira pour cela d’annoter la variable ou un accesseur a celle-ci pour d´finir ` e cette liaison (injection de la mise en liaison par le conteneur. usineCmx = (CmxHome) PortableRemoteObject. En effet. Cette nouvelle approche a ses avantages et ses ` e inconv´nients. LA PLATE-FORME J2EE de servlet lors de la cr´ation de servlet2 : e // D´finition de la variable contenant le lien vers l’usine a instances e ` // d’un composant CMx qui dans le cas pr´sent sera le composant CM1 e private CmxHome usineCmx. et l’utilisation des descripteurs pour toutes les informations ee e ` d’assemblage. L’utilisation des annotations est g´n´ralis´e dans cette version des sp´cifications. ` Il faut noter que ce m´canisme est en train d’´voluer quelque peu dans le cadre des e e nouvelles versions des sp´cifications. Dans une telle d´marche.lookup("ejb/CMx").2.lookup("java:comp/env").narrow( envContext. ce qui fait que les informations e e e e de description d’un composant qui ´taient auparavant pr´sentes dans le descripteur de e e d´ploiement sont de retour dans son code. e ` Par contre. n´cessaire dans le cas o` on se lie a un e u ` composant offrant une interface accessible a distance (interface Remote). mˆme si elles sont isol´es du code proprement e e e dit a travers ce m´canisme d’annotation.0. En effet. notamment dans le cadre d’EJB 3.jar/ejb1b</ejb-link>. L’exemple ci-dessus est compliqu´ par ` e l’utilisation d’une fonction de conversion de type.. l’afe fectation de la variable de liaison a partir du lookup pourra ˆtre prise en charge par le ` e conteneur./ejb1b. on se lie a un ejb1b avec e e ` <ejb-link>. Cela devrait faciliter l’´mergence de biblioth`ques ee e e e e de composants et de vrais outils d’assemblage s’appuyant sur celles-ci. Elle rend le code moins lisible a cause de la surchage due aux annotations. Pour lier CP2 a un autre CMx.

alors que celui de CP3 est dans un chargeur e e diff´rent. Au niveau de ces chargeurs. un chargeur diff´rent e e est cr´´ pour chaque paquetage Web d´ploy´.7 que tous les e composants m´tier (CM1. APPROCHE A COMPOSANTS 117 J2EE au niveau du serveur et au niveau des clients. ainsi qu’au e ` ` code de J2SE. on a g´n´ralement une hi´rarchie distinguant le e e e code de J2SE a la base. a la plate-forme J2EE. le code de CP1 et de CP2 sont ee e e embarqu´s dans le mˆme chargeur. e e e e Figure 5. on a affaire a un jeu de e ` poup´es russes comme le montre la figure 5.` 5. Pour l’application A1. Cet ordre d´fini une chaˆ de d´pendances fonctionnelles unidirectionnelles : e ıne e par exemple. l’´tage Web d´pend de l’´tage m´tier et jamais l’inverse. ou encore des informations de session). ceux-ci ont acc`s au code de tous les chargeurs e partag´s. e Les premiers contiennent le code commun a toutes les applications d´ploy´es dans un ` e e serveur J2EE. En effet. sont charg´s ee e e dans le mˆme espace. Cette e ee e e fonction ne parait n´anmoins pas apporter grand chose dans l’environnement. ´tage m´tier e e e e e inclus. les e diff´rents ´l´ments de la pr´sentation ´tant g´n´ralement empaquet´s ensemble (il e ee e e e e e peut ˆtre n´cessaire de partager des informations concernant les transitions entre les e e diff´rentes pages d’une pr´sentation. A partir de ce chargeur.7. CM2. – Les chargeurs de code Web : concernant le code de pr´sentation. donc a toutes les ressources J2EE. on voit dans la figure 5. puis un dernier ` contenant le code des ressources mises a disposition des applications (dans l’exemple. CM3. puis celui du serveur J2EE avec ses services de base. Les autres chargeurs sont sp´cifiques a chaque application et sont organis´s en deux e ` e niveaux : – Le chargeur du code m´tier : tous les composants du code m´tier d’une application.7 – Hi´rarchie des chargeurs de classes dans un serveur J2EE e Ces principes d’organisation sont garantis par l’environnement J2EE a travers l’orga` nisation d’une hi´rarchie de chargeurs de classes Java. Ces chargeurs ont acc`s au code de tous les autres ´tages. et CM4) ont leur code de l’espace d’un chargeur e unique. On peut distinguer deux types de chargeurs. le ` chargeur en question contient le code du composant CO2).2. Il n’ont en aucun cas acc`s au code de l’´tage de pr´sentation de e e e l’application. e e quels que soient les paquetages dans lesquels ils ont ´t´ embarqu´s. e e . Ainsi. Le seul point notable est qu’il y a une isolation entre les diff´rents composants e de pr´sentation qui ont ´t´ empaquet´s ind´pendamment les uns des autres. Un aspect important du cadre architectural d´fini par J2EE est que les ´tages propos´s e e e sont strictement ordonn´s par rapport a la chaˆ d’invocation applicative (du client vers e ` ıne les serveurs).

les r`gles de projection sont relativement simples. peut ˆtre e e e e charg´/d´charg´ ind´pendamment des autres ´l´ments de l’environnement J2EE. avec un point sur trois aspects e e pr´pond´rants requis par les applications d’entreprise : les m´canismes permettant de faire e e e communiquer et d’int´grer les diff´rentes applications. Il s’agit soit ` de m´canismes synchrones de type appel de proc´dure a distance (cf. concerne le support des services Web.4). section e e ` 1. Nous verrons par la suite que ce type de fonction e est propos´ en standard dans certains cas. La s´m` antique e e u de l’invocation de m´thode n’est pas exactement la mˆme qu’une invocation locale (pure e e Java) de l’interface.5.3 Applications r´parties et int´gration e e Parmi les fonctions importantes offertes par l’environnement J2EE. chapitre 1.1 Appel de proc´dure ` distance e a Deux m´canismes de communication de type RPC sont support´s. en e e ne rechargeant que le code de ce ´tage. offrant ainsi un niveau de transparence important. Le second. En effet. section 5. Elles se focalisent ` pour l’essentiel sur les ´l´ments concernant la programmation de l’´tage de pr´sentation ee e e (interfaces servlet) et de l’´tage m´tier (interfaces EJB). par exemple lors de la mise au point de l’´tage de pr´sentation. Le premier est RMI e e et est d`s l’origine fortement coupl´ a Java [Sun Microsystems 2003].7 (il suffit alors de suppimer ce chargeur pour d´charger l’application). e ee . ` e De la mˆme mani`re. les transactions comme premier e e support a la sˆ ret´ de fonctionnement. Dans les deux e cas. un part importante concerne les moyens d’interconnecter les applications entre elles. il s’agit dans tous les cas d’un passage par r´f´rence. e e Nous ´tudions dans un premier temps les m´canismes de communication standard pour e e faire communiquer des applications a travers des abstractions de haut niveau. soit de m´canismes asynchrones comme de simples envois de message non bloquant e ou de techniques de « publication/abonnement » (en anglais publish and subscribe). on veut pouvoir descendre dans certains cas a un grain de rechargee e ` ment encore plus fin.118 CHAPITRE 5. concernant le passage d’objets en param`tre d’invocation de e m´thode. et la s´curit´ pour g´rer l’authentification des ` u e e e e utilisateurs et leurs autorisations d’acc`s aux ressources de l’entreprise. e C’est important notamment en phase de d´veloppement o` il peut ˆtre lourd de relancer e u e tout le serveur J2EE a chaque fois qu’on veut relancer l’application apr`s une modification. principalement compos´ du code m´tier et du code de pr´sentation. introduit e e` dans la version 1. dans un monde pur Java. 5. e Les sections qui suivent s’attachent a pr´senter les diff´rents ´l´ments programmatiques ` e e ee qui sont mis a la disposition du programmeur d’applications J2EE. comme par exemple les JSP (cf.3. J2EE permet de projeter une interface Java dans ces deux mondes. Ceci est e e e e ee rendu possible par l’isolation du code d’une application dans un chargeur d´di´ comme le e e montre la figure 5. LA PLATE-FORME J2EE L’important avec ce mod`le de chargement du code est que le code d’une applie cation. e 5. mais aussi ceux permettant a ces applications de s’int´grer a des syst`mes existants. tels que des syst`mes ` e ` e e patrimoniaux exhibant des modes de couplage tr`s sp´cifique.4 des sp´cifications.3). Java RMI Dans le cas de RMI.

L’un. les objets r´partis (objets RMI implantant l’interface Remote) sont e pass´s par r´f´rence alors que les autres sont pass´s par valeur. a un utilisateur JMS de produire des messages dans une file et a un autre ` ` de les consommer dans cette mˆme file. C’est ce protocole qui a ` ´t´ choisi pour l’interop´rabilit´ entre les serveurs J2EE interagissant en mode RMI. En effet.3. – Le mode point a point permet. permettant de garantir de l’atomicit´ entre la consommation e d’un message et des actions faites dans une base de donn´es par exemple suite a cette e ` consommation. etc. Cela signifie qu’il n’y a pas d’interop´rabilit´ possible entre diff´rents supports e e e e e JMS : on ne peut pas produire dans une queue avec une premi`re implantation et consome mer avec une autre implantation. a travers le paradigme de file de messages (queue en ` ` anglais). 5. JRMP. soit c’est le syst`me externe.3. ee e e Web Services La projection vers les services Web est encore plus restrictive que dans le cas de RMI. e ee e ` l’encodage am`ne a ce qu’il y a autant d’instances diff´rentes de l’objet en question dans e ` e le graphe d´cod´ que de r´f´rences dans le graphe d’origine.3 Connecteurs au standard JCA L’environnement J2EE propose un cadre pour l’int´gration de syst`mes externes a e e ` travers des connecteurs. c’est le mode document/wrap` ped sp´cifi´ dans le cadre du WS-I qui a ´t´ retenu comme protocole d’interop´rabilit´. Il permet de supporter des interactions dans deux modes : soit c’est l’environnement J2EE qui est a l’initiative de l’interaction. Celles-ci e offrent deux paradigmes de communication. Enfin. avec des contraintes sur l’encodage XML des objets pass´s en e param`tre. garantir qu’il n’y a pas e ` e de r´ception multiple. il est pr´vu une int´gration en mode transactionnel du e e e support JMS dans J2EE. Dans les deux cas. Il n’y a donc ee que du passage par valeur. si un objet est r´f´renc´ plusieurs fois dans le graphe a encoder. les sp´cifications donnent les moyens de d´finir des propri´t´s concere e ee nant la d´livrance des messages.´ ´ 5. e e ee Concernant l’encodage XML des invocations a distance. e e ee e e 5. ` e . garantir l’acheminenment (pas de perte). le protocole de Corba. les communications sont multiee points. est le protocole natif de Java RMI qui fait d’ailleurs partie de Java de base (c’est a dire J2SE). rien n’est e sp´cifi´. L’autre est IIOP. il n’existe pour l’instant (sp´cification en cours) aucun moyen de passer des e r´f´rences vers d’autres services Web lors de l’invocation d’un service Web. APPLICATIONS REPARTIES ET INTEGRATION 119 Dans le cas de RMI. e garantir l’ordre de r´ception par rapport a l’ordre d’´mission. RMI propose deux proto` coles. Concernant le protocole d’encodage des messages dans les syst`mes JMS. Par exemple. Plusieurs utilisateurs peuvent publier des messages sur le sujet alors que plusieurs autres peuvent s’abonner pour les recevoir.3.2 Communication asynchrone : JMS Le support de communication asynchrone s’appuie sur les sp´cifications JMS. e – Le paradigme de sujet d’int´rˆt (en anglais topic). Par exemple. e ee e Concernant la partie encodage des invocations a distance.

6. e e e Connecteur JDBC d’acc`s aux bases de donn´es relationnelles e e JDBC correspond a l’interface standard permettant d’acc´der a des base de donn´es ` e ` e relationnelles a partir de l’environnement Java de base (J2SE). cela signifie que soit le e serveur J2EE doit inclure les interactions avec le syst`me externe dans une transace tion r´partie initialis´e par J2EE.4 Connecteurs de base Nous donnons dans cette section un aper¸u rapide de deux connecteurs de base utilis´s c e dans l’environnement J2EE : le connecteur d’acc`s aux bases de donn´es relationnelles.2. mˆme si ces derniers ne sont pas transactionnels. e e section 5. C’est e e en tout cas souvent ce qui se passe pour les connecteurs standard pr´sent´ ci-dessous (cf. e e e Un connecteur JCA doit implanter des API conforme a cette sp´cification pour pou` e voir s’int´grer a un serveur J2EE. et e e le connecteur d’acc`s au syst`me de messagerie ´lectronique.3. Ces connexions sont g´n´ralement e e e e lourdes et coˆ teuses a mettre en place. de fa¸on a exploiter au mieux cette gestion suivant le contexte d’utilisation. En cons´quence. section 5. JCA propose pour e e e cela diff´rents niveaux d’int´gration transactionnelle : pas de support transactionnel. Suivant les interfaces qu’il implante. Suivant le mode d’interaction. ou encore les connecteurs JMS pr´sent´s dans la section 5. e 5.3.120 CHAPITRE 5. Notons que e e l’objectif des contrats requis par l’environnement J2EE pour ce type de composant est de permettre au serveur de garder la responsabilit´ de la gestion des ressources. offrant eux-mˆmes e e e des capacit´s transactionnelles.4). une limite de la sp´cification JCA est qu’elle ne propose rien e e concernant la gestion du cycle de vie de ce type de composant. le serveur J2EE prend en u ` e charge le recyclage des connexions pour ´viter leur mise en place et leur destruction e lors de chaque ´change avec le syst`me externe (gestion d’une r´serve de connexions e e e par le serveur).3. c ` En terme d’int´gration.3) pour ˆtre trait´s. soit a l’inverse que le syst`me externe interagissant e e ` e avec le serveur J2EE doit inclure les actions effectu´es dans l’environnement J2EE e dans une transaction r´partie initialis´e par le syst`me externe. et support de ` transaction globale r´partie (transaction a validation a deux phases). e ` ` – Gestion de la s´curit´ : e e Ce standard est maintenant utiliser de fa¸on usuel comme m´canisme d’int´gration c e e standard de sous-syst`mes J2EE. LA PLATE-FORME J2EE Dans le second cas. – Gestion des transactions : L’utilisation de connecteurs se fait bien souvent pour int´grer l’environnement J2EE avec d’autres syst`mes critiques. Cela peut poser des probl`mes quant a l’initialisation de tels composants ou encore vis-`-vis de l’ordre dans e ` a lequel ils sont activ´s. e e support de transaction locale (transactions a validation une phase). Il permet d’effectuer tous les ` . les messages re¸us par le connecteur sont ensuite dirig´s vers des c e composants EJB r´actifs (cf. il peut s’int´grer e ` e principalement a trois supports techniques fournis pour l’environnement J2EE : ` – Gestion des r´serves de connexions : Un des principes partag´s par tous les types de e e connecteurs est qu’un connecteur g`re des connexions permettant de communiquer e avec le syst`me externe auquel il donne acc`s. Cela permet e ainsi d’avoir une vision et donc des politiques de gestion de ressources plus globales.

en s’appuyant bien sˆ r sur le standard SQL (voir e e u http://www.htm comme point d’entr´e pour de nombreuses r´f´rences). Il est ainsi possible a une application d’envoyer des messages vers une ` messagerie X400 ou vers une messagerie SMTP sans avoir a modifier le code applicatif. e ces ´changes se font g´n´ralement grˆce a un protocole r´seau sp´cifique au produit. Il permet d’adapter les appels a l’API ` JDBC au format d’´change avec le produit en question (par exemple MySQL). Cette sp´cification couvre e l’ensemble des APIs permettant de faire interagir le gestionnaire de transactions avec les parties impliqu´es dans le syst`me ex´cutant ces transactions potentiellement r´parties e e e e a savoir : l’application transactionnelle. ` 5. e e e a ` e e Connecteur d’acc`s au mail e L’autre connecteur de base propos´ dans J2EE concerne l’acc`s a la messagerie e e ` ´lectronique. Il est ainsi possible a partir d’une application J2EE d’envoyer des messages e ` ´lectroniques de fa¸on standard quelque soit le syst`me de messagerie sous-jacent. En effet. 5.4 Gestion des transactions La sˆ ret´ de fonctionnement est un souci constant pour les applications d’entreprise.4. e c e l’API JavaMail [Sun JSR-000904 2000] offre une API fournisseur permettant d’int´grer e l’adapteur ad´quat pour int´ragir avec le syst`me de messagerie choisi au d´ploiement e e e e de l’application.5. En effet. Ces s´quences ee e e e e sont encadr´es par des ordres de d´marcation des transactions : d´marrage d’une transace e e tion puis terminaison de celle-ci soit par une validation en cas de succ`s de la s´quence e e d’ex´cution encadr´e.1 Notion de transaction Les applications d’entreprise sont g´n´ralement dites critiques dans le sens o` elles e e u manipulent des informations dont on cherche a garantir la coh´rence dans le temps. Cela permet de manipuler ces ressources dites critiques (comme par exemple des bases de donn´es ou des e queues de messages) dans le cadre de s´quences op´ratoires (les transactions) garantissant e e les propri´t´s dites ACID (Atomicit´ / Coh´rence / Isolation / Durabilit´). GESTION DES TRANSACTIONS 121 ´changes n´cessaires avec de telles bases. un pilote JDBC d´di´ au produit base de donn´es a acc´der est charg´ e e e ` e e comme un connecteur dans l’environnement J2EE. ce type d’application ainsi que les syst`mes qui les supportent e e mettent en œuvre la notion de transaction [Gray and Reuter 1993].com/sql. u e Les transactions offrent un mod`le programmatique permettant de voir une application e comme une suite de transitions amenant les ressources g´r´es par celle-ci d’un ´tat coh´rent ee e e a un autre. Il sp´cifie come e ment une application peut acc´der a des capacit´s transactionnelles de fa¸on ind´pendante e ` e c e de l’implantation des ressources transactionnelles qu’elle utilise. e e e Cette fonction de l’environnement J2EE est d´finie par le standard JTA.jcc. avec la possibilit´ de revenir a tout moment a un ´tat coh´rent en cas d’´chec ` e ` ` e e e lors d’une telle transition.4. soit par une annulation en cas d’´chec. Pour ` e garantir cette coh´rence. Pour ce faire. le serveur J2EE h´bergeant cette application ` e et le gestionnaire qui contrˆle l’acc`s aux ressources partag´es (par exemple l’acc`s a o e e e ` . Les e ee ´changes se font donc sur la base d’´missions de requˆtes SQL vers la base et r´cup´ration e e e e e en retour d’appel (interaction synchrone).

hormis l’acc`s au statut de la transaction courante (op´ration getStatus). L’utilisation de ces m´canismes sort du e e contexte d’une utilisation standard et sont hors sujet pour notre pr´sentation de cette e fonction de l’environnement J2EE. Dans tous les cas. le e e syst`me transactionnel annule la transaction et affecte le statut annul´ au contexte trane e sactionnel courant.122 CHAPITRE 5. Dans le cas des transactions r´parties. Pour pallier le ` e e probl`me. si ce temps est expir´ avant la fin de la transaction. e e Pour manipuler de fa¸on coh´rente la d´marcation de transaction. les e e e op´rations de d´marcation seront par exemple appel´es a partir de la mˆme op´ration.2 Manipulation des transactions dans un serveur J2EE Un serveur J2EE fournit le moyen de manipuler des s´quences transactionnelles quel e que soit l’´tage dans lequel il est mis en œuvre. . et rollback pour l’annuler. e e Des interfaces de plus bas niveau sont fournies par le syst`me transactionnel de l’ene vironnement J2EE. validation ou annulation. Dans ce cas. Le d´marrage d’une transaction a pour effet d’associer une transaction au contexte e d’ex´cution courant (le thread courant). e e ` e commit pour la valider. ` 5. c’est a dire begin pour d´marrer une transaction. Ces op´rations de d´marcation sont souvent difficiles a manipuler dans le contexte e e ` d’une application. a n’importe quelle profondeur d’appel dans le code ainsi d´roul´. LA PLATE-FORME J2EE diff´rentes bases de donn´es). JTA d´finit les ine e e e terfaces n´cessaires a l’utilisation de ressources supportant le protocole XA (protocole de e ` validation a 2 phases). notamment dans le cadre du support des composants m´tier u e (support EJB) : en effet. Elles permettent par exemple de suspendre et r´activer des contextes e dans le cadre du contexte d’ex´cution courant. e e Le conteneur prend alors en charge le d´marrage de la transaction en d´but d’op´ration e e e et la terminaison de celle-ci en sortie d’op´ration : validation ou annulation suivant l’´tat e e d’ex´cution de l’op´ration. Enfin. l’interface UserTransaction fournit l’op´ration setRollbackOnly permettant de e e forcer une issue fatale pour la transaction courante. il est possible de sp´cifier qu’une op´ration est transactionnelle. C’est donc ce mˆme contexte e e qui doit ex´cuter l’op´ration de terminaison. L’environnement J2EE propose un moyen plus d´claratif et aussi plus e sˆ r pour les mettre en œuvre. qui permet d’effectuer les principales op´rations sur les trane sactions : les op´rations de d´marcation. la e e derni`re fonction fournie pour manipuler une transaction est la possibilit´ de lui associer e e un temps d’ex´cution maximal (op´ration setTransactionTimeout). il est conseill´ de c e e e la mettre en œuvre au niveau programmatique de mani`re tr`s localis´e. La d´marcation de transaction dans ce mod`le e e e n’a donc de sens que dans le cadre de ce contexte d’ex´cution.4. e e e ` e e Cela clarifie la d´marcation mais les probl`mes n´cessitant l’annulation de la transaction e e e peuvent n´anmoins intervenir dans n’importe laquelle des op´rations ex´cut´es entre ces e e e e bornes. Le syst`me transace e e tionnel peut avoir une valeur par d´faut (d´pendant de l’implantation) pour ce temps e e d’ex´cution. Le moyen standard utilis´ pour cela est e e l’interface UserTransaction.

– Le plus haut niveau (partie JSP) propose des m´canismes de cr´ation de pages HTML e e ou tout autres pages XML (XHTML. on retrouve le support des servlets qui offrent les m´canismes e programmatiques de base pour traiter des requˆtes r´seau venant de connexions IP e e (cf.5. C’est donc pour l’essentiel un support orient´ serveur.3 Mise en relation des composants J2EE avec le syst`me transace tionnel Pour les composants applicatifs s’ex´cutant dans le cadre d’un serveur J2EE.5 Programmation de l’´tage de pr´sentation Web e e L’´tage de pr´sentation de l’environnement J2EE fournit le moyen de g´n´rer des e e e e pr´sentations de type Web. c’est a dire produisant des pages HTML en r´ponse a des e ` e ` requˆtes HTTP. 2000. // d´marrage d’une transaction e . // actions transactionnelles systx. public void init(ServletConfig config) throws ServletException { systx = new InitialContext().. Les sp´cifications actuelles proposent e e e trois niveaux : – Au niveau le plus bas. Sun JSR-000116 2003].4.begin().. Cela se fait e e ee a travers l’interface JNDI. systx. Les APIs couvrant cette d´clinaison appartiennent au package e Java javax. sachant que ce gestionnaire y est enregistr´ sous le nom ` e java :comp/UserTransaction. Ce mod`le programmatique est d´fini e e par les sp´cifications des servlets. 5. L’acc`s a ce ` e e ` contexte JNDI peut n´anmoins s’op´rer dans n’importe quelle s´quence de code s’ex´cutant e e e e dans le cadre d’un serveur J2EE. figure 5. Le support fourni par J2EE pour l’´tage de pr´sentation se d´compose en une pile de e e e fonctions pr´sentant diff´rents niveaux d’abstraction. Les APIs e d´finissant ce support appartiennent au package Java javax. etc) a base de documents ` . } Cette liaison est faite ici a l’initialisation d’un composant de pr´sentation.lookup("java:comp/UserTransaction"). les e e` moteurs de servlets sont aussi capables de traiter des contenus statiques comme nous le verrons dans la suite. notamment e celle pour SIP [Handley et al. VoiceXML. PROGRAMMATION DE L’ETAGE DE PRESENTATION WEB 123 5.´ ´ 5.http. on retrouve la d´clinaison pour le protocole HTTP de ces e interfaces servlet. Outre leur capacit´ a traiter les pages dynamiques. D’autres d´clinaisons protocolaires existent. // validation de la transaction courante . il est e possible de r´cup´rer une r´f´rence vers le gestionnaire de transaction.servlet. Voici un exemple de r´cup´ration du lien vers le gestione e naire de transaction : UserTransaction systx.. L’int´rˆt est ici que la production de ces pages est effectu´e de fa¸on proe ee e c grammatique..servlet. WML.commit().8). offrant ainsi une dynamicit´ et une interactivit´ beaucoup plus importante e e sur le contenu produit que des fichiers statiques. e – Au-dessus de ce niveau. // Un composant \emph{servlet} se liant au gestionnaire de transaction // lors de son initialisation.

Nous d´taillons dans la suite les trois niveaux e ´num´r´s pr´c´demment. le conteneur prend en charge les liens r´seau sur lesquels les requˆtes et e e e les r´ponses vont ˆtre transmis (par exemple. javax. il charge le code des composants e e inclus dans le paquetage et met en place les chaines de liaison qui vont permettre d’activer ces composants a partir d’un discriminant qui lui est associ´ (par exemple une URL dans ` e le cas d’une servlet HTTP. et javax. LA PLATE-FORME J2EE type. Mˆme s’il est principalement utilis´ pour construire des pages e e HTML t´l´charg´es a travers HTTP.5. le support JSP est ind´pendant du protocole ee e ` e d’´change de pages avec le client. Nous pouvons citer par exemple STRUTS [The Apache Software Foundation 2005] qui est de loin le plus r´pandu. Les deux derniers packages contiennent des fonctions avanc´es am´liorant et/ou simplifiant la d´finition de pages JSP. section 5. sachant que la plupart des utilisateurs s’appuient sur le niveau e ee e e le plus haut. mixant le code HTML et le code Java pour la d´finition des parties dynae miques de ces pages. Elle pourrait n´anmoins ˆtre d´clin´e pour d’autres protocoles. Concernant le rˆle lors du d´ploiement. Il est donc par principe ind´pendant de HTTP.jsp.8. et active le composant servlet ad´quat e e e pour traiter ces requˆtes. e e e Les deux premiers niveaux d’abstraction sont couverts par la sp´cification des e servlets dans [Sun JSR-000154 2003]. le mod`le programmatique propos´ par les servlets e e e consiste a fournir un m´canisme de r´partition ou de d´multiplexage de requˆtes r´seau ` e e e e e vers l’objet servlet de traitement de cette requˆte (cf. La partie JSP dans sa d´finition d´pend du niveau servlet de base et est d´clin´e e e e e pour les servlets HTTP. Ils sont largement utilis´s mais non stane dard. Le niveau JSP est couvert par une sp´cification e compl´mentaire dans [Sun JSR-000152 2003]. ou encore JSF qui est standardis´ dans le cadre de J2EE e e [Sun JSR-000127 2004].jsp.tagext.jsp. ouverture d’un canal TCP/IP sur le port e e 8080 dans la figure 5.war. Il encapsule ensuite ces requˆtes et r´ponses r´seau dans des objets e e e respectant les interfaces sp´cifi´es par les servlet. que ce soit a base du standard JSP au d’autres moteurs de templates comme ` XMLC propos´ par le consortium ObjectWeb [Objectweb Enhydra 2005].8 montrant le d´multiplexage e e . Dans le cas du conteneur de composants Web.124 CHAPITRE 5.1.4). par e e e e exemple WTP pour le monde mobile WAP.el. e 5. e e mˆme s’il contient aussi une d´clinaison pour HTTP. A l’ex´cution.servlet. figure 5. Des canevas loe giciels d’encore plus haut niveau et bas´s sur le patron architectural mod`le/vue/contrˆleur e e o (MVC) pour les interfaces graphiques existent.servlet. 5.servlet.1 Principes d’architecture des composants de pr´sentation Web e Les principes de base des composants J2EE est qu’ils sont pris en charge par un environnement de d´ploiement et d’ex´cution qui leur est d´di´ et qu’on appelle conteneur e e e e (cf. le conteneur prend en charge un paquetage o e dont le format lui est sp´cifique.2 Servlets : organisation de la pile protocolaire En premi`re approximation. e Il y a ´videmment des d´pendances fonctionnelles des niveaux les plus hauts vers ceux e e du dessous. A partir de ce paquetage. Les APIs relevant du support e e JSP appartiennent aux packages Java javax.5. il s’agit e g´n´ralement de paquetage .

– L’en-tˆte de la requˆte e e Il contient un certain nombre d’adresses r´seau telles que celles de la machine client e d’o` provient la requˆte (machine a l’origine de la requˆte ou le dernier proxy l’ayant u e ` e relay´). nom DNS). Une fois ce d´multiplexage ef` e e fectu´ par le moteur de servlets.. Ce protocole est donc pris en charge avec une architecture de pile conforme a la sp´cification servlet que nous ` e . Ces adresses permettent de traiter diff´remment e e les messages suivant le chemin qu’ils ont emprunt´. PROGRAMMATION DE L’ETAGE DE PRESENTATION WEB 125 Figure 5. le port. le message a traiter ainsi que le mese e ` sage de r´ponse sont abstraits par le mod`le au travers de deux interfaces permettant leur e e manipulation. beaucoup concernent l’adressage r´seau. Ces deux interfaces donnent ` acc`s a la fois aux informations d’en-tˆte des messages requises par les servlets et aux e ` e contenus de ces messages.1). a savoir ServletRequest et ServletResponse. la servlet s´lectionn´e est activ´e pour op´rer le traitement e e e e e grˆce a l’op´ration service. et le nom de la e e e machine en question (i. soit au-dessus de UDP/IP (par exemple HTTP/1. identifi´ par le nom et la e e e version identifiant le protocole applicatif mis en œuvre. soit au-dessus de TCP/IP. De telles adresses e sp´cifient g´n´ralement trois informations de base : l’adresse IP. e e nous retrouvons aussi le protocole utilis´ par la requˆte.8 – Le d´multiplexage des composants de pr´sentation (servlets) e e a deux niveaux effectu´ par un conteneur de servlet HTTP). celle de la machine serveur (la machine a qui ´tait destin´ le message a l’orie ` e e ` gine).´ ´ 5. ` Gestion d’une requˆte de servlet (interface ServletRequest) e Parmi ces informations. Nous verrons par la suite qu’il existe aussi des m´canismes a ` e e pour intervenir sur ce processus de demultiplexage.5. Elles d´terminent donc les principes de bases de construction e d’une pile protocolaire a base de servlet. Parmi ces informations d’en-tˆte.e. Concernant l’op´ration de traitement de requˆte. ou encore celle de la machine de traitement (la machine sur laquelle l’op´ration e de service s’ex´cute actuellement).

ou encore e leur ´num´ration. Cette e e a gestion autorise la cr´ation. Une autre information donne le type de ce contenu qui est un type MIME. l’en-tˆte de la r´ponse (contenant notamment la taille de la r´ponse) est e e e ´videmment ´mis a ce moment l`. e – Des attributs associ´s a la requˆte e ` e Au cours des phases de traitement de la requˆte. Une autre information sp´cifie le e e e type de cette r´ponse qui est un type MIME. Enfin. Les donn´es du tampon sont alors ´mises vers e e e e e le client soit lors d’une demande explicite (op´ration flush). et celles permettant de contrˆler le flux e o d’informations li´ au contenu retourn´ au client de la servlet. on donne le moyen de produire e cette r´ponse. e e Gestion d’une r´ponse de servlet (interface ServletResponse) e Les informations g´r´es dans le cadre d’une r´ponse sont pour l’essentiel de deux ordres : ee e celles qui concernent le contenu de cette r´ponse. la figure 5. le type d’encodage de e l’information est aussi d´fini. La e e c e ` e premi`re est la taille du contenu de la r´ponse. ou qui est nul dans le cas o` il n’est pas connu. soit a travers la lecture d’un flux binaire. e e ` a Organisation du conteneur et cycle de vie des servlets Pour finir de d´finir les principes de base des servlets. Il est important de noter que toutes les m´ta-informations associ´es a la e e ` r´ponse (cf. e c’est a dire charger la classe associ´e et cr´er une instance qui est alors li´e a un ` e e e ` chemin d’activation (cf. m´canisme de d´multiplexage). Dans le cas de r´ponse de grande taille. la modification. comme par exemple e e le renvoi d’une image. il est possible de d´finir la taille du tampon utilis´ e e e e pour g´rer les donn´es de r´ponse. Enfin. Pour cela. soit lorsque ce tampon e est plein. ainsi que la mani`re dont celle-ci est pilot´e par son conteneur. La premi`re est la taille du contenu du e e e message. Il permet de d´ployer une servlet. e e – Le contenu de la r´ponse e Il est repr´sent´ par plusieurs informations de fa¸on sym´trique a une requˆte. point pr´c´dent) doivent avoir ´t´ d´finie avant la premi`re ´mission . Dans le cas d’un contenu de type texte. LA PLATE-FORME J2EE sommes en train de d´crire. Dans le cas d’un contenu de type texte.126 CHAPITRE 5. il est possible de g´rer des ate e tributs permettant de caract´riser la requˆte vis-`-vis des phases suivantes. cette figure pr´sente les trois structures de base de l’architecture de servlet : e – Le conteneur de servlets Le conteneur remplit deux fonctions majeures. on donne le moyen d’acc´der u e a ce contenu. cela permet de ne pas saturer la m´moire du serveur pour le e seul b´n´fice de la requˆte en question (un serveur peut g´rer un nombre important de e e e e requˆtes simultan´es).9 nous montre le cycle e de vie d’une servlet. la destruction d’attributs. soit a travers l’´criture d’un flux binaire. soit a travers la lecture d’un ` ` ` flux de caract`res. le type d’encodage de e l’information est aussi d´fini. soit a travers l’´criture d’un e ` e ` e flux de caract`res. En e e fait. C’est a ce moment-l` que e e ` a . e – Le contrˆle du flux d’informations renvoy´s au client o e Un point important est la possibilit´ de g´rer le flux de donn´es ´mis vers le client e e e e auquel la servlet r´pond. e e e ee e e e en effet. e – Le contenu de la requˆte e Il est repr´sent´ par plusieurs informations.

Le conteneur cr´e alors une chaˆ de filtres pour chaque servlet qui a e ıne ´t´ d´ploy´e et ex´cute cette chaˆ lors de chaque activation d’un traitement de requˆte. Filtres de servlets Il est possible d’associer des filtres pour effectuer des traitements pr´alablement a e ` l’ex´cution d’une servlet.9 – Le cycle de vie des servlets la m´thode init est appel´e par le conteneur pour initialiser la servlet en question. le conteneur peut l’activer e e au rythme qu’il juge bon (invocation de service en parall`le). a ce moment-l`. u e e Ces filtres doivent au pr´alable avoir ´t´ enregistr´s aupr`s du conteneur et associ´s a une e ee e e e ` ou plusieurs servlets. Il permet aussi de de manipuler le syst`me de d´multiplexage (par exemple. e – La servlet Une fois qu’une servlet est prˆte (initialisation termin´e). PROGRAMMATION DE L’ETAGE DE PRESENTATION WEB 127 Figure 5. Le rˆle du conteneur est alors d’encapsuler ce message dans les interfaces o telles que pr´sent´es pr´c´demment. de d´terminer le contexte dans lequel se trouve la servlet a laquelle le e ` traitement du message est d´l´gu´. Comme au niveau e contexte. ainsi bien sˆ r que sur la r´ponse qui doit ˆtre produite par la servlet.´ ´ 5. e e e e Il offre aussi a ces servlets de g´rer un ensemble d’attributs qui leur permettent ` e de partager des informations (communication entre servlets). et a partir d’informations r´cup´r´es dans ce e e e e ` e ee message. le conteneur peut ´liminer e `e e c e e une servlet . ee e – Le contexte de servlets Un contexte contient un certain nombre de servlets qui y ont ´t´ d´ploy´es auxquelles ee e e un nom est associ´e et qui permet d’identifier celle-ci dans le contexte. Ces filtres peuvent agir sur les donn´es d’entˆte li´ a une requˆte e e e e` e que sur son contenu. ee e e e ıne e . retrouver une servlet d’un e e nom donn´ ou le contexte auquel elle appartient).5. Au contexte e lui-mˆme est associ´ un nom qui sert de pr´fixe lors du processus de d´multiplexage. il appelle destroy et l’instance de la servlet est alors ` a ramass´. De fa¸on sym´trique. la servlet g`re aussi un ensemble d’attributs accessible aux requˆtes trait´es e e e par service. e e Elle est alors prˆte a ˆtre activ´e. L’autre fonction concerne l’activation de la servlet lors de l’arriv´e d’un e e message.

Elle introduit en plus une notion suppl´mentaire permettant de e e g´rer des informations communes a une suite d’´changes HTTP. e C’est la partie chemin qui sert au processus de d´multiplexage mis en œuvre par le e conteneur de servlets. la notion de session. cette ressource peut ˆtre utilis´e soit pour agir a la place de la servlet a e e ` en cours d’ex´cution (voir la m´thode forward). Dans le cas d’un forward. Les servlets qu’elle contient sont ensuite cr´´es dans ce contexte o` leur est ee u associ´ un nom d´fini lui aussi dans le descripteur de d´ploiement .infosupp]?requ^te] e Par exemple. aucune information ne doit avoir ´t´ ee envoy´e au client par la servlet au moment de son activation (g´n´ration d’une exception).com et qu’il attend e les requˆtes HTTP sur le port 8080. e e e 5. il est possible d’utiliser d’autres ressources d’ex´cution e e permettant de d´l´guer tout ou partie son traitement : les RequestDispatcher. Le chemin identifiant la ressource Web a invoquer e ` est /a1/w2/s1.war d´finit un contexte e e e e associ´ a la racine /a1/w2 (racine d´finie dans le descripteur de d´ploiement contenu dans e` e e le paquetage). Une telle URL est de la forme : e http://machine[:port]chemin[[. LA PLATE-FORME J2EE Contrˆle du d´multiplexage o e Lors de l’ex´cution d’une servlet. u e D´multiplexage de requˆtes HTTP e e Comme nous l’avons expliqu´ pr´c´demment.monsite. Dans le cas de requˆtes HTTP. soit pour inclure une partie de la page e e (voir la m´thode include) g´n´r´e par cette servlet (par exemple un bandeau commun a e e ee ` toutes les pages d’un site). lors du d´ploiement d’une application Web (contenant e en ensemble de servlets a d´ployer). puis la servlet concern´e e e dans cette application. Par ` e exemple. l’URL http ://www. elle d´finit un contexte auquel est associ´ un nom ` e e e correspondant a la racine du chemin de d´multiplexage des servlets qu’elle contient. En effet.com :8080/a1/w2/s1 ?p1=val1&p2=val2 permet d’activer une des servlets de la figure 5. permet de dire que cette c e ressource Web est une requˆte a laquelle est pass´e deux param`tres p1 et p2 auxquels e ` e e sont respectivement associ´s les valeurs val1 et val2 (ces param`tres sont transform´s en e e e attributs de la requˆte HttpServletRequest construite par le conteneur). il y a dans le cas pr´sent e e e e une seule servlet appel´e s1. Nous observons dans cet exemple qu’un conteneur de servlets HTTP est pr´sent sur la machine www. Ces resee sources peuvent ˆtre r´cup´r´es par la servlet aupr`s du conteneur a partir du nom auquel e e ee e ` est associ´ la ressource en question. la figure 5. Le reste de l’URL.8 montre que le e e e support de servlets doit d’abord d´terminer l’application Web.128 CHAPITRE 5.8. Le d´multiplexage s’appuie sur le d´codage d’URL invoqu´e par la e e e requˆte HTTP. Elle expose notamment toutes les informations d’en-tˆte et de contenu relatives aux ´changes HTTP et n´cessaires au traitement e e e de ce type de requˆte. le d´ploiement de l’application Web sp´cifi´e par w2.5. Le processus de d´multiplexage consiste donc a rechercher un e e ` . bien e ` e utile dans la mesure o` HTTP est un protocole sans ´tat.3 Servlets HTTP L’extension des interfaces servlet pour le support du protocole HTTP suit ´videmment e les principes de construction d’une pile de servlets. commen¸ant au caract`re ?. e A partir de l`. le processus de d´multiplexage des e e e e requˆtes se fait en deux ´tapes.monsite.

la requˆte s’il y en a une (ce qui suit ?). e – La session. les informations suppl´mentaires s’il y en a e e e e (ce qui est entre .5. ayant en param`tre les objets repr´sentant e e e e la requˆte et la r´ponse. soit dans les informations suppl´mentaires de l’URL e d’invocation (cf. le code e e e de statut de la r´ponse. celle-ci est cr´´e par le conteneur. . chaine de caract`res. Gestion d’une r´ponse HTTP (interface HttpServletResponse) e Par rapport a une r´ponse de servlet de base. PROGRAMMATION DE L’ETAGE DE PRESENTATION WEB 129 contexte dont le nom correspond a un pr´fixe du chemin d’une URL puis a rechercher dans ` e ` ce contexte une servlet dont le nom correspond au reste du chemin auquel on a soustrait ce pr´fixe. Par ailleurs. e e e e s’il n’y en a pas encore. partie de l’URL entre . e – Les param`tres d’en-tˆte HTTP. etc. Il s’agit de param`tres pass´s en en-tˆte de la e e e e e requˆte HTTP sp´cifiant par exemple des dates ou des informations sur les langues e e support´es par l’utilisateur. a savoir doGet pour une requˆte e ` e GET. Ces op´rations e e e ont la mˆme signature que l’op´ration service. des param`tres d’en-tˆte. Elle est transport´e dans la requˆte e e e e soit sous la forme d’un cookie. Il s’agit de la session dans laquelle cette requˆte s’ex´cute. En g´n´ral. e e Gestion d’une requˆte HTTP (interface HttpServletRequest) e Les informations mises a disposition par cette interface correspondent aux donn´es ` e v´hicul´es par une requˆte HTTP. – Les cookies. e Dans le premier cas. et ?). ou encore le nom du e contexte de la servlet). Elles sont pour l’essentiel introduites dans le cadre des e interfaces de manipulation des requˆtes et des r´ponses. Il s’agit de tous les cookies qui ont ´t´ envoy´s par le client dans la ee e requˆte. il s’agit de d´finir dans la r´ponse les cookies retourn´s. e Nous n’allons pas d´tailler les informations relatives a HTTP mais simplement rappeler e ` bri`vement en quoi elles consistent. et ?). et notamment : e e e – Les informations sur l’URL.´ ´ 5. doPost pour une requˆte POST. On peut r´cup´rer ces valeurs sous diff´rentes formes e e e e telles que entier. Cela peut aussi consister a retourner e e e ` directement une r´ponse d’erreur ou une r´ponse de redirection de la requˆte vers une e e e autre URL. soit de e e e formatter les URL diffus´es dans le contenu. Cette information n’est ee pas d´finie par HTTP (sp´cifique aux servlets). Il s’agit du nom de l’utilisateur a l’origine de la requˆte s’il a ´t´ ` e ee authentifi´. Il s’agit de toutes les informations relatives a l’URL ` d’invocation et plus particuli`rement les ´l´ments qui la compose tels qu’ils ont ´t´ e ee ee d´finis pr´c´demment (URI ou chemin. e – L’utilisateur. cette interface donne acc`s a des ` e e ` op´rations permettant soit de formatter l’en-tˆte du message de r´ponse HTTP. date (long). la classe abstraite e e HttpServlet propose un raffinement de l’op´ration service en appels vers des op´rations e e correspondant aux actions d´finies par le protocole HTTP. doHeader pour une requˆte HEADER. correspondant a des extensions des e e ` interfaces pr´alablement d´finies par les servlets de base.

5. Notons qu’une e e e session est li´e au contexte d’une application Web (par exemple /a1/w2 dans notre exemple e d’URL). et les requˆtes et les r´ponses permettant de g´rer les flux d’informations e e e li´s a ces protocoles. Une session d´finit un contexte compos´ dans un ensemble modifiable d’attributs euxe e mˆmes modifiables. LA PLATE-FORME J2EE Dans le second cas. o` les ` e e u ´l´ments architecturaux de base qui sont sp´cialis´s sont la servlet repr´sentant du protoee e e e cole applicatif. modifications). Elle permet de maintenir un contexte d´di´ aux ´changes entre un utilisateur et l’application Web a e e e ` laquelle il acc`de. L’identificateur de cette session doit donc ˆtre communiqu´ lors de e e e chaque interaction de l’utilisateur avec l’application. l’identificateur de la session qui lui e e est associ´e. e . En effet. Or la production de telle e page de fa¸on programmatique est un exercice laborieux. Les servlets HTTP offrent pour cela deux m´thodes que nous avons d´j` introduites auparavant : e ea – Par ´change de cookie : lors de la premi`re interaction avec l’application Web.130 CHAPITRE 5. Cela signifie que cette session n’est pas connue si on invoque une servlet d’un autre contexte. Le e e protocole des cookies.4 JSP : construction de pages HTML dynamiques Dans la plupart des utilisations des servlets actuelles. donnant ainsi acc`s a une vision conceptuelle plus ´labor´e des ` e ` e e informations de session. Cela nous ram`ne donc a la solution pr´c´dente puisque chaque nouvelle e e ` e e interaction avec l’application passe alors par une URL contenant l’identificateur de session. e e e Cela clˆt la description de l’environnement d’ex´cution de servlets du point de vue de o e l’encapsulation de couche protocolaire a travers des APIs sp´cialis´es par protocole.println("<tag>mon ` contenu</tag>"). Par exemple. mis en œuvre par les navigateur Web. il est aussi possible d’observer les ´v´nements du cycle de vie d’une session (cr´ation. e permettant ainsi de g´rer des sessions mˆme si l’utilisateur a d´sactiv´ les cookies dans e e e e son navigateur par exemple. il s’agit d’op´rations qui permettent d’encoder les informations de e session dans les URL de dialogue diffus´es dans les pages de r´ponse. Cette approche permet d’´viter le passage par les cookies. il est possible de r´f´rencer un composant m´tier session e ee e a partir d’un tel attribut. ` – Par r´´criture des URL : cette m´thode consiste a encoder dans toutes les URL ee e ` diffus´es dans les pages demand´es par le client. e ` 5. Gestion de session HTTP La notion de session est l’ajout majeur de la couche servlet HTTP. le e e conteneur cr´e une session et renvoie son identificateur dans la r´ponse au client. le contenu de la r´ponse e se mat´rialise sous la forme d’une page HTML ou XML. permettant ainsi de e e transporter syst´matiquement cette information entre le client et le serveur pour toutes e les interactions les concernant. la production des c parties statiques consiste a aligner des lignes de code du type out. destruction. Le point important vis-`-vis des interfaces de manipulation de session est qu’elles a sont ind´pendantes de l’une ou l’autre des solutions pr´sent´e ci-dessus. assure ensuite que le client diffuse a l’application ce cookie lors de chaque nouvelle interaction. comme pour les servlets. Enfin. dont la lisibilit´ est plus que douteuse.

La directive suivante affecte la propri´t´ localisation du mˆme bean (appel ee e de la m´thode setLocalisation de la classe MaDate d´finie ci-dessous). Stearns 2000a. Cela sort du sujet du pr´sent chapitre dont l’objectif e est de pr´senter les principes des technologies fournies par l’environnement J2EE. Lors e e de chaque interaction avec cette servlet. L’exemple suivant nous montre une page JSP qui affiche la date du jour. Nous e ne les pr´sentons donc pas. au d´ploiement d’une page e e e JSP. e D’autres m´canismes sont aussi offerts par JSP. e . B. le conteneur g´n´re la classe servlet correspondante. En effet. e e <%@ page contentType="text/html.. Nous pouvons voir que le format de la page JSP est sp´cifique (ni HTML. } } Notons que le code d’une page JSP peut acc´der a toutes les informations de l’envie ` ronnement de servlet et a donc acc`s a toutes les APIs de ce dernier.5. Cela e e offre une grande souplesse notamment en phase de d´veloppement. la compile et la charge.´ ´ 5.. e ` ` package monorg. charset=UTF-8" %> <html> <head><title>La date</title></head> <body bgcolor="white"> <jsp:useBean id="date" class="monorg. on r´cup`re e e e e la chaine de caract`res correspondant a la date a afficher par l’instruction ${date. Si ce n’est pas le cas.date}. PROGRAMMATION DE L’ETAGE DE PRESENTATION WEB 131 L’environnement servlet propose de rem´dier a ce probl`me a l’aide du m´canisme de e ` e ` e JSP. Enfin. e ` Les pages JSP sont d´ploy´es comme des servlets.. Les JSP sont des patrons de pages contenant des contenus statiques dans leur forme final (le <tag>mon contenu</tag> de l’exemple pr´c´dent). L’´change d’information e e entre l’environnement JSP et l’environnement Java du serveur passe par l’utilisation du patron JavaBeans [B. } public String getDate() { return . le conteneur v´rifie que la servlet est plus jeune e que la page JSP associ´e. il existe e e une d´clinaison pure XML de ces mˆmes pages. le conteneur met a jour la classe servlet. et d´finissant des contenus e e e dynamiques a partir de directives donnant acc`s au code Java permettant de manipuler ` e les objets m´tiers de l’environnement du serveur d’application. N´anmoins. class MaDate { public setLocalisation(String loc) { .. Stearns 2000b].date} </body> </html> Nous observons aussi les ´changes avec le monde Java par l’utilisation d’un bean. ni XML).MaDate"/> <jsp:setProperty name="date" property="localisation" value="French"/> <b>Nous sommes le : </b>${date. et notamment les tags et les librairies de e tags ainsi que le langage d’expression. e ` supprime les anciennes instances et en recr´e de nouvelles pour traiter les requˆtes. La e directive JSP useBean cr´e un bean de la classe donn´e en param`tre et l’affecte a la e e e ` variable date.

ou de type appel de e e e proc´dures a distance (en anglais Remote Procedure Call (RPC)). ee L’environnement EJB fournit l’ensemble des services syst`mes n´cessaire au support e e d’un premier niveau de sˆ ret´ de fonctionnement (par exemple la persistance ou les transacu e tions). Il charge le code e de ces composants m´tier et les rend aptes a ˆtre li´s a d’autres composants afin qu’ils e ` e e ` puissent ˆtre activ´s (appels synchrones ou asychrones). On retrouve un conteneur EJB qui prend en charge le d´ploiement et l’ex´cution e e des composants m´tier. ils permettent des e e communications dites asynchrones (envoi d’une requˆte sans attente de r´ponse). Pour tous les types de composants m´tier. La description de ce e mod`le fait l’objet de cette section dans laquelle nous allons ´tudier les trois ´l´ments e e ee principaux de ce mod`le : composants de session.1 Principes d’architecture des composants m´tier e Comme pour les composants de pr´sentation (cf. Ces moyens permettent d’une part des communications e dites synchrones (´mission d’une requˆte avec attente de r´ponse).132 CHAPITRE 5. 1998] : e – La premi`re action consiste a exporter les r´f´rences a ces composants d´ploy´s sous e ` ee ` e e un nom discriminant dans un espace de noms associ´ a l’application en cours de e ` . D’autre part. L’objectif est ici de pouvoir e r´gler l’allocation de ressources pour optimiser les performances d’une application. les principes d’archie tecture des composants J2EE se d´clinent dans le cadre des composants m´tier (cf. figure e e 5. ee e e o e Il fournit d’autres m´canismes syst`mes permettant d’optimiser la gestion des rese e sources mises en œuvre pour l’ex´cution d’une application.1). e e ` Tous ces m´canismes de communication sont d´crits plus en d´tail dans la section 5. Au d´ploiement. section 5.3.1 de la sp´cification servant e de r´f´rence pour la description faite dans cette section. il offre des moyens de communication de haut niveau permettant d’int´grer e des applications J2EE r´parties.6 Programmation de l’´tage m´tier e e L’´tage m´tier de l’environnement J2EE fournit le moyen de programmer la logique e e m´tier d’une application orient´e serveur en lui assurant les propri´t´s g´n´ralement e e ee e e n´cessaires aux applications d’entreprise. Cette phase de mise en aptitude e e a la liaison proc`de de deux actions et met en œuvre le patron d’architecture export/bind ` e comme utilis´ dans [Dumant et al.6. ou plus pr´cis´ment aux applications dites crie e e tiques (en anglais mission-critical applications). la gestion du cycle d’ale e location et de lib´ration d’instances est sous le contrˆle du conteneur. e Enfin.2. le conteneur prend en charge des paquetages sp´cifiques qui sont des e e . e e e L’objectif du mod`le de programmation est de rendre la mise en œuvre de ces diff´rents e e m´canismes aussi transparente que possible pour le programmeur. e e 5. Il peut s’agir ici soit e ` de RMI (Remote Method Invocation ou support d’objets r´partis pour Java).10). LA PLATE-FORME J2EE 5. C’est l` un point e o a majeur puisque c’est a partir de cet ancrage que le serveur va pouvoir optimiser la gestion ` des ressources.5. soit de Web e Services (appel de proc´dures distantes bas´ sur XML).jar avec une structure et des informations pr´cises (cf. la version 2.2). composants de donn´es (appel´s aussi e e e composants entit´). Il est d´finit par la sp´cification EJB e e (Entreprise Java Bean) [Sun JSR-000153 2003]. et composants r´actifs. C’est e e g´n´ralement le support JMS (Java Messaging Service) qui est mis en œuvre a cette fin. ou de propri´t´s de s´curit´ (par exemple l’authentification ou le contrˆle d’acc`s). section 5.

3 ´quivalent au bind). Nous d´taillons cela dans les e e e e e sections qui suivent pour chaque cat´gories de composants m´tier. le comportement fonctionnel est diff´rent suivant qu’on e e appelle une op´ration m´tier sur l’objet d’interposition ou sur l’instance du composant.´ ´ 5. e e . les composants vont pouvoir acc´der aux composants auxquels ils sont li´s a e e en effectuant la phase de liaison effective (phase de bind) dans le code applicatif (voir code utilisant lookup dans la section 5. cette interception n’est pas transparente dans e le mod`le de programmation. Il prend aussi en charge les aspects e e e techniques associ´s a ces composants comme l’activation de transactions. A partir de l`. de fa¸on distante (appel a distance). Cela se fait a l’aide d’un annuaire d´di´ accessible par JNDI. e ` e e – La deuxi`me action consiste a exporter les d´pendances de ces composants dans un e ` e espace de noms associ´ au composant lui-mˆme et a y associer la r´f´rence vers le e e ` ee composant auquel se lier grˆce a son nom dans l’espace de nommage de l’application. Notons que cette phase est e prise en charge par le conteneur dans la version 3 des EJB (injection des r´f´rences par le ee conteneur dans une variable du code du composant) et devient donc transparente pour le code applicatif. e e La figure 5.6. le conteneur prend en charge le fait que le composant est activ´ de e e fa¸on locale (appel a l’int´rieur de la mˆme JVM). ou les ´changes de donn´es avec un espace de s´curisation des e e e e e donn´es (en g´n´ral une base de donn´es relationnelles). a ` Rappelons que le d´couplage en deux actions permet de rendre le code ind´pendant e e du processus d’assemblage (pas de lien dans le code avec un composant particulier).10 – Les principes d’architecture d’un composant m´tier EJB e d´ploiement. Malheureusement. ou c ` e e c ` sur arriv´e d’un ´v´nement (messagerie asynchrone).2. A l’ex´cution. La sp´cification fait l’hypoth`se architecturale qu’il existe un e e e objet d’interception ind´pendant de l’instance du composant m´tier.10 nous montre que le conteneur met en œuvre du code (pour g´rer les e aspects techniques qu’il supporte de fa¸on transparente au code applicatif) par interception c des appels aux interfaces m´tier des composants (seulement pour les composants de session e et les composants entit´). cet objet implantant e e l’interface m´tier. PROGRAMMATION DE L’ETAGE METIER 133 Figure 5. la v´rification e ` e de contraintes de s´curit´. Dans ce cas.

6. Contexte de l’instance dans la figure 5. 1994]. g´n´ralement a travers un navigateur Web. les composants de session ont pour objectif de repr´senter une session d’utilisation de l’application au niveau du e serveur. Cette e e contrainte sp´cifi´e par le mod`le de composant session des EJB sert de garde-fou pour e e e la mise en œuvre de session Web (contexte d’ex´cution mono-programm´ dont le come e portement correspond a un enchainement s´quentiel d’une page HTML dynamique a une ` e ` autre). En effet. l’instance du composant n’implante pas l’interface m´tier. d’autres interactions e e e exsitent entre le conteneur et les composants qu’il g`re. parmi les r`gles de bonne utilisation de J2EE. e e 5.2 Composants de session Comme leur nom l’indique. Outre le code d’interposition d´finie dans le paragraphe pr´c´dent. de travail ee e coop´ratif ou de jeux en r´seau impliquant potentiellement plus de deux utilisateurs. LA PLATE-FORME J2EE Pour se pr´munir de mauvaises manipulations entre objet d’interception et instance de e composant. e e Sessions sans ´tat e Les sp´cifications EJB distinguent deux types de composants de session : les compoe sants de session sans ´tat et ceux avec ´tat. En ¸ effet. ` ` . Ces processus peuvent ˆtre mis en œuvre e e e localement ou a distance a l’aide de RMI ou de Web Services. les composants session sont souvent utilis´s pour e mettre en œuvre le patron d’architecture Facade introduit dans [Gamma et al. Etant donn´ que l’utilisation de l’environnement J2EE ambitionne pour l’essentiel e le support des applications Web. de telles sessions impliquent un utilisateur unique. Concernant la premi`re cat´gorie. e e e Cela simplifie notamment l’utilisation de ce code dans un contexte r´parti. Elle n’est pas contraignante vis-`-vis des autres aspects techniques pris en charge a (il supporte g´n´ralement la multi-programmation) par ces composants et pourrait donc e e ˆtre facilement lev´e pour traiter d’autres types de session. Enfin. Cette contrainte est lev´e dans la version 3 de la sp´cification des e e e EJB. C’est le cas par exemple des sessions de discussion interactives de type chat ou de t´l´phonie impliquant deux utilisateurs. elle sert a e e e e ` supporter des processus m´tier sans m´moire. Cela lui permet d’acc´der par e e exemple au contexte de s´curit´ dans lequel elle s’ex´cute ou encore d’acc´der a certains e e e e ` services (service transactionnel ou service d’´ch´ancier). e e ` Dans le cadre des applications Web. on retrouve souvent ce patron qui e permet de pr´senter un point d’entr´e unique aux applications utilisant ce code m´tier. voir des sessions de conf´rence. en limitant le e nombre d’objets qui peuvent ˆtre engag´s dans des interactions a distance.134 CHAPITRE 5. un composant acc`de au contexte dans lequel une de ces instances ` e s’ex´cute (cf.10). Le conteneur a en effet la charge e du cycle de vie des instances de composant et signale a ces instances tout ´v´nement ` e e relatif a ce cycle. le mod`le d’application Web correspond a l’interaction entre un utilisateur unique e ` et l’application qu’il utilise. Cela ´vite de diffuser e e une instance d’un composant (diffusion de this) comme un objet supportant l’interface m´tier du composant. d’un point de vue conceptuel. e e ` L’unicit´ de l’utilisateur dans le cadre d’une session applicative est un des d´fauts mae e jeurs du mod`le car d’autres formes de sessions existent o` peuvent interagir plusieurs e u utilisateurs.

une exception est lev´e par le contee` e neur.´ ´ 5. – Supports : si le thread appelant l’op´ration avec ce comportement transactionnel est e associ´ a un contexte transactionnel. Pour les transactions.6. ` . cette op´ration s’ex´cute dedans sans toucher e` e e a l’association entre le thread et le contexte transactionnel. l’op´ration s’ex´cute dans e e e e le contexte transactionnel courant sans toucher a l’association entre le thread et le ` contexte transactionnel. celui-ci est suspendu le temps d’ex´cuter e ` e cette op´ration. Diff´rents comportements e ` e e transactionnels peuvent ˆtre d´finis : e e – NotSupported : si le thread appelant l’op´ration avec ce comportement transactionnel e est associ´ a un contexte transactionnel. PROGRAMMATION DE L’ETAGE METIER 135 Figure 5. un nouveau contexte est activ´ le e ` e temps d’ex´cuter cette op´ration.11. – RequiresNew : le thread appelant l’op´ration avec ce comportement transactionnel e suspend le contexte transactionnel courant s’il existe et associe un nouveau contexte transactionnel le temps d’ex´cuter cette op´ration. e e Deux aspects techniques peuvent ˆtre pris en charge pour ces composants : le supe port des transactions et le support de l’acc`s distant. Dans le cas contraire. un composant de session sans ´tat est relativement e primitif dans son fonctionnement. le niveau de e transparence offert permet de caler la d´marcation transactionnelle sur l’activation d’une e op´ration de l’interface d’un composant : le d´marrage de la transaction s’op`re a l’ape e e ` pel de l’op´ration et la terminaison a la sortie de l’op´ration. Leur cycle de vie contient deux ´tats : l’´tat ee e e non allou´ ou non existant et l’´tat prˆt dans lequel les op´rations de son interface m´tier e e e e e peuvent ˆtre activ´es. e – Required : si le thread appelant l’op´ration avec ce comportement transactionnel e n’est associ´ pas a un contexte transactionnel. e e – Mandatory : si le thread appelant l’op´ration avec ce comportement transactionnel e n’est pas associ´ a un contexte transactionnel. Des instances sont allou´es pour effectuer des op´rations e e dans le cadre d’une session et lib´r´es ensuite.11 – Le cycle de vie d’un composant m´tier EJB de session sans ´tat e e Comme le montre la figure 5.

figure 5. Cette ´tape. correspondant a un nouvel ` e e e ` ´tat dans le cycle de vie du composant de session (cf.rmi. il est explicite dans le mod`le de programe e mation : l’interface m´tier doit ´tendre l’interface java.12). une exception est lev´e par le conteneur. La diff´rence est qu’ils poss`dent une m´moire li´e e e e e e a l’activit´ d’une session. implique que lors d’une e . les instances e de ce type de composant sans ´tat ont tendance a avoir une dur´e de vie courte.12 – Le cycle de vie d’un composant m´tier EJB de session avec ´tat e e Etant donn´es les propri´t´s que doivent supporter ces composants. ces instances ont tendance a avoir une dur´e de vie ` e ` e plus longue que celles sans ´tat.3. Sessions avec ´tat e Les composants de session avec ´tat supportent exactement les mˆmes fonctions et e e aspects techniques que ceux sans ´tat. e e e Le coˆ t d’allocation d’une instance de composant de session peut ˆtre important.136 CHAPITRE 5. les instances d’un tel composant ont une identit´ e e propre Figure 5. e e comme ca peut ˆtre le cas pour les composants de session avec ´tat d´crit dans la section ¸ e e e suivante.3. Par ailleurs. Cette dise tinction faite dans le mod`le de programmation entre interface m´tier locale et distante e e est tr`s contraignante.Remote. Cette approche est possible e ¸ parce que ces composants sont sans ´tat et qu’il n’ont donc pas d’´tat initial implicite. notamment lorsque ce type de e o composant est utilis´ avec le patron d’architecture Facade. e` e Concernant le support des acc`s distants.rmi. les m´thodes d´finies e e e e par l’interface m´tier devant supporter l’exception java. Un autre int´rˆt de cette technique est qu’elle e ee permet d’op´rer du contrˆle d’admission sur l’application. LA PLATE-FORME J2EE – Never : si le thread appelant l’op´ration avec ce comportement transactionnel est e associ´ a un contexte transactionnel. De ce fait.RemoteException. Pour e ` e pallier le probl`me li´ a ces deux propri´t´s contradictoires en terme de performance. Elle est supprim´e dans la version 3 de la sp´cification des EJB. il est propos´ de e ee e pouvoir les passiver de fa¸on a ´viter d’emcombrer la m´moire du serveur dans le cas d’un c `e e nombre important de sessions a g´rer en parall`le. le e e ` ee conteneur EJB interpose g´n´ralement une r´serve d’instances de composant dans le cycle e e e d’allocation/lib´ration de celles-ci 2. nou e tamment dans le cas o` le composant supporte les acc`s distants (mise en place de chaˆ u e ıne de liaison complexe faisant intervenir des ressources r´seau). De plus.

ils sont eux-mˆmes sans ´tat (neue e e tralit´ de l’instance traitant un message) et leur cycle de vie pr´sente les deux mˆmes e e e ´tats.6. Le message est nore e e malement consomm´ de mani`re transactionnelle (d´pendant des capacit´ teche e e e nique de l’´metteur de message). Nous verrons que c’est aussi le cas e e e pour les composants entit´. le choix de ces instances d´pendant e e e e de politiques de gestion de ressources mises en œuvre par le serveur. Figure 5.3 Composants r´actifs e Les composants EJB r´actifs (en anglais Message Driven Bean ou MDB) sont tr`s e e proches des composants de session sans ´tat.´ ´ 5. e e 5. certaines instances de composants de session avec ´tat e e peuvent ˆtre vid´e dans un espace m´moire secondaire. PROGRAMMATION DE L’ETAGE METIER 137 saturation de la m´moire du serveur. le composant r´actif ne fait que r´agir a des ´v´nements g´r´s e e e e e ` e e ee par le conteneur qui les fait traiter par une instance du composant a l’aide de l’op´ration ` e onMessage. ce qui n’est pas le cas des composants e e e de session pour lesquels l’allocation et la lib´ration d’instance ou encore l’activation du e code m´tier sont pilot´es de l’ext´rieur du conteneur. Cela signifie que si la transaction ex´cut´e par e e e onMessage ´choue. En fait. En effet. e Les composants r´actifs supportent des comportements transactionnels plus limit´s que e e les composants de session. e . seuls deux comportements transactionnels peuvent ˆtre e sp´cifi´s pour l’op´ration onMessage : e e e – Required : un contexte transactionnel est allou´ et est associ´ au thread utie e lis´ pour ex´cuter onMessage le temps de son ex´cution. une nouvelle tentative de consommation du message sera effece tuer ult´rieurement (nouvelle activation de onMessage). Dans l’´tat prˆt. par exemple choix des instances les moins r´cemment utilis´es (en anglais Least Recently Used ou LRU).13 – Le cycle de vie d’un composant EJB r´actif e Comme pour les composants de pr´sentation (les servlets).6. les composants r´actifs ne e e peuvent pas ˆtre invoqu´s de l’ext´rieur du conteneur.

e e e C’est l’objectif des composants entit´ que de fournir cette couche d’adaptation des objets e applicatifs m´tier vers leur stockage relationnel. e Figure 5. l’environnement EJB ambitionne de fournir une e vue objet m´tier de ces donn´es relationnelles au niveau du mod`le de programmation. Cette interface fournit le niveau d’abstraction correspondant aux fonctions d’une base de donn´es relationnelle. Or. le conteneur en cherche une disponible dans la r´serve avant d’allouer un e nouvel objet Java a configurer.138 CHAPITRE 5. il faut qu’une instance soit li´e a un son repr´sentant e e e ` e dans la base (en g´n´ral un n-uplet dans une table). e . Cette liaison est d´finie par le nom e e e dans la base de ce repr´sentant. c’est a dire sa cl´ primaire. LA PLATE-FORME J2EE – NotSupported : l’op´ration onMessage est ex´cut´e hors de tout contexte transactione e e nel et consomme le message qui a ´t´ d´livr´. ` Pour passer dans l’´tat Prˆt. Ces informations sont g´n´ralement stock´es dans une ` e e e e base de donn´es relationnelle et manipul´es a travers l’API JDBC (pour Java DataBase e e ` Connectivity). e ` e Etant donn´ que ces instances peuvent ˆtre manipuler en grand nombre et de mani`re e e e r´currente d’une transaction a l’autre. Cette liaison peut ˆtre cr´´e e ` e e ee de plusieurs mani`re : e – Cr´ation d’une nouvelle instance : la cr´ation d’une nouvelle instance de composant e e entit´ cr´e implicitement un repr´sentant dans la base et donc provoque la cr´ation e e e e d’un nouveau nom d´finissant la liaison. il est important d’optimiser leur processus d’allocae ` tion. ee e e 5. La principale e e e diff´rence consiste a exhiber le passage par une r´serve d’instances pour leur allocation. Lors de l’allocation e d’une instance. En fait.14 – Le cycle de vie d’un composant EJB entit´ e Le cycle de vie d’un composant entit´ est assez semblable aux pr´c´dents.6. c’est-`-dire des informations dont la dur´e de vie est a e sup´rieure a la session qui les a cr´´e ou mˆme a l’application elle-mˆme (l’information e ` ee e ` e persiste a l’arrˆt de l’application). les instances qui sont dans la r´serve ont a priori ex´cut´ tout leur cycle de e e e configuration (mise en liaison avec les ressources dont elles d´pendent).4 Composants entit´ e Les composants entit´ sont des composants qui repr´sentent des informations persise e tantes d’une application d’entreprise.

e e e Outre la transparence de projection entre composants entit´ et base de donn´e. La e e e liaison avec l’instance de composant est rompue et cette instance retourne alors dans la r´serve. les e e transactions sont support´es de la mˆme mani`re que pour les composants de session au e e e niveau des op´rations m´tier. il n’y a e e e . d´li´e e e e e e e e et renvoy´e dans la r´serve. Le mˆme patron architectural est e e utilis´ : les composants int´ress´s par des ´v´nements doivent implanter une interface e e e e e sp´cifique qui permet au conteneur d’activer l’instance de composant int´ress´e pour qu’elle e e e traite l’´v´nement en question. L’op´ration inverse d’enregistrement intervient quant a elle soit lors de la validation e e ` de transaction. le conteneur prend en e e e e charge la synchronisation entre l’instance et son repr´sentant en base de donn´es de fa¸on e e c transparente pour le programmeur (cf.14 ´quivalent en anglais des actions load et store). Dans ce cas.´ ´ 5.6. Trois cat´gories d’´v´nements sont d´crites e ` e e e e dans les sous-sections qui suivent. d´finissant ainsi la liaison. e – Op´ration de passivation d´clench´e par le conteneur : lorsqu’il consid`re que la e e e e m´moire est trop encombr´e. Dans le cas de la version 3 de la sp´cification. les composants entit´ peuvent aussi ˆtre utilis´s pour supporter des e e e e e sessions persistantes (cas de sessions particuli`rement longues). les ´v´nements sont g´r´s/´mis par e e ee e le conteneur vers des instances de composants m´tier. e ee c e – Parcours du r´sultat d’un finder : un finder permet de r´cup´rer le r´sultat d’une e e e e requˆte EJB-QL qui est g´n´ralement une collection d’instances d’un composant e e e entit´. Il va alors allouer cette instance et lui e ea associer le nom de l’objet a atteindre en r´cup´rant le nom de son repr´sentant dans ` e e e l’´tat de l’objet r´f´ren¸ant. le conteneur peut d´cider d’en ´liminer certaines inse e e e tances de composants entit´. voire ramass´e par la JVM. suivant des politiques qui lui sont propres (par exemple e LRU comme pr´c´demment pour les composants de session avec ´tat). L’action de chargement est e g´n´ralement ex´cut´e apr`s la mise en liaison et avant tout autre appel vers des op´rations e e e e e e m´tier. N´anmoins. il doit alors activer une instance de ee composant entit´ si elle n’existe pas d´j`. Cette fonction est en principe peu utilis´e dans ce cadre car e e e les transactions sont des s´quences d’op´rations op´rant a une autre granularit´ (processus e e e ` e m´tier). La m´canique sous-jacente ´met vers la base de donn´es une requˆte SQL e e e e e qui remonte la collection de noms des repr´sentants s´lectionn´s. Dans tous les cas. A partir de l` le e e e a conteneur peut d´finir les liaisons entre les instances et leur repr´sentant lorsque e e l’utilisateur parcourt sa collection d’instances. actions chargement et enregistrement dans la figure 5. e Les instances ne retournent dans la r´serve ou ne sont d´truites qu’apr`s une des deux e e e op´rations suivantes : e – Ex´cution de remove d´clench´e depuis le code applicatif : cette op´ration provoque e e e e la destruction du repr´sentant de la base de donn´es et donc du nom associ´. e 5. soit lors d’op´rations de passivation (voir les paragraphes qui suivent).5 Gestion des ´v´nements relatifs aux composants m´tier e e e Les composants m´tier ont la possibilit´ de r´cup´rer un certain nombre d’´v´nements e e e e e e qui peuvent ˆtre utiles a leur logique propre. PROGRAMMATION DE L’ETAGE METIER 139 – Navigation a travers une r´f´rence vers un objet : lorsque le conteneur traverse ` ee une r´f´rence vers une autre objet persistant. Une fois une liaison ´tablie d’une des mani`res pr´c´dentes. e e e l’instance est g´n´ralement synchronis´e avec son repr´sentant si n´cessaire.6.

e e Pour les composants de session. e e e – ejbActivate : cet ´v´nement est ´mis lorsqu’une instance de composant de session e e e avec ´tat est r´activ´e. e e ` e – ejbPassivate : similaire a l’´v´nement ejbPassivate des composants de session.140 CHAPITRE 5.MessageDrivenBean pour les composants r´actifs et javax. deux ´v´nements seulement sont ´mis par le conteneur : e e e e – setMessageDrivenContext : similaire a l’´v´nement setSessionContext des compo` e e sants de session. mise ` e e a part que l’espace secondaire vers lequel est envoy´ l’´tat de l’instance est la base ` e e de donn´es sous-jacente. l’une d’entre elles doit obligatoirement ˆtre implant´e e e par un composant m´tier. – unsetEntityContext : similaire a l’´v´nement ejbRemove des composants de session. a savoir setSessionContext e e ` et ejbRemove : – setSessionContext : cet ´v´nement est ´mis a la cr´ation d’une instance de compoe e e ` e sant de session. Ils d´pendent du type ee e de composants. e e e – ejbLoad : l’´v´nement est ´mis lorsque l’´tat de l’instance de composant est charg´ e e e e e de la base de donn´es vers la m´moire principale. e e e e e Cette contrainte est lev´e dans la version 3 de la sp´cification EJB. c’est ramen´e en m´moire principale avec restauration de son e e e e e suivant les r`gles d´finies par la sp´cification EJB (un composant de session avec e e e ´tat doit ˆtre serializable et les variables d´finies comme transient peuvent aussi e e e ˆtre sauvegard´es et restaur´es sous certaines conditions. L’´tape suivante est g´n´ralement la prise en charge de cette instance par le e e e ramasse-miette. javax. sept ´v´nements sont ´mis par le conteneur : e e e e – setEntityContext : similaire a l’´v´nement setSessionContext des composants de ` e e session. e e e Pour les composants r´actifs. ` e e – ejbRemove : l’´v´nement est ´mis lorsque le repr´sentant de stockage associ´ a cette e e e e e` instance est ´limin´ de la base de donn´es. Il suffit de d´finir une correspondance entre des e op´rations du composant et les ´v´nements qui peuvent ˆtre trait´s. ` e e Pour les composants entit´.EntityBean pour les composants entit´. . e e – ejbStore : l’´v´nement est ´mis lorsque l’´tat de l’instance de composant est enree e e e gistr´ dans la base de donn´es a partir de la m´moire principale. Comme e e ces interfaces typent le composant. ` e e e – ejbRemove : cet ´v´nement est ´mis a la destruction d’une instance de composant de e e e ` session.SessionBean pour les composants de session. Il permet a l’instance de r´cup´rer le contexte qui lui est associ´. et notamment le repr´sentant de stockage de l’instance en e e question. – ejbPassivate : cet ´v´nement est ´mis lorsqu’une instance de composant de session e e e avec ´tat va ˆtre rendu passif (stockage dans un espace m´moire secondaire). Ils sont sp´cifi´s par des interfaces associ´es a chacun de ces types : e e e ` javax. mˆme si aucun traitement n’est effectu´ pour ces ´v´nements.ejb.ejb. – ejbRemove : similaire a l’´v´nement ejbRemove des composants de session. e e e e e Ev´nements relatifs au cycle de vie des instances de composant e Les premiers ´v´nements qui peuvent ˆtre trait´s par les instances de composants e e e e sont ceux relatifs leur cycle de vie qui est g´r´ par le conteneur.ejb. LA PLATE-FORME J2EE pas besoin d’implanter des interfaces. quatre ´v´nements sont ´mis par le conteneur. Seulee e e ment deux d’entre eux sont ´mis pour les sessions sans ´tat.

. Le premier type permet de d´finir une e e e e e ´ch´ance unique. e e D’autres ´v´nement communs changent de nom suivant le type de composant (par e e exemple ejbRemove des composants de session et des composants r´actifs devient e unsetEntityContext pour les composants entit´. En effet.Context.TimedObject. avec en param`tre e e l’´v´nement temporel arriv´ a ´ch´ance. PROGRAMMATION DE L’ETAGE METIER 141 – ejbActivate : similaire a l’´v´nement ejbActivate des composants de session.. sachant que le cycle de vie des composants e e de session avec ´tat ´tend le pr´c´dent. – beforeCompletion : l’´v´nement est ´mis lorsqu’une instance de composant s’ex´cute e e e e dans un contexte transactionnel qui est sur le point d’ˆtre valid´ ou annul´. c’est a dire qu’un ´v´nement est ´mis a e e e e ` e e e ` p´riode fixe. La d´finition de ces ´v´nements de mˆme que celle des cycles de vie aurait m´rit´e e e e e e e un traitement plus syst´matique. L` encore. e e e Ces ´v´nements peuvent ˆtre ´mis seulement dans le cadre des composants de sese e e e sion avec ´tat. Ev´nements temporels (horloges / ´ch´anciers) e e e Il est possible d’associer des ´v´nements temporels aux composants EJB. Concernant les cycles de vie. il faut qu’ils implantent l’intere e face javax. certains ´v´nements communs sont d´finis e e e e avec le mˆme patron de nommage (pourquoi pas le mˆme nom. mise a ` e e ` part que l’espace secondaire depuis lequel l’´tat de l’instance est r´activ´ est la base e e e de donn´es sous-jacente. pour lesquels ejbRemove prend une autre e s´mantique. Il est toujours e ee possible d’obtenir cette fonction en interagissant directement avec le service transactionnel pour qu’une instance de composant s’enregistre comme une Synchronization.ejb. e e e`e e Deux types d’´ch´ancier peuvent ˆtre d´finis.) comme set. l’op´ration e e e e e ejbTimeout de l’interface en question est invoqu´e par le conteneur. e e e e notamment lorsque celles-ci sont prises en charge de fa¸on transparente par le conteneur. Le second type e e ` e e e ` e e permet de d´finir des ´ch´anciers p´riodiques. e e Ev´nements relatifs aux transactions e Il est possible d’ˆtre averti des ´v´nements relatifs aux d´marcations transactionnelles.. et notamment le repr´sentant de stockage de l’instance en e e question. de mˆme que celui des composants entit´ ´tant e e e e e e e lui-mˆme celui des sessions avec ´tat..ejb. Lors de l’´ch´ance d’un ´v´nement temporelle. Pour e e que les composants supportent de tels ´v´nements. c Le composant doit pour cela implanter l’interface javax. e . e e e – afterCompletion : l’´v´nement est ´mis lorsqu’une instance de composant s’ex´cute e e e e dans un contexte transactionnel qui vient d’ˆtre valid´ ou annul´.6. tous les composants EJB ! !). c’est a dire qu’un seul ´v´nement est ´mis a l’´ch´ance. ceux des composants r´actifs et des composants e e de session sans ´tat sont exactement les mˆmes.´ ´ 5. le manque de vision syst´matique est dommageable car de tels e a e ´v´nements pourraient aussi bien int´ress´s d’autres types de composants qui supportent e e e e la d´marcation g´r´e par le conteneur (en fait.SessionSynchronization qui d´finit les ´v´nements sont les suivants : e e e – afterBegin : l’´v´nement est ´mis avant l’ex´cution de n’importe qu’elle op´ration e e e e e m´tier lorqu’une instance de composant s’ex´cute dans un nouveau contexte trane e sactionnel.

netbeans. Leur support dans de futures versions de la sp´cification ne doit e n´anmoins pas poser de probl`me. On peut n´anmoins affirmer que la notion de composant J2EE est un relatif ´chec. Cette synth`se se concentre sur les fonctions qui e e permettent de d´velopper et d’int´grer des applications d’entreprise avec des garanties e e de sˆ ret´ de fonctionnement (support des transactions et notamment des transactions u e r´parties) et de s´curit´ (support de l’authentification et du contrˆle d’acc`s). – Pour les composants entit´ : les ´ch´anciers sont effectivement associ´s a l’instance e e e e ` qui les cr´e. les ´ch´anciers ainsi d´finis sont persistants. En fait. il n’y a pas de distinction entre les instances.org) exhibent des fonctions avanc´es pour faciliter ces e d´veloppements. En e e effet. Lorsqu’un ´v´nement e e temporel est ´mis par le conteneur. e e 5. Il pere e e ` ` met donc de cr´er de nouveaux ´ch´anciers qui sont associ´s aux instances de composants e e e e de la mani`re suivante : e – Pour les composants de session sans ´tat et les composants r´actifs : les ´ch´anciers e e e e cr´´s ne sont en fait pas associ´s a une instance particuli`re puisque dans le cas de ee e ` e ces composants. C’est e ` e e o . e On comprend bien que cette approche ne peut pas ˆtre utilis´e pour les composants e e de session avec ´tat car les instances de ceux-ci ont une identit´ propre mais ne survive e e pas a l’arrˆt du serveur qui les h´berge.5 de J2EE qui doit ˆtre finalis´e bientˆt. e e e e Dans tous les cas. http://www. il n’existe pratiquement pas d’environnement de d´veloppement permettant d’effece tuer de l’assemblage d’applications a partir de biblioth`ques de composants J2EE existant.eclipse. la mise en œuvre des mod`les de composants J2EE est consid´r´e e ee comme lourde par de nombreux d´veloppeurs. e e e o e La synth`se insiste aussi sur les principes de d’architecture et de construction du code e propos´s par l’environnement J2EE. mˆme si les environnements de e e d´veloppement tels que Eclipse e (cf. ils doivent e e e survivre a l’arrˆt ou a la panne du serveur qui les h´berge. Des ´ch´anciers persistants n’ont donc pas de sens ` e e e e pour de tels composants. tous les ´v´nements correspondants doivent ˆtre ´mis lors du e e e e e red´marrage. La facilit´ de programmation est d’ailleurs un des principaux axes e e d’am´lioration a l’œuvre dans la version 1.142 CHAPITRE 5. Cela permet au conteneur d’activer la bonne instance de composant pour traiter les ´ch´ances d’´v´nements. http://www. l’association est faite avec l’identifiant (bas´ sur la cl´ primaire) e e e de l’instance. ` e Par ailleurs.1 e de la sp´cification EJB) ou plus pr´cis´ment a leurs instances a travers leur contexte. En effet. LA PLATE-FORME J2EE Le service d’´ch´anciers (en anglais Timer Service) est accessible aux composants (sauf e e pour les composants de session avec ´tat qui ne sont pas pris en compte dans la version 2.7 Conclusion et perspectives Ce chapitre pr´sente une synth`se des principaux principes et des principales fonce e tionnalit´s de l’environnement J2EE. Si des ´ch´ances sont interve` e ` e e e nues pendant de tels arrˆts. Le support de composant est omnipr´sent dans la e e solution propos´e mˆme s’il n’est pas appliqu´ de fa¸on homog`ne et syst´matique (ape e e c e e proche ad hoc avec diff´rentes notions de composant suivant les sp´cifications consid´r´es e e ee telles que servlet ou EJB). celui-ci active une instance quelconque du come posant pour le traiter.org) ou NetBeans (cf.

e . CONCLUSION ET PERSPECTIVES 143 notamment le cas pour les EJB o` la version 3.7.5.0 des sp´cifications simplifie largement le u e d´veloppement.

144 CHAPITRE 5. LA PLATE-FORME J2EE .

Elle nous permet de fixer le vocabulaire pour diff´rencier les e ´l´ments de la plate-forme normalis´s par Microsoft de ceux qui sont rest´s propri´taires ee e e e afin de pouvoir tr`s rapidement comparer les diff´rentes plates-formes de d´veloppement. D. le e ` e d´ploiement des applications en g´n´ral. Cette architecture logicielle concerne aussi bien les clients que les serveurs qui vont dialoguer entre eux a l’aide d’XML.Intergiciel et Construction d’Applications R´parties e c 2006 M.NET.org/licenses/by-nc-nd/ 2. e e 6.10:31) Licence Creative Commons (http://creativecommons. Riveill.vol. Les trois sections suivantes font respectivement le lien entre e les composants . Beugnard. La section 6. H3540 . La e e e ` e section 6.NET est une architecture logicielle destin´e a faciliter la cr´ation.1) e e e et l’´tage de pr´sentation (6. Emsellem (version du 19 janvier 2007 .fr) Chapitre 6 La plate-forme .3.NET .1 6. Elle se compose de quatre principaux ` ´l´ments : ee – un mod`le de programmation qui prend en compte les probl`mes li´s aux e e e d´ploiements des applications (gestion de version. e e e La section 6.2 insiste sur l’architecture g´n´rale de la plate-forme et sur ses principales e e caract´ristiques. l’´tage d’acc`s aux donn´es (6. e e e 1 une partie de ce texte a ´t´ publi´e dans les Techniques de l’Ing´nieur . diverse et parfois complexe int´grant les standards actuels.NET1 est en passe de devenir une technologie fr´quemment utilis´e pour la r´alisation e e e de projets informatiques.2) pr´sents dans toute architecture a N ´tages (N-tier ).Trait´ “Technologies logicielles e e e e e et architecture des syst`mes” .NET et les services techniques (6.f´vrier 2006 e e .4). d´finitions et principes e G´n´ralit´ e e e Microsoft .2.3 est constitu´e d’un petit exemple permettant d’illustrer les principaux principes e de la plate-forme.1 Historique. mais plus sp´cifiquement des applications Web e e e e ou des services Web. Dans ce chapitre nous abordons les principaux principes de cette plate-forme.1.0/fr/deed. s´curit´) .4. A. La section e d’introduction met en ´vidence la compl´tude et la richesse de l’ensemble des biblioth`ques e e e de la plate-forme . Le chapitre se termine par une ´valuation qualitative et quantitative et e par une pr´sentation de l’´volution future de cette plate-forme.4 pr´sente le mod`le de composants et la machine virtuelle e e e permettant leur ex´cution.

ex´cutent et g`rent les services Web et les e e e applications . gestion de la m´moire. SQL Server e e e ou Microsoft Biztalk Server qui int`grent.NET e La figure 6.146 CHAPITRE 6. Figure 6. C++. e e – un ensemble de syst`mes serveurs repr´sent´s par Windows Server 2003. les concepts de la machine virtuelle de Java. e VB. pour lequel le code interm´diaire (byte-code) est li´ a un seul e e ` langage source. Cet objet interm´diaire.NET est essentiellement un environnement de d´veloppement et e d’ex´cution reprenant. des processus et e ` e e e des threads.1 – Les diff´rentes plates-formes . Microsoft . etc. Cette mˆme figure pr´sente les principales impl´mentations de ces e e e sp´cifications. est le suivant : la compilation du code source g´n`re un objet interm´diaire dans le langage MSIL (Microsoft Intermediate e e e Language) ind´pendant de toute architecture de processeur et de tout syst`me d’exploie e tation hˆte.0 sont invit´s a faire migrer leurs codes e ` 3 ECMA 334 puis ISO/IEC 23270 : C# Langage Specification 4 ECMA 335 puis ISO/IEC 23271 : Common Langage Interface (CLI) 2 . entre autres. e e e Au contraire de Java. via le e CLR (Common Language Runtime).NET est la nouvelle version de Visual Basic. Il est alors ex´cut´.NET – des outils de d´veloppement dont le cœur est constitu´ de Visual Studio . le code interm´diaire de la plate-forme . au sein du CLR.1 r´sume les diff´rents aspects de ces normes qui concernent le langage e e de programmation C# “invent´” pour l’occasion 3 et la plupart des interfaces internes e 4 de la plate-forme. Le CLR en charge de son ex´cution contient un ensemble e de classes de base li´es a la gestion de la s´curit´. Le principe.NET est commun a un ensemble de e ` langages (C#.NET . bien connu.). Windows CE ou Mie e e crosoft Office 2003. VB2 . il int`gre la notion d’objets qui existe dans . au o e e ` e moyen d’un compilateur JIT (Just In Time) qui le transforme en code machine li´ au e processeur sur lequel il r´side. En fait. est ensuite compil´ a la vol´e. – un ensemble de syst`mes clients repr´sent´ par Windows XP. LA PLATE-FORME .NET et e les programmeurs de l’actuelle version 6.

et ayant une r´elle importance : e e 6 [Edd Dumbill and M. e Autres impl´mentations e Suite a l’adoption officielle de ces deux standards par l’ECMA en d´cembre 2001. Le CLS utilise entre autres un syst`me de types unifi´ permettant e e d’avoir le mˆme syst`me de type entre les diff´rents langages et le mˆme syst`me de type e e e e e entre les types pr´d´finis et les types d´finis par l’utilisateur.1.2 Implantations Rotor . ` – toutes utilisations du logiciel a des fins commerciales sont prohib´es. Bornstein 2004] et DotGNU 7 [Weatherley and Gopal 2003].au/portable net. e e e 6 Rotor : http ://msdn. Il peut toutefois ˆtre distribu´ au e e e sein d’ouvrages ou autres supports de cours li´s a l’enseignement.2 6.microsoft. une e version portable du syst`me et port´e sur Windows XP. Cette impl´mentation va au del` de ces sp´cifications en e e a e proposant un environnement d’ex´cution. un d´bogueur.NET on peut v´ritablement parler d’ine e e terop´rabilit´ entre langages.html 5 . des biblioth`ques de classes. recherche e e ` universitaire ou exp´rimentations personnelles).org 7 DotGNU : http ://www. Nous pouvons par exemple citer deux initiatives logiciels libres (open-source). Elle est propos´e a des fins non commerciales via la licence e e ` SSCLI dont les principales caract´ristiques sont : e – le logiciel doit ˆtre utilis´ a des fins non commerciales (enseignement. ind´pendantes de Microsoft. la r´action ne se fit pas attendre. 2003] qui est un environnement d’ex´cution pour des applications r´parties e e ´crites dans des langages diff´rents. FreeBSD et MacOS X. ainsi e e qu’une suite compl`te de test.NET sur des syst`mes d’exploitation non Microsoft e e comme Linux. et ` e plus tard par l’ISO2 en avril 2003.1 Architecture g´n´rale et concepts e e CLR Le composant central de l’architecture .2.SSCLI Le code source partag´ CLI (Common Language Infrastructure) 5 [Stutz et al. la couche PAL (Platform Adaptation Layer). Diff´rentes implantae e tions du CLI bas´es sur la sp´cification ECMA ont vu le jour permettant ainsi l’ex´cution e e e et le d´veloppement d’applications .southern-storm. Cette interop´rabilit´ s’appuie sur le CLS (Common Lane e e e guage Specification) qui d´finit un ensemble de r`gles que tout compilateur de la platee e forme doit respecter. Mono 6. En effet.2. 2003] e correspond a une impl´mentation fonctionnelle des sp´cifications du langage C# et de ` e e la CLI normalis´es par l’ISO. FreeBSD et MacOS.com.NET est le CLR (Common Language Runtime) [Stutz et al. ou publi´ sur des e ` e sites Web dont le but est de former a son utilisation. ` e – le logiciel est livr´ sans garanties. ARCHITECTURE GENERALE ET CONCEPTS 147 6. avec .´ ´ 6. le compilateur C# e e et JScript. ` e – le logiciel peut ˆtre modifi´ et le r´sultat de ces modifications peut ˆtre distribu´ dans e e e e e un but non commercial a la condition de ne pas accorder de droit suppl´mentaire.go-mono.com/net/sscli/ Mono : http ://www. des outils.

Grˆce au jeu commun de ces biblioth`ques. e e e ` 6. etc.just-in-time compiler ) qui place le code produit dans un cache. Dans cet environnement.NET e ` e e contient une biblioth`que de classes tr`s compl`te. ind´pendant de tout processeur baptis´ MSIL e e e (Microsoft Intermediate Language). Ce code est traduit en langage machine lorsque l’application est e e ex´cut´e pour la premi`re fois.NET. Voici un exemple de code qui cr´e dans un premier temps un e e e ex´cutable et regarde par la suite les m´tadonn´es.4 e e e e e et la plate-forme . . le langage lui-mˆme est essentiellement une interface syntaxique des bie blioth`ques d´finies dans le CLR. Ces m´tadonn´es d´crivent l’ex´cutable produit et lui sont e e e e e e e syst´matiquement incorpor´es pour pouvoir ˆtre atteintes lors de l’ex´cution.NET des autres e e ex´cutables de l’OS Windows en chargeant au d´marrage de l’application un ensemble de e e DLL sp´cifiques pr´cis´es dans cet en-tˆte. e – EconoJIT : jit permettant de minimiser la place m´moire utilis´e pour ex´cuter un e e e programme et qui sera utilis´ pour les ´quipements portables. e e puis g´n`re du code MSIL. – JIT : les m´thodes sont compil´es une par une a la vol´e lors de leur premi`re e e ` e e ex´cution. ` e Sur la plate-forme . Le code MSIL produit contient un en-tˆte au standard PE e e e e (Win-32 Portable Executable) qui permet de diff´rencier les ex´cutables .NET utilise un compilateur ` e a la vol´e (JIT Compiler . la plate-forme . e ` e Pour r´pondre a ce souci d’interop´rabilit´ entre les langages.NET. un ensemble e e o de r`gles garantissent que les applications se comporteront d’une mani`re uniforme. e e e e Pour compiler a l’ex´cution le code MSIL. et ce e e ind´pendamment du langage ayant servi a les ´crire. Pour compiler une application destin´e a . exception faite de e e e la d´claration des variables. passer par ces biblioth`ques pour cr´er des threads. trois JIT sont disponible : – G´n´ration de code a l’installation : le code MSIL est traduit en code machine lors e e ` de la phase de compilation comme le fait tout compilateur.2 MSIL et JIT Pour permettre la compilation de diff´rents langages sur la plate-forme . Dans .NET fournit de nombreuses classes permettant de manipuler de mani`re e r´flexive les ex´cutables. Microsoft e a d´fini une sorte de langage d’assemblage.148 CHAPITRE 6. e e e Fichier calculatrice.NET. etc.cs using System. li´ au CLR est celui de code g´r´. c’est a dire de code e ee ` ex´cut´ sous le contrˆle de la machine virtuelle.NET.NET incorporent dans l’ex´cutable produit e diff´rentes m´tadonn´es. s´rialiser des donn´es. ou lorsqu’elles ne sont plus en cache. le e ` compilateur concern´ lit le code source dans un langage respectant les sp´cifications CLS. acc´der a internet.NET Un autre concept majeur.2. utilisable depuis tous les langages et e e e permettant aux d´veloppeurs d’utiliser une mˆme interface de programmation pour toutes e e les fonctions offertes. Il est ainsi e e e e possible dynamiquement de connaˆ les diff´rents types d´clar´s par un ex´cutable. les ıtre e e e e m´thodes qu’il impl´mente. la plate-forme . La lecture des m´tadonn´es s’appelle r´flexion (voir 2. les syne e e chroniser. tous les e e a e langages disposent th´oriquement des mˆmes capacit´s car ils doivent. e e Les compilateurs de la plate-forme . LA PLATE-FORME .

s’effectue par ´tape : e – g´n´ration de la biblioth`que calculatrice. int i = 10. // lire tous les modules de l’assembly Module[] modules = a. } public int Sub(int a.GetTypes(). . int b) { return a+b.Add (i. e // inspecter toutes les m´thodes du type e MethodInfo[] mInfo = type.2. ARCHITECTURE GENERALE ET CONCEPTS 149 class MaCalculatrice { public int Add(int a. j)). using System.WriteLine("Type {0} a cette m´thode : ".dll application. type. calculette. i. j. // inspecter tous les types foreach (Type type in types) { Console.´ ´ 6.cs using System. using System. } } Fichier application. Console.exe /target:exe /reference:calculatrice.LoadFrom ("application.exe e e e % csc.IO.dll e e e – g´n´ration de l’ex´cutable application. // lire tous les types du premier module Type[] types = module. public class Meta { public static int Main () { // lire l’assembly Assembly a = Assembly.GetModules().exe").Name).cs public class MonApplication { static void Main (string[] args) { MaCalculatrice calculette = new MaCalculatrice ().cs % csc.GetMethods(). int b) { return a-b.Reflection. j = 20.WriteLine ("{i} + {j} =". // inspecter tous le premier module Module module = modules[0].dll calculatrice.exe /target:library /out:calculatrice. } } La compilation de l’application.

s’effectue de la mani`re suivante : e e % csc. des e biblioth`ques comme ODBC.Object) Int32 GetHashCode() Type MonApplication a cette m´thode : e System. e ` e e 6. le code de s´curit´ v´rifie rˆles et donn´es ` e ` e e e o e d’identification.2. Les contrˆles de s´curit´ peuvent ˆtre effectu´s entre processus ou entre o e e e e machines afin d’assurer la s´curit´ mˆme dans un contexte distribu´. Elle s’applique d`s le chargement e e e d’une classe par le CLR.String ToString() Boolean Equals(System.exe” puis son ex´cution. via la v´rification de diff´rents ´l´ments li´s aux r`gles de s´curit´ e e ee e e e e d´finies dans la plate-forme : r`gles d’acc`s. Pour cela. La figure 6. e e e e Windows nous a habitu´s a un d´ploiement hasardeux pour lequel il est n´cessaire e ` e e de g´rer de multiples fichiers binaires.NET e e e e ` ont ´t´ ´limin´s et il n’est plus n´cessaire d’enregistrer des composants dans la base de ee e e e 8 Un assembly est une unit´ de d´ploiement.Object) Int32 GetHashCode() L’outil ILDASM (Intermediate Language Disassembler ) qui permet d’afficher de mani`re hi´rarchique les informations sur une application utilise essentiellement la e e r´flexion. Ce sont g´n´ralement des fichiers ee e e e e e e ex´cutable r´partis sur un ou plusieurs fichiers physiques. mi). des fichiers ex´cutables e produits.NET change cette approche et le e d´ploiement des applications repose sur la copie dans un r´pertoire sp´cifique.cs % meta. Les probl`mes ant´rieurs a . la base de registres. Fort heureusement. le GAC e e e (Global Assemblies Cache). des composants COM.String ToString() Boolean Equals(System.150 CHAPITRE 6. Des contrˆles de s´curit´ garantissent que telle ou telle portion de code est habilit´e o e e e a acc´der a telle ou telle ressource. LA PLATE-FORME . e e e e etc. contraintes de coh´rence. Ces fichiers ex´cutables (mais pas toujours) “assembly 8 ” sont un paquet regroue pant des ´l´ments devant ˆtre d´ploy´ simultan´ment.WriteLine (" {0}".exe meta. Int32) System. } } return 0.Type GetType() System. .NET foreach (MethodInfo mi in mInfo) { Console.1 montre a quoi ressemble le programme pr´c´dent sous ILDASM.Type GetType() System. ou dans l’arborescence utilisateur.exe Type MaCalculatrice a cette m´thode : e Int32 Add(Int32. } } La compilation de l’application permettant de lire l’application “application. localisation du fichier. e e .3 S´curit´ et d´ploiement des composants e e e La s´curit´ est cruciale pour toutes les applications.

2.NET Composants La brique de base d’une application . e e Cela a pour cons´quence. Il peut s’agir d’un ex´cutable (. toute publication dans le GAC ainsi que la gestion e des versions dans celui-ci le n´cessite.dll) contenant e e des ressources. Si l’ex´cution dans le r´pertoire courant e ` e e e e ne n´cessite pas la signature du code. aucune biblioth`que de type ou couple talon client/sere e . tous les composants sont d´sormais auto-descriptifs.2. Ces m´tadonn´es sont utilis´es e e e e par l’environnement d’ex´cution (run-time).2 – Le programme de 6. aucun autre fichier n’est n´cessaire pour utiliser un composant et e par cons´quent.2. que toute application install´e est automatiquement associ´e aux ` e e e fichiers faisant partie de son assemblage. en examinant les m´tadonn´es Au contraire de l’approche ` e e Java RMI et de Corba. aucun fichier IDL. grˆce aux m´tadonn´es et a e a e e ` la r´flexion. La d´finition des classes peut ˆtre obtenue die e e rectement a partir du composant. Une partie de la s´curit´ du code repose sur la possibilit´ de signer celui-ci a l’aide e e e ` d’une cl´ priv´e afin de pouvoir identifier ult´rieurement la personne ou l’organisation qui e e e a ´crit ce code a l’aide de la cl´ publique associ´e.4 Composants .NET est le composant (litt´ralement assemblage e ou assembly). ARCHITECTURE GENERALE ET CONCEPTS 151 Figure 6.NET permet aussi de g´rer dans le GAC plusieurs versions du mˆme fichier et e e de rediriger a la demande les appels vers un assemblage vers une version plus r´cente si ` e c’est souhait´ par le concepteur de l’application. des m´tadonn´es. e 6. y compris leur version. . En effet.2 analys´ avec ILDASM e registre.exe) ou d’une biblioth`que (.´ ´ 6. des types et du code ex´cutable sous la e e e forme d’une liste d’instructions en langage interm´diaire. un manifeste.

les informations d’origine fournies au moment de la conception e ne sont jamais perdues.NET r`gle les probl`mes e e e e li´s a la complexit´ de l’installation d’applications. d’ex´cution (au sein d’un domaine ` e e e d’application) et une unit´ pour la gestion des versions. Ceci ´limine les probl`mes relatifs a la e e e e e e ` compatibilit´ des versions de composants et am´liore la stabilit´ globale du syst`me. e D´ploiement des composants e Le mod`le de d´ploiement d’applications de la plate-forme . sp´cifique a chaque application. les m´tadonn´es ´tant g´n´r´es a partir du code source durant le processus de e e e e ee ` compilation et stock´es avec le code ex´cutable. Chaque e e e e composant est charg´ dans un domaine d’application diff´rent lui permettant ainsi e e d’ˆtre isol´ des autres composants de l’application. LA PLATE-FORME . C’est une unit´ d’ex´cution unique. pour la gestion de la recherche et le chargement e e ` des composants.NET permet le d´ploiement cˆte a cˆte (side by side) des compoe o ` o sants : plusieurs copies d’un composant. Ce mod`le utilise la notion de composant qui permet de d´ployer de fa¸on unitaire un e e c groupe de ressources et de types auquel est associ´ un ensemble de m´tadonn´es appel´ e e e e manifeste (assembly manifest). mais pas n´cessairement de la mˆme version. elles ne sont jamais d´synchronis´es par e e e e rapport a celui-ci. En raison du caract`re auto-descriptif des composants. Les informations de configuration d’applications e e d´finissent l’emplacement de recherche des composants et permettent ainsi a l’environe ` nement d’ex´cution de charger des versions diff´rentes du mˆme composant pour deux e e e applications diff´rentes ex´cut´es simultan´ment. a la gestion des versions de DLL dans e ` e ` le monde Windows ou du positionnement de la variable CLASSPATH dans le monde Java. e e une version sp´cifique ou la version utilis´e lors de la conception. e e peuvent r´sider sur un mˆme syst`me. Les assemblages peuvent ˆtre priv´s ou partag´s e e e e e e par plusieurs applications et il est possible de d´ployer plusieurs versions d’un composant e simultan´ment sur une mˆme station. e e e e Si n´cessaire.NET veur (stub/skeleton) n’est n´cessaire pour acc´der a un composant depuis un autre langage e e ` ou un autre processus. e e – Il int`gre un m´canisme de gestion de version sp´cifique. aucun ene registrement explicite aupr`s du syst`me d’exploitation n’est n´cessaire. Les d´veloppeurs peuvent aussi sp´cifier des strat´gies de gestion des versions pour e e e indiquer si l’environnement d’ex´cution doit charger la derni`re version d’un composant. o – C’est une unit´ de d´ploiement unique. La plate-forme . Plus important e e e encore. e – Il permet de s´curiser l’ensemble des ressources qu’il contient de mani`re homog`ne e e e car c’est a la fois une unit´ de d´ploiement. ` Le rˆle du composant est de plusieurs natures. Cependant. les administrateurs peuvent ajouter aux composants lors du d´ploiement e e des informations de configuration telles que des strat´gies de gestion des versions e diff´rentes.152 CHAPITRE 6. Le manifeste comprend entre autres la liste des types et des ressources visibles en dehors du composant et des informations sur les d´pendances entre les diff´rentes ressources qu’il e e utilise. Ils peuvent aussi pr´ciser e e e la strat´gie. e e e – Il permet ´galement de d´finir la visibilit´ des types qu’il contient afin d’exposer e e e publiquement ou non certaines fonctionnalit´s vers d’autres domaines d’application. Il n’est pas n´cessaire de d´ployer des informations de configuration e e s´par´es pour identifier les attributs de services requis par le d´veloppeur. Le d´ploiement e e e e .

Alors la machine virtuelle .NET sur une machine conduit a la ` cr´ation d’un cache global pour les composants .20) . cette section.NET isole ce composant dans un espace sp´cifique.´ ´ 6. On compare dans un premier e e temps le comportement des langages a objets vis-`-vis de la liaison dynamique et dans ` a . e Ce cache est un r´pertoire (e. et c’est particuli`rement le cas si l’on souhaite reprendre sans e modification du code existant (C ou C++ par exemple) manipulant directement des pointeurs. – Soit la compilation du composant respecte toutes les sp´cifications de la plate-forme e .Minor. reprise e e e e du document d’habilitation d’Antoine Beugnard [Beugnard 2005] [Beugnard 2006] est une critique d´taill´e des aspects “multi-langages” du framework.NET. Le composant associ´ e est lui aussi d´clar´ ”managed”. ARCHITECTURE GENERALE ET CONCEPTS 153 d’une application peut se limiter a la copie de fichiers dans une arborescence de r´pertoires.Build.NET destin´s a ˆtre partag´s entres les diff´rentes applications s’ex´cutant e `e e e e sur cette machine. Il contient les composants de base de la plate-forme . ` e Les informations de configuration sont stock´es dans des fichiers XML qui peuvent ˆtre e e modifi´s avec tout ´diteur de texte. e e L’installation d’un composant dans le GAC se fait en plusieurs ´tapes : e – affectation d’un num´ro de version selon un format bien d´fini (128 bits) e e Major.NET et l’on parle alors de code ”managed”. ee e Le terme ”unmanaged” rencontr´ ci-dessus fait r´f´rence au processus de compilation e ee des composants . – installation du composant dans le GAC . – mise au point de la s´curit´. – signature du composant afin de lui donner un nom unique (strong name) .0.NET.NET de mˆme e que les composants d´pos´s par les diff´rents programmeurs. n’assure pas pour ce composant une gestion m´moire sp´cifique (pas de e e e ramassage des miettes) et l’on parle alors de code ”unmanaged” et de composants ”unmanaged”. Le fait d’ˆtre plac´ dans e e e e e le GAC plutˆt que dans le r´pertoire d’une application donn´e permet a un composant o e e ` d’ˆtre partag´ et donc d’ˆtre localis´ de mani`re unique sans ambigu¨ e sur la machine. Gestion de version L’installation d’une version de la plate-forme .2.Revision (par exemple (2.2. La tˆche se complique l´g`rement si des composants e e a e e non-g´r´s (unmanaged components) sont n´cessaires au fonctionnement de l’application.g. c:\Windows\assembly) dans lequel se trouvent tous les e composants .NET.NET (GAC : Global Assembly Cache).142.NET Apr`s une pr´sentation tr`s rapide des syst`mes de type de .5 Assemblage de composants . e e e e e ıt´ Ce r´pertoire sp´cifique peut aussi contenir plusieurs versions d’un mˆme composant ce e e e qui permet de r´soudre les probl`mes classiques li´s a l’utilisation des DLL Windows stane e e ` dard o` chaque nouvelle version d’une biblioth`que ´crase l’ancienne conduisant a une u e e ` compatibilit´ al´atoire des applications.NET et alors l’ex´cution de ce composant est compl`tement prise en charge par la e e machine virtuelle . e e 6. e e – Soit la compilation du composant ne respecte pas toutes les sp´cifications de la e plate-forme .

NET (run-time). Les fournisseurs de e e e biblioth`ques n’ont ainsi plus besoin de cr´er des versions diff´rentes pour chaque langage e e e de programmation ou compilateur et les d´veloppeurs d’applications ne sont plus limit´s e e aux biblioth`ques d´velopp´es pour le langage de programmation qu’ils utilisent. et par exemple. int et float mais aussi les types ´num´r´s (enum) et les types structur´s (struct)) et e ee e le type r´f´rence qui permet de d´signer les objets (classes. de J# ou de C#) aient la mˆme taille. la plate-forme . types d´l´gu´s ee e ee e . Par exemple. Ce syst`me de types est capable d’exprimer la s´mantique de la plue e part des langages de programmation actuels et peut ˆtre vu comme un sur-ensemble des e constructions que l’on retrouve dans la plupart des langages comme Java et C++.3) le type valeur (ce sont les types de base : bool. Le code e source est compil´ vers un langage interm´diaire unique (MSIL : Microsoft Intermediate e e Language) pour le moniteur d’ex´cution . Chaque langage utilise ce syst`me commun de type qui est appliqu´ a son e e ` propre mod`le. LA PLATE-FORME . Le syst`me de type CTS e L’un des objectifs de la plate-forme logicielle . des exceptions peuvent e ˆtre signal´es a partir de code ´crit dans un langage et intercept´es dans du code ´crit e e ` e e e dans un autre langage. Pour atteindre cet objectif.NET.3 – Le syst`me de types de la plate-forme .NET e Comme pour la plupart des langages de programmation a objets.NET doit respecter ce e syst`me de types. le langage d’origine importe peu.NET est d’unifier les processus de d´veloppement et en particulier de r´soudre le probl`me de l’h´t´rog´n´it´ des langages de e e e ee e e e programmation.NET un second temps la capacit´ de la plate-forme a avoir un comportement neutre pour la e ` programmation par composition. de C++.NET distingue (voir figure 6.Int afin que tous e les int (ceux de C. de VB. chaque langage va utiliser le type System. Les op´rations telles que la mise au point ou le profilage fonce tionnent ind´pendamment des langages utilis´s pour ´crire le code. e A l’ex´cution. char. e e e Figure 6. Ceci permet par exemple a un d´veloppeur C# d’utiliser une classe ´crite e ` e e par un d´veloppeur VB.154 CHAPITRE 6. celle-ci h´ritant d’une classe Java (ou plutˆt J# l’´quivalent e e o e pour . le mod`le de type ` e de .NET). Cette sp´cification impose que chaque langage ciblant la plate-forme . interfaces.NET s’appuie sur un syst`me e de types commun.

NET correspond le e type C# bool et le type VB Boolean. e Un type valeur contient directement sa valeur tandis qu’une r´f´rence d´signe l’objet ee e qui contient la valeur. L’op´ration inverse est appel´e d´paquetage (une e e boxing) (voir figure 6. Par exemple une valeur de e e type int correspondra a une case m´moire de 8 octets. Les valeurs sont directement allou´es dans la pile.2. le CLR garde la trace des types contenus dans la pile.4) Figure 6. Les r´f´rences ` e ee sont allou´es dans le tas.Object qui sont respectivement coupl´s avec les types byte.NET (classes. dese e ee e e . Idem pour les types System. toute compilation conduit a un ensemble de types suivant la ` sp´cification du syst`me de types commun . Malgr´ cela un nouveau langage nomm´ C# e e e [Gunnerson and Wienholt ] [Ben Albahari et al. La valeur d’un tel type e contient directement les bits repr´sentant la donn´e valeur. constructeurs. C’est le langage de r´f´rence de la plateforme . d´l´gu´s. interfaces. Char et Object de VB. ´num´rations. ARCHITECTURE GENERALE ET CONCEPTS 155 et tableaux). System.NET les deux types valeur et r´f´rence sont unifi´s pour les diff´rents types de ee e e base du langage. la plate-forme . c Par exemple au type System. Afin de garantir l’int´grit´ des ` e e e types a l’ex´cution.NET (CTS) et le code se retrouve sous e e forme de langage interm´diaire (MSIL).2. En effet.4 – Boxing et Unboxing 6.Boolean du moniteur d’ex´cution . La cons´quence de cette distinction est que deux variables e sont n´cessairement distinctes et que la modification de la valeur de l’une n’aura pas e d’incidence sur l’autre tandis que deux r´f´rences peuvent d´signer le mˆme objet et que ee e e la modification de la valeur de celui-ci sera aussi per¸ue par l’autre. op´rateurs. On retrouve ici la diff´rence entre variable et pointeur dans certains e langages de programmation.NET puisqu’il permet d’en maee nipuler tous les concepts : des instructions du MSIL au syst`me de types . 2002] est apparu en mˆme temps que la e plate-forme.´ ´ 6.NET n’impose a priori aucun langage de programmation.6 Le langage C# Comme nous l’avons vu.Char. Ce langage a fait ´galement l’objet d’une normalisation aupr`s de l’ECMA et e e de l’ISO. tableaux.Byte. Celui-ci transforme le e e type primitif en son homologue objet. Il est ainsi possible de transformer un type valeur en un type de r´f´rence ee par le m´canisme appel´ empaquetage ou objectification (boxing). e structures. Dans . System. char et object de e C# et les types Byte.

156

CHAPITRE 6.

LA PLATE-FORME .NET

tructeurs, accesseurs (setter, getter ), etc.). C’est pourquoi, en d´pit de sa nouveaut´, de e e nombreux d´veloppeurs apprennent ce langage pour programmer des applications .NET. e Pour un programmeur C++ ou Java, la lecture d’un code C# n’est pas d´stabilisante au e premier abord puisque le langage ressemble fortement a un m´lange entre ces langages avec ` e le meilleur de chacun et la simplification des fonctionnalit´s complexes comme l’h´ritage e e multiple en C++. Des exemples de code seront donn´s dans les sections suivantes. e

6.3

Applications distribu´es e

La plateforme .NET offre diff´rents m´canismes permettant de distribuer les applie e cations. Mˆme si le framework est principalement orient´ vers les services web, d’autres e e m´canismes sont disponibles pour le d´veloppeur. Par exemple .NET Remoting est une e e proposition beaucoup plus efficace que les services web pour la distribution d’application. Il est ´galement possible d’utiliser la plateforme de service COM+ ou encore l’intergiciel e orient´ messages MSMQ. La sortie de la version 2.0 du framework a donn´ naissance a la e e ` nouvelle plateforme de distribution de Microsoft «Windows Communication Framework» (nom de code Indigo). Elle vise a unifier le d´veloppement et le d´ploiement des applica` e e tions distribu´es sur la plateforme .NET. Lorsque l’on d´veloppe un service distant, aucune e e technologie de distribution n’est a privil´gier de mani`re syst´matique. Le choix entre les ` e e e diff´rentes technologies d´pend des contraintes de chaque application (rapidit´, standardie e e sation, disponibilit´, mont´e en charge) mais aussi des contraintes de fonctionnement (en e e intranet, volont´ d’avoir des clients l´gers ou lourd). Dans ce chapitre nous pr´sentons les e e e principales technologies offertes dans .NET pour la communication.

6.3.1

Le canevas .NET Remoting

Equivalent de la technologie RMI pour la plateforme JAVA, le Remoting .NET permet le dialogue entre applications situ´es dans des domaines d’applications distincts, en e particulier sur des stations diff´rentes. L’architecture du Remoting .NET est con¸ue de e c mani`re extrˆmement modulaire. Il est en effet possible d’ins´rer ses propres m´canismes e e e e a de nombreux endroits de la chaˆ de traitement ex´cut´e lors de l’envoi d’un message ` ıne e e depuis le composant client vers le composant cible. Dans ce canevas, ont ´t´ s´par´s les ee e e aspects li´s au transport de messages, a l’empaquetage des donn´es et a l’appel a distance. e ` e ` ` Il est par exemple possible en implantant certaines classes du framework de faire communiquer un client .NET avec un composant RMI ou encore un composant CORBA. De mˆme, le mˆme code d’un composant pourra dialoguer sur un canal http en s´rialisant ses e e e donn´es en XML ou alors dialoguer sur un canal TCP en s´rialisant les donn´es envoy´es e e e e dans un format binaire plus compact. En .NET Remoting, lors d’un dialogue client-serveur, des objets peuvent ˆtre pass´s e e en param`tres d’un appel de m´thode. D’autres valeurs peuvent ˆtre retourn´es au client e e e e en r´ponse a sa requˆte. Il existe alors deux modes de passage de param`tres : e ` e e – Passage par valeur : dans ce mode c’est une copie int´grale de l’objet qui est e envoy´e au client. Si le client modifie cet objet une fois r´cup´r´, les modificae e ee tions ne seront pas propag´es cˆt´ serveur. Ce type d’objet impl´mente l’interface e oe e ISerializable. On parle alors d’objet «s´rialisable». e

´ 6.3. APPLICATIONS DISTRIBUEES

157

– Passage par r´f´rence : dans ce mode, c’est une r´f´rence vers un objet qui est ee ee envoy´e au client. Une modification de l’objet soit du cot´ serveur, soit du cot´ client e e e entraˆ ınera la modification de l’objet d´sign´ dans le domaine d’application o` r´side e e u e l’objet. Ce type d’objet impl´mente la classe MarshalByRefObject. On parle alors e de service .NET remoting ou encore de composant .NET Remoting. Un composant .NET Remoting peut ˆtre activ´ de diff´rentes mani`res. La cr´ation e e e e e d’une instance du composant sur le serveur sera soit a la charge du serveur lui-mˆme (on ` e parle alors de service «activ´ par le serveur») soit par le client (on parle de service «activ´ e e par le client»). Le cycle de vie des services Remoting est ´galement variable. On distingue e ainsi trois types de service .NET Remoting : – Les services « activ´s par le serveur a requˆte unique » (mode SingleCall) e ` e Pour chaque invocation d’une m´thode du service par un client, une nouvelle instance e sp´cifique du composant est cr´´e pour r´pondre a la requˆte. C’est le serveur qui e ee e ` e est en charge de l’instanciation du composant. – Les services « activ´s par le serveur et partag´s» (mode Singleton) La mˆme e e e instance du composant serveur est utilis´e pour r´pondre aux diff´rentes requˆtes e e e e des diff´rents clients. Ce mode permet un partage des donn´es entre les clients. C’est e e le serveur qui est en charge de l’instanciation du composant. – Les services « activ´s par le client » Dans ce mode c’est au client de demander e explicitement la cr´ation d’une instance du composant dans l’application serveur e par un appel explicite a l’op´rateur new. Le composant serveur r´pondra alors aux ` e e diff´rentes requˆtes d’un mˆme client e e e

Figure 6.5 – Activation cˆt´ serveur - SingleCall oe

Les applications .NET Remoting dialoguent a travers un canal de communication sur ` lequel circulent des messages. Le framework offre la possibilit´ de d´finir par programe e mation le type de canal utilis´ de mˆme que la mani`re dont les messages sont encod´s e e e e sur ce canal. Deux types de canaux sont fournis au d´veloppeur par le framework : le e canal HttpChannel permettant d’´tablir un dialogue via le protocole HTTP et le canal e TCPChannel permettant un dialogue sur une socket TCP. Au niveau de l’encodage, deux formateurs de messages sont ´galement fournis. Le premier (BinaryFormatter) permet un e encodage binaire des donn´es sur le canal. L’autre (SOAPFormatter) permet un encodage e des messages sous forme de document SOAP. L’utilisateur peut en outre impl´menter ses e propres canaux et ses propres formateurs en impl´mentant respectivement les interfaces e

158

CHAPITRE 6.

LA PLATE-FORME .NET

Figure 6.6 – Activation cˆt´ serveur - Singleton oe

Figure 6.7 – Activation par le client

´ 6.3. APPLICATIONS DISTRIBUEES

159

IChannel et IRemotingFormatter. Le type de dialogue entre un client et un serveur est d´fini par le couple (Canal, Formateur) qui est donn´ par le programmeur de l’applicae e tion. Il est ainsi possible de faire circuler des messages SOAP sur un canal TCP ou encore encoder les messages sous un format binaire compact sur un canal HTTP. Cr´ation d’un service .NET Remoting e Pour comprendre le processus de d´veloppement d’un service en .NET Remoting, e prenons le cas d’un service tr`s simple afin de s’abstraire des m´canismes sp´cifiques e e e a l’impl´mentation du service. Consid´rons un service permettant d’effectuer deux ` e e op´rations : la division r´elle et la division enti`re. Dans un premier temps il s’agit de e e e d´finir l’interface du service ainsi que les classes des donn´es ´chang´es. Ces classes de e e e e donn´es expos´es par le service (param`tres et valeur de retour) doivent pouvoir permettre e e e a leurs instances d’ˆtre pass´es par valeur afin de pouvoir traverser les fronti`res du service. ` e e e On parle alors d’objets « s´rialisables ». En particulier les types de donn´es simples foure e nis par le canevas (int, double, string) sont tous s´rialisables. Dans le cas de la division e enti`re nous d´sirons retourner au client un objet contenant le quotient et le reste de la e e division euclidienne de A par B. Pour cela nous marquons la classe QuotientEtReste par l’attribut [Serializable]. Fichier EchoContract.cs
namespace Div.ServiceContract { [Serializable] public class QuotientEtReste { public int Quotient; public int Reste; } public interface IDivService { double Division(double A, double B); QuotientEtReste DivisionEntiere(int A, int B); } }

Ces deux classes d´finissent la base du «contrat» entre le client et le service. Lorsque le e service est activ´ cˆt´ serveur (mode SingleCall ou Singleton), seules ces classes seront e oe partag´es par les deux parties. e Pour cr´er le service lui mˆme il faut ensuite coder une classe impl´mentant cette e e e interface et la faire h´riter de la classe du classe System.MarshalByRefObjet indiquant e au runtime .NET que les instances de cette classe ne seront pas s´rialis´es par copie mais e e par r´f´rence. ee
namespace Div.ServiceImpl { using Div.ServiceContract; public class DivService: MarshalByRefObject,IDivService { string mName;

160

CHAPITRE 6.

LA PLATE-FORME .NET

static int mCounter=0; public DivService() : this("Anonyme_"+mCounter++){}

public DivService(string name) { this.mName=name; Console.WriteLine("new DivService("+mName+")");; } public double Division(double A, double B) { Console.WriteLine(mName+".Division("+A+","+B+")"); return A/B; } public QuotientEtReste DivisionEntiere(int A, int B) { Console.WriteLine(mName+".DivisionEntiere("+A+","+B+")"); QuotientEtReste RESULT=new QuotientEtReste(); RESULT.Quotient=A/B; RESULT.Reste=A%B; return RESULT; } } }

Notre service poss`de deux constructeurs. Le constructeur par d´faut (sans param`tre) e e e est obligatoire si l’on publie le service en mode « activ´ cˆt´ serveur ». En effet ce sera au e oe runtime du Remoting d’instancier de mani`re transparente les instances de ce service. Nous e d´finissons ´galement un constructeur prenant une chaˆ de caract`re en param`tre et ce e e ıne e e afin que le service soit identifi´ lorsque nous le testerons. Ce constructeur nous permettra e de voir les diff´rences a l’ex´cution entre les diff´rents types de cycle de vie du service (lors e ` e e de l’instanciation). Il reste maintenant a cr´er l’application qui h´bergera notre service. Nous allons cr´er ` e e e deux applications console. L’une h´bergera le service sous les deux modes « activ´ cˆt´ e e oe serveur » SingleCall et Singleton. La deuxi`me application h´bergera les instances du e e service en mode «activ´ par le client». Il existe deux mani`res de sp´cifier au framework ces e e e param`tres : soit par programmation soit a l’aide de fichier de configuration. L’utilisation e ` de fichier de configuration est la m´thode a privil´gier puisqu’elle permet de modifier les e ` e param`tres de d´ploiement sans recompiler l’application. Nous pr´sentons ici l’approche e e e par programmation. La deuxi`me approche par fichier de configuration sera pr´sent´e dans e e e le chapitre suivant . Application hˆte N˚1 en mode « activ´ par le serveur » o e
namespace Div.Host.SAO { using Div.ServiceContract; using Div.ServiceImpl; class DivHost { [STAThread]

´ 6.3. APPLICATIONS DISTRIBUEES

161

static void Main(string[] args) { // cr´ation et enregistrement du canal HTTP 8081 e ChannelServices.RegisterChannel(new HttpChannel(8081)); RemotingConfiguration.RegisterWellKnownServiceType(typeof(DivService), "division/singleton", WellKnownObjectMode.Singleton); RemotingConfiguration.RegisterWellKnownServiceType(typeof(DivService), "division/singlecall", WellKnownObjectMode.SingleCall); RemotingConfiguration.RegisterActivatedServiceType( typeof(Div.ServiceImpl.DivService)); Console.WriteLine("Appuyez sur [Entr´e] pour quitter."); e Console.ReadLine(); } } }

Tout d’abord nous indiquons au Remoting le canal de transport a utiliser. Nous cr´ons ` e une instance de canal HTTP sur le port 8081 que nous enregistrons aupr`s du gestionnaire e de canal ChannelServices. Dans un deuxi`me temps nous devons enregistrer notre service e aupr`s du Remoting. C’est le rˆle de la m´thode RegisterWellKnonwnServiceType pour e o e les services « activ´s par le serveur ». Cette m´thode prend en param`tre la classe des e e e futures instances du service, une adresse URI relative au canal de transport utilis´, ainsi que e le mode de publication choisi pour le service. Nous appelons cette m´thode une premi`re e e fois pour publier le service en mode Singleton et une seconde fois pour publier le service en mode SingleCall. Voyons a pr´sent comment la publication du service s’effectue en mode « activ´ par le ` e e client » Application hˆte N˚2 en mode « activ´ par le client » o e
namespace Div.CAO.Host { using Div.ServiceContract; using Div.ServiceImpl; class DivHost { [STAThread] static void Main(string[] args) { // cr´ation et enregistrement du canal HTTP 8082 e ChannelServices.RegisterChannel(new HttpChannel(8082)); RemotingConfiguration.RegisterActivatedServiceType (typeof(Div.ServiceImpl.DivService)); Console.WriteLine("Appuyez sur [Entr´e] pour quitter."); e Console.ReadLine(); } } }

La diff´rence r´side dans la mani`re de publier le service. Cette fois c’est la m´thode e e e e RegisterActivatedServiceType qui est utilis´e. Elle indique au Remoting qu’il s’agit e d’une classe de service a enregistrer dans le mode « activ´ par le client » et ne prend en ` e param`tre que la classe du service. e

162

CHAPITRE 6.

LA PLATE-FORME .NET

Cr´ation d’un client .NET Remoting e Voyons a pr´sent comment dialoguer avec nos services dans les diff´rents modes. Le ` e e premier exemple montre comment dialoguer avec les deux services publi´s en mode Sine gleton et SingleCall. Afin d’obtenir une r´f´rence distante sur le service, le client utilise ee la m´thode GetObject de la classe Activator, en lui passant en param`tres l’interface e e et l’adresse URI du service distant. Grˆce a ces param`tres le Remoting est en mesure a ` e de localiser l’application h´bergeant le service et de cr´er une r´f´rence transparente pour e e ee le client. Une fois la r´f´rence obtenue le client peut invoquer les m´thodes du service ee e comme ci celui-ci ´tait pr´sent localement. A chaque invocation de m´thode l’appel sera e e e transport´ jusqu’au serveur qui d´terminera l’instance qui devra r´pondre a l’appel client. e e e ` S’il s’agit du composant SingleCall le Remoting cr´era une nouvelle instance du service e sur le serveur a chaque appel client. Dans le cas du service Singleton le Remoting cr´era ` e une instance du service lors du premier appel de m´thode du client e Application cliente N˚1 (dialoguant en mode SingleCall et Singleton)
class Client { [STAThread] static void Main(string[] args) { IDivService service; service=(IDivService) Activator.GetObject(typeof(Div.ServiceContract.IDivService), "http://localhost:8081/division/singleton"); Test("1)Mode Singleton",service); service=(IDivService) Activator.GetObject(typeof(Div.ServiceContract.IDivService), "http://localhost:8081/division/singlecall"); Test("2)MODE SingleCall",service); } static void Test(string testName, IDivService service) { Console.WriteLine(testName); double RESULT1=service.Division(100.0,70.0); Console.WriteLine("100.0 / 70.0="+ RESULT1); QuotientEtReste QR=service.DivisionEntiere(100,70); Console.WriteLine("100 / 70 -> Q="+ QR.Quotient+" R="+QR.Reste); Console.WriteLine("Appuyez sur [Entr´e] pour continuer."); e Console.ReadLine(); } }

En mode « activ´ par le client », l’obtention de la r´f´rence distante sur le service est e ee assez diff´rente. Cette fois c’est la m´thode CreateInstance de la classe Activator qui e e est utilis´e. Celle-ci prend en param`tre l’url (dans un tableau d’objet) de l’application e e qui h´berge les instances du service. C’est a ce moment que le serveur cr´e l’instance e ` e

Deux suffixes de fichiers sont utilis´s : e e – “aspx” pour les pages html qui contiennent du code .3. le d´couplage entre consommateur et fournisseur de service devient r´el e e puisque les deux entit´s partageront non plus une interface.NET.´ 6.2 Les services Web en .NET Les services web ayant d´j` ´t´ pr´sent´ dans un chapitre pr´c´dent (cf. Application cliente N˚21 (dialoguant en mode SingleCall et Singleton) [STAThread] static void Main(string[] args) { object[] url = { new UrlAttribute("http://localhost:8082")}.NET ` permet d’int´grer dans une page html du code . Test("1)MODE CAO". Les applications web con¸ues sur la plate-forme e c . que le serveur Web doit ˆtre. Les pages sont envoy´es au client dans le format SOAP. ea ee e e e e cette section pr´sente uniquement leur mise en œuvre dans le cadre de la plate-forme e . Ce service est ex´cut´ e e par le serveur web. Chaque invocation du client sur le service renouvellera ce bail e pour une dur´e donn´e. Ce m´canisme de bail existe ´galement dans les mode SingleCall e e e e et Singleton. Dans le nouveau e framework Indigo.NET a l’aide de ASP.3. Le Remoting utilise un syst`me param´trable de « bail » permettant e e de contrˆler le cycle de vie de cette instance.NET e e e JSP (Java Server Pages) a d´j` ´t´ une r´ponse a la proposition ASP de Microsoft. pour cela. IDivService service=(DivService) Activator. Aueae e e ` jourd’hui une nouvelle ´tape est franchie.NET. e – “asmx” pour des pages qui contiennent le code du service web. Les changements de version du service impactant l’interface implique ´galement la modification du client.url).param. Les pages sont envoy´es au client dans le format HTML. object[] param = { "Icar"}. } Evolution future Un aspect a prendre en compte lorsque l’on utilise le .NET : celui contenant l’interface du service.NET devant ˆtre interpr´t´e e ee par le serveur web. e e .service). Lorsque le bail expire apr`s un certain temps.NET.NET un mˆme mod`le d’application. e Cette section pr´sente essentiellement la mise en œuvre des services web dans l’archie tecture . 6. Le client peut alors appeler diff´rentes m´thodes sur cette mˆme e e e instance du service. Il va de soit. mais plutˆt un contrat de e o service dans un format standard tel que WSDL. APPLICATIONS DISTRIBUEES 163 qui servira le client. ASP. e e capable d’ex´cuter du code . ASP.NET partagent avec toutes les autres applications .Active Server Pages). En effet ces deux entit´s doivent partager un mˆme ee e e assembly . Ce code est ex´cut´ par le serveur e e e Web lorsque la page est demand´e.NET (nouvelle version d’ASP . chapitre 4. o e le serveur d´truira l’instance. Un mod`le de d´veloppement web unifi´.NET Remoting est le couplage ` qu’il cr´´ entre le client et le serveur.CreateInstance(typeof(DivService).

ASP. de la r´solution de l’URL de e e chaque requˆte vers une application et de la distribution de la requˆte a l’application pour e e ` traitement compl´mentaire. Il fournit en outre. le e e e ` syst`me bascule vers la nouvelle version. par un gestionnaire de requˆtes. Les modules et gestionnaires de e requˆtes HTTP sont simplement des classes g´r´es qui implantent des interfaces sp´cifiques e ee e d´finies par ASP. les requˆtes HTTP sont rout´es via un pipeline de modules e e HTTP et en dernier lieu. Par exemple.164 CHAPITRE 6. e des services pour faciliter le d´veloppement d’applications (tels que les services de gese tion d’´tat) et des mod`les de programmation haut niveau (tels que ASP+ Web Forms et e e ASP. Cette machine virtuelle haute performance est e bas´e sur une architecture de bas niveau similaire a l’architecture ISAPI traditionnellement e ` fournie par Microsoft Internet Information Services (IIS). Il englobe donc les applications web g´n´rant des pages pour un navigateur et les e e services web.NET b´n´ficie aussi des avantages du mod`le d’assemblage du Common e e e Language Runtime pour simplifier le d´veloppement d’applications. tels que les services web et Web Forms. cette instance est arrˆt´e. Il est e e e e responsable du traitement de toutes les requˆtes HTTP. session et utilisateur.NET. Le web constitue un mod`le fondamentalement sans ´tat et e e e sans corr´lation entre les requˆtes HTTP. l’´tat session de ASP.NET utilise les avantages du Common Language Runtime et de la plate-forme . Ceux-ci ne sont jamais verrouill´s de fa¸on a pouvoir ˆtre e c ` e remplac´s mˆme lors de l’ex´cution de l’application. L’environnement d’ex´cution HTTP dans la plate-forme .NET est au cœur d’ASP. L’´tat ” session ” est sp´cifique a une session utilisateur de l’applie e ` cation. e e e lance une nouvelle instance de l’application avec le nouveau code et commence a router les ` requˆtes entrantes vers cette application. Les mod`les de proe e e grammation de haut niveau.NET utilise le mod`le de d´ploiement de la plate-forme e e e . L’architecture en pipeline facilite grandement l’ajout de services e aux applications : il suffit de fournir un module HTTP. ee e ee Le traitement des requˆtes HTTP e Au sein d’une application. Cet environnement d’ex´cution e HTTP est constitu´ de ” managed code ” ex´cut´ dans un processus sp´cifique. sont g´n´ralement e e implant´s comme gestionnaires de requˆtes. mais toutes les requˆtes HTTP sont rout´es au e e e travers du mˆme pipeline.NET Services Web). car les applications n´cessitent habituellement de conserver leur ´tat entre plue e sieurs requˆtes.NET am´liore les services de gestion d’´tat introduits par ASP pour e e e fournir trois types d’´tat aux applications web : application. ASP. une application web est un ensemble d’URL dont la racine est une URL e de base. robuste et ´volutif aux applie cations web.NET est stock´ dans ` e e e . Ceci peut rendre l’´criture d’applications web e e e difficile. L’´tat e e ” application ”.NET e pour le traitement des requˆtes HTTP. la gestion e e d’´tat et des traces sont implant´es en tant que modules HTTP. la s´curit´. Le syst`me d´tecte les modifications de fichiers.NET pour fournir un environnement fiable. Une application peut ˆtre associ´e a plusieurs e e e e ` gestionnaires de requˆtes (un par URL). Lorsque toutes les requˆtes en suspens trait´es e e e par l’instance de l’application existante ont ´t´ trait´es. Les e ` ` administrateurs n’ont pas besoin d’arrˆter le serveur Web ou l’application pour mettre a e ` jour les fichiers d’application.NET Dans ce mod`le. ASP. Lorsque les fichiers sont mis a jour.NET bas´ sur les assemblages et permet la mise a jour des applications a chaud. tout comme pour ASP. LA PLATE-FORME . ASP. Ce mod`le de programmation d’applications web est une ´volution d’ASP e e (Active Server Pages). est sp´cifique a une instance de l’application et e ` n’est pas persistant. Contrairement a l’´tat session de ASP.

NET sont n´cessaires. Nous montrons cependant ici e e comment se passent les ´tapes de d´veloppement sans l’aide de cet IDE afin de ne pas trop e e masquer les m´canismes impliqu´s. double B) { return A/B.Web.NET e e e sont les suivantes : – Impl´menter la classe du service en le faisant h´riter de la classe Syse e tem. aux modules HTTP et aux gestionnaires de requˆtes de stocker a la demande des objets e ` arbitraires dans le cache. e e – Compiler le service (dans le r´pertoire virtuel) e – D´ployer le service sur le serveur web e Tout d’abord il s’agit d’´crire le service lui mˆme. Un cache e de sortie permet d’enregistrer les pages g´n´r´es en entier et un cache partiel permet de e ee stocker des fragments de pages.Services. L’´tat utilisateur est donc utile pour stocker les pr´f´rences e ee de l’utilisateur et d’autres informations de personnalisation.NET offre de nombreux m´canismes simplifiant au maximum la cr´ation e e de service web. } . L’´tat utilisateur est similaire a l’´tat session mais en g´n´ral. ASP.cs Le service web using System. Si des services de gestion d’´tat e e e autres que ceux fournis par ASP.WebService – D´corer l’impl´mentation en faisant pr´c´der chaque d´claration de m´thode devant e e e e e e ˆtre expos´e par l’attribut [WebMethod] e e – Cr´er un r´pertoire virtuel sur le serveur (exemple IIS).Web.´ 6. il n’exe ` e e e pire jamais et est persistant. En particulier tous les aspects li´s a SOAP et WSDL peuvent devenir e ` compl`tement transparents pour le d´veloppeur. Reprenons l’exemple de la section e e pr´c´dente sur le service de division.Services.NET e Le framework . Cr´ation d’un Service Web XML en ASP. Voici le code C# permettant d’en faire un service e e web DivWebService. ils peuvent ˆtre fournis par un e e module tiers. Ceci rend l’´tat session utilisable lorsqu’une application est d´ploy´e sur un ensemble e e e de serveurs web. namespace Div { public class DivWebService: WebService { [WebMethod] public double Division(double A. Tous les services de gestion d’´tat sont implant´s en tant que modules HTTP et peuvent en cons´quence ˆtre facilee e e e ment ajout´s ou supprim´s du pipeline d’une application.3. e e Les ´tapes du processus de d´veloppement et de d´ploiement d’un service web en . APPLICATIONS DISTRIBUEES 165 un processus distinct et peut mˆme ˆtre configur´ pour ˆtre stock´ sur un ordinateur dise e e e e tinct. De plus s’utilisation de l’environnement e e de d´veloppement de Microsoft Visual Studio pousse encore plus loin la simplicit´ de e e cr´ation et de d´ploiement de service web en quelques click. using System.NET fournit aussi des services de cache pour am´liorer les performances. Des classes sont fournies pour permettre aux applications.

Nous compilerons le code dans une e biblioth`que DivWS. e D`s lors l’application aura comme racine distante l’url http ://localhost/icar. e e e Ainsi cette m´thode ne sera pas accessible aux clients.asmx utilisant la notion de ”code behind” doit ˆtre mise en œuvre.cs http://api. celle-ci doit h´riter de la e e e classe du framework System. il nous faut d´ployer notre service au sein d’une application web h´berg´e e e e e par le serveur IIS de Microsoft. Le service est alors op´rationnel. ` ` e Le fichier div. . Pour tester le service lui mˆme il faut se rendre a l’adresse e ` http ://localhost/icar/div.NET fournit un utilitaire wsdl.WebServices. LA PLATE-FORME .Web.NET public void UneMethodeNonPubliee() { } } } Pour qu’une classe puisse ˆtre expos´e via un service web.166 CHAPITRE 6.wsdl Le framework .dll grace a la ligne de commande suivante : e ` csc.WebService. Cr´ons e e un r´pertoire bin dans lequel nous pla¸ons la biblioth`que compil´e pr´c´demment. Voici la e e ligne de commande permettant d’obtenir le code C# du proxy : wsdl. De plus chaque m´thode qui e devra ˆtre publi´e devra ˆtre pr´c´d´e de l’attribut [WebMethod] Nous pouvons remarquer e e e e e e dans notre exemple que la m´thode UneMethodeNonPubliee ne sera pas publi´e dans e e l’interface du service web car sa signature n’est pas pr´c´d´e de l’attribut [WebMethod].exe /o:google.google. Nous sp´cifions dans son entˆte qu’il s’agit d’un web service e e e ainsi que le nom du fichier source C# correspondant a cette classe a des fins de d´bogage.exe permettant a partir de cette des` cription de g´n´rer les classes proxy permettant de consommer le service web.asmx ?WSDL.NET g´n´re automatiquement un formulaire web e e qui permet d’appeler les diff´rentes WebMethod du service web. Nous la nommerons par exemple icar. La page e c e e e e aspx du service sera plac´ a la racine de l’application.asmx <%@ WebService Class="Div.google. Il e` e peut imm´diatement ˆtre test´ en utilisant un navigateur web quelconque et en allant a e e e ` l’adresse http ://localhost/icar/div. Cette page permet de visualiser le contrat WSDL de notre service.com/GoogleSearch.wsdl .cs Pour pouvoir tester notre service une page div.com/GoogleSearch. Pour cela nous pouvons utiliser la console d’administration de Windows afin de cr´er un nouvelle application.dll /t:library DivService. Celle-ci se trouve a l’adresse ` http ://api. Avant toute chose il faut disposer de la description WSDL de ce service. e Utilisation de Services Web Nous allons voir a pr´sent comment consommer un service web.asmx.exe /out:bin\DIVWS.DivWebService"%> A pr´sent. Nous prendrons comme e exemple un service Web assez pratique : celui offert par Google c .

int b).WriteLine(‘‘Correction: ‘‘+rep).doSpellingSuggestion(GOOGLE_KEY. string rep=service. ` e e e e Voici un exemple illustrant ces deux possibilit´s : e class Exemple { public delegate int Prototype(int a. La synchronisation entre e e e l’appel et la lecture du r´sultat est a la charge du programmeur qui peut : e ` – effectuer une attente bloquante du r´sultat en appelant la m´thode EndInvoke (). APPLICATIONS DISTRIBUEES 167 Le fichier g´n´r´ google. static int PGCD(int a. } } Le programme une fois ex´cut´ affichera le texte corrig´ « Intergiciel » Dans notre e e e exemple nous utilisons l’op´ration doSpellingSuggestion du Web Service en lui donnant e comme entr´e d’une part une cl´ d’authentification (fournie par Google c permettant e e d’acc´der au service web apr`s enregistrement en ligne) et en deuxi`me param`tre la e e e e phrase a corriger.3 L’Asynchronisme Il existe deux possibilit´s pour effectuer des appels asynchrones de m´thode dans .NET e e et la seconde repose sur les files de messages disponible dans la plate-forme Windows. il est n´cessaire e e d’utiliser le principe des d´l´gu´s qui fournit pour chacun d’entre eux deux m´thodes : ee e e BeginInvoke () et EndInvoke ().cs contient diff´rentes classes : celles du proxy vers le service e ee e Web et les classes de donn´es manipul´es par le service. Nous d´taillons ci-apr`s ces deux possibilit´s.phrase).3.NET.NET des appels asynchrones de m´thode. e e e Appel asynchrone Pour pouvoir effectuer en . e class TestGoogle { static void Main(string[] args) { string GOOGLE_KEY="-xxxxx-". e e La premi`re utilise les appels asynchrones de m´thode disponible dans la plate-forme . e e Voici a pr´sent un programme client simple permettant d’effectuer une correction d’un ` e mot mal orthographi´.3. ` 6. GoogleSearchService service=new GoogleSearchService(). int b) { // calcul du pgcd return c. BeginInvoke() permet d’effectuer l’appel asynchrone et EndInvoke () permet de r´cup´rer les r´sultats de cet appel.´ 6. Console.ReadLine(). Console. } . le code e e e e a ex´cuter pour r´cup´rer le r´sultat. string phrase="Intergicielle". e e – ˆtre pr´venu de la disponibilit´ du r´sultat en transmettant lors de l’appel.

} static void Main () { // cr´ation de l’instance du d´l´gu´ e e e e Prototype p = New Prototype (PGCD). le client et le serveur ne sont plus oblig´s ` e d’ˆtre connect´s et les requˆtes des clients sont stock´es dans une file sous forme de mese e e e sages. ces services repose sur Enterprise Services qui est la nouvelle appellation de COM+ et ils sont pr´sent dans la plate-forme support (Windows) que . de plus en plus nombreux. Les principaux services techniques permettent l’acc`s aux donn´es. de la proc´dure e e e BeginInvoke permet de transmettre la r´f´rence d’un objet utilisable simultan´ment dans ee e le thread qui d´clenche l’appel asynchrone et dans celui qui ex´cute la m´thode de finalie e e sation.AsyncDelegate. Ce sont ces services qui e e e nous allons d´tailler dans cette section.MSMQ). Il est par contre n´cessaire d’installer sur les stations hˆtes le m´canisme de gestion e o e de file de messages (Microsoft Message Queue . new AsyncCallBack(FinCalcul). LA PLATE-FORME . } } Le dernier param`tre. 25. sont destin´s` simplifier la tˆche des ea a programmeurs en leur ´vitant d’avoir a d´velopper tout ce qui peut petre mis en commun. e . null). non utilis´ dans l’exemple ci-dessus. 6.4 Composants et services techniques Les services techniques. null). null.EndInvoke(A).BeginInvoke (10.Net. 25). e ` e Dans la plate-forme . // appel asynchrone du d´l´gu´ en transmettant la proc´dure a e e e e ` // ex´cuter a la fin de l’appel (m´thode de finalisation) e ` e IAsyncResult A = p. Les Files de message Contrairement a l’appel asynchrone de . int c = p. // lecture bloquante du r´sultat e c = p. la gestion de la e e s´curit´ applicative. la mise en œuvre de transactions distribu´es.168 CHAPITRE 6. // appel asynchrone du d´l´gu´ e e e IAsyncResult A = p.BeginInvoke (10.NET e utilise. 25.NET static void FinCalcul(IAsyncResult A) { // r´cup´ration du r´sultat e e e Prototype p = (Prototype) (IAsyncResult A). // appel synchrone du d´l´gu´ e e e c = p (10.EndInvoke(A).NET. int c.

g´n´rant pas l` mˆme de tr`s nombreux acc`s r´seaux. e e e e Parmi toutes les classes qu’ADO regroupe.6.1 Acc`s aux donn´es e e Pratiquement toutes les applications utilisent un syst`me de persistance au sens large e du terme. Les o e e instances de cette classe repr´sentent une partie de la base.8 – Acc`s aux donn´es e e . e e L’appelation ADO (ActiveX Data Object) englobe a la fois l’ensemble des classes du ` framework . ou r´ciproquement.NET utilis´es pour manipuler les donn´es contenues dans les SGBD relatione e nels et la philosophie d’utilisation de ces classes. e l’instance contient des lignes extraites et ´ventuellement les contraintes d’int´grit´s ase e e soci´es a la table.4. ADO permet la connexion avec une base de donn´es en mode : e – connect´ : si l’application charge des donn´es de la base au fur et a mesure de ces e e ` besoins et envoie les modifications a ces donn´es d`s qu’elles surviennent. ` e e – d´connect´ : si l’application charge des donn´es de la base. e e – par sauvegarde de la valeur de l’´tat de l’objet dans une base de donn´es relationnelle. Cette classe est a utiliser pour tout travail en mode d´connect´. Cette e ` ` e e classe permet aussi le passage d’un DataSet a un document XML ou r´ciproquement. ` e Figure 6. Dans la plate-forme . par exemple depuis un fichier XML. les exploite hors ligne et e e e les met a jour si n´cessaire ult´rieurement. cette persistance peut ˆtre r´alis´e de plusieurs e e e mani`res : e – par s´rialisation de l’´tat de l’objet sous forme de flots d’octets ou en XML . Pour chacun de ces tables. Elle peut aussi r´cup´rer ses donn´es de ` e e e e e mani`re externe a la base. Le mode e e e a e e e e d´connect´ n’a pas cet inconv´nient mais est beaucoup plus consommateur de m´moire e e e e utilis´e pour stocker de mani`re temporaire les donn´es n´cessaires. COMPOSANTS ET SERVICES TECHNIQUES 169 6. DataSet joue un rˆle pr´pond´rant.NET. e La faiblesse du mode connect´ r´side dans les multiples acc`s qui sont effectu´s sur e e e e la base de donn´es.4. les manipuler et les e ` sauvegarder dans la base .

cr´er les objets et effectuer les appels de m´thodes. foreignkey). typeof(String)). DataColumn title = books.Columns. DataRow row = books. DataColumn isbn = books. DataColumn name = new authors. // ajouter les tables au DataSet dataset. authors. DataColumn[] foreignkey = new DataColumn[] {authid}.Add("ISBN".Add("Name".PrimaryKey = new DataColumn[] {id}.Tables. authors. books. 6. // d´finir les colonnes et les cl´s e e DataColumn id = authors. typeof(Int32)). dataset. typeof(String)). authors.PrimaryKey = new DataColumn[] {isbn}. dataset. id.Columns.NewRow(). books.Add("Title". DataRelation bookauth = new DataRelation("BookAuthors". il peut contrˆler la e e o .AutoIncrement = true.Tables. DataTable books = new DataTable(‘‘Book’’).typeof(String)).Relations.typeof(Int32)). DataTable authors = new DataTable(‘‘Author’’).Add (bookauth).Rows.NewRow().NET Exemple de manipulation d’un DataSet : // cr´er le DataSet et d´finir les tables e e DataSet dataset = new DataSet(). DataColumn authid = books.Rows. dataset.Add (authors). LA PLATE-FORME .Add(shkspr). shkspr["Name"] = "William Shakespeare". row["AuthID"] = shkspr["ID"]. Ceci am´liore la s´curit´ e e e e e globale du syst`me ainsi que sa fiabilit´.Add("ID". dataset.AcceptChanges(). row["Title"] = "MacBeth".Add (books).4. // Ajouter des donn´es et sauvegarder le DataSet e DataRow shkspr = authors.Add("AuthID". L’environnement d’ex´cution ´tant utilis´ pour e e e e e charger le code. row["ISBN"] = "1000-XYZ".Add(row).DataSetName = ‘‘BookAuthors’’.2 S´curit´ e e Les services de s´curit´ int´gr´s a la plate-forme permettent de s’assurer que seuls les e e e e ` utilisateurs autoris´s acc`dent aux ressources d’un ordinateur et seul le code ayant acquis e e les droits suffisants peut ex´cuter les actions n´cessitant ces droits.Columns.PrimaryKey.Columns.Columns.170 CHAPITRE 6.

l’environnement d’ex´cution prend en charge la e e e e s´curit´ bas´e sur les rˆles. mais il est aussi possible que le code utilise un compte e de ” service ” sp´cifique par modification de l’identit´ en cours d’ex´cution (modification e e e de l’objet Principal). il suffit de d´finir un attribut sur la m´thode de classe. L’environnement e e e e e d’ex´cution d´termine les rˆles auxquels l’utilisateur appartient et accorde ensuite les aue e o torisations en fonction de ces rˆles. des permissions et la notion e e e e d’objet Principal et de rˆles. ainsi que celles concernant l’identit´ du code. Des e e e e strat´gies d’attribution d’autorisations sont assign´es a chaque rˆle. Les droits de l’utilisateur sur l’environnement et la plate-forme sont g´n´ralement e e contrˆl´s a l’aide de listes de contrˆle d’acc`s qui sont compar´es a l’identit´ Windows oe ` o e e ` e du thread en cours. Les rˆles repr´sentent des e e o e cat´gories d’utilisateurs et sont d´finis lors du d´veloppement ou du d´ploiement. les d´veloppeurs peuvent sp´cifier les autorisations a ` e e e e e requises par leur code pour effectuer une tˆche. une violation de s´curit´ est d´clar´e sous la forme du signalement d’une exception. mais e e e e e e ´galement une s´curit´ bas´e sur les rˆles. COMPOSANTS ET SERVICES TECHNIQUES 171 s´curit´ et assurer l’application des strat´gies de s´curit´ lorsque du ” managed code ” e e e e e est charg´ et ex´cut´. l’environnement d’ex´cution e e v´rifie que le code peut se voir accorder les autorisations qu’il a demand´es. pour e e ´viter toute utilisation malveillante du code.Demand. a ceci pr`s que les autorisations sont bas´es e e e ` e e sur l’identit´ de l’utilisateur et non sur l’identit´ du code. Les e e e e strat´gies d’attribution d’autorisations (connues sous le nom de trust policies) sont ´tablies e e par les administrateurs des syst`mes et sont bas´es sur des informations relatives au code e e telles que son origine ou les demandes d’autorisation de l’assemblage. Il est possible de programmer des contrˆles e o de s´curit´ dynamiques si les autorisations requises d´pendent d’informations inconnues e e e avant l’ex´cution. La plate-forme . Si ce n’est pas le e e cas. Pour garantir que les utilisateurs appartenant a un certain o ` rˆle appellent une m´thode donn´e.NET fournit une infrastructure compl`te et extensible pour la gestion e de la s´curit´ d’acc`s utilisateur y compris des identit´s. La s´curit´ bas´e sur les rˆles est con¸ue sur le mˆme mod`le e e e o e e e o c e e d’autorisations que la s´curit´ d’acc`s au code. Lors du chargement et des appels de m´thodes. Ces e e informations. o S´curit´ d’acc`s utilisateur La s´curit´ d’acc`s utilisateur sert a d´terminer les droits e e e e e e ` e associ´s a l’identit´ en cours.NET propose une s´curit´ d’acc`s au code. Lors de l’ex´cution. La technologie . Le code peut par exemple n´cessiter a e une autorisation d’´criture sur un fichier ou d’acc`s aux variables d’environnement. sont stock´es au niveau du e e composant. Il est possible de v´rifier ce qu’un appelant a le droit de faire e ` e e de nombreuses fa¸ons.4. Les d´veloppeurs e peuvent ´galement sp´cifier explicitement les autorisations qu’ils ne souhaitent pas.6. e e ` o e l’identit´ de l’utilisateur pour lequel le code est ex´cut´ est d´termin´e. e e e e o Grˆce a la s´curit´ d’acc`s au code. Dans les applications avec une interface utilisateur. o e e e e comme indiqu´ dans le code suivant : e [PrincipalPermission(SecurityAction. il est possible c d’emprunter l’identit´ de l’appelant. role="Managers")] public void managersReservedMethod () { // Ce code ne s’ex´cutera pas si le Principal associ´ au e e // thread n’a pas ‘‘Managers’’ lorsque IsInRole est appel´ e . e Outre la s´curit´ d’acc`s au code.

l’utie e e e ` lisateur et l’application. e Communication s´curis´e Outre l’authentification des utilisateurs et des requˆtes e e e d’autorisation. une ape o plication doit effectuer des contrˆles d’autorisation complexes reposant sur une politique o d’autorisation qui requiert des combinaisons de permissions combinant simultan´ment la e s´curit´ utilisateur. offre les options suivantes pour : – S´curiser l’ensemble du canal : e . Par exemple. Ces types de contrˆles d’autorisation sont a effectuer dans le code e o ` de l’application sous forme de programmes et requi`rent g´n´ralement un d´veloppement e e e e cons´quent.NET } Si le composant est bas´ sur un d´ploiement dans Enterprise Services et authentifie e e les utilisateurs via Windows. LA PLATE-FORME . Pour ce faire. . mais il est ´galement possible de d´cider du lancement ou non du code. comme la plupart des plates-formes. – l’URL dont provient l’assembly .NET sont les suivantes : e Internet. l’ordinateur.172 CHAPITRE 6. la s´curit´ d’acc`s au code mais aussi des permissions li´es aux pae e e e e e ram`tres de l’appel. Impl´mentation de contrˆles d’autorisation complexes Dans certains cas. en fonce e tion du code essayant d’y acc´der.NET. Les zones d´finies par la technologie . il est aussi possible d’utiliser la gestion des rˆles Enterprise o Services comme indiqu´ dans le code ci-dessous. il est aussi n´cessaire de s’assurer que la communication entre les diff´rents e e ´l´ments d’une application soit s´curis´e afin d’empˆcher toute attaque de “reniflage” ou ee e e e de falsification lors de la transmission ou du placement des donn´es dans une file d’attente. e – le hachage cryptographique de l’assembly . e Une communication s´curis´e implique la s´curisation des transferts de donn´es entre e e e e les composants distants. – la signature num´rique de l’´diteur de l’assembly . cela permet d’empˆcher que des objets e e soient appel´s a partir de scripts lanc´s de mani`re inopportune par une personne dispoe ` e e sant de privil`ges suffisants. – la zone dont provient l’assembly. Poste de travail. e [SecurityRole("Managers")] public void managersReservedMethod () { // Ce code ne s’ex´cutera pas si le Principal associ´ a e e ` // l’utilisateur n’est pas dans le groupe ‘‘Managers’’ } S´curit´ d’acc`s au code La s´curit´ d’acc`s au code permet de d´finir les droits de e e e e e e e l’assembly. intranet. de confiance et non fiable. NoZone. Vous pouvez contrˆler l’acc`s au code a l’aide des ´l´ments e o e ` ee suivants : – le r´pertoire d’installation de l’application . e e – le site dont provient l’assembly . Les politiques de s´curit´ peuvent ˆtre appliqu´es a l’entreprise. – le nom fort cryptographique de l’assembly .

// transfert 1000 euros du compte de Michel au compte de David } } [Transaction(TransactionOption. // connection a la base de donn´es pour lecture du solde du compte ` e int solde_client1 = client1.4.NET d’utiliser ADO. e e e – Cryptage de l’ensemble d’un message.ConsulteCompte (ID_client1).ConsulteCompte (ID_client2).1 et il faut. e Ci-dessous.3 Transaction Pour g´rer des transactions distribu´es avec plusieurs bases de donn´es. // modification locale des montants des comptes . Pour illustrer la mise en œuvre des transactions nous allons prendre l’exemple tr`s classique du transfert bancaire entre deux comptes. e – S´curisation des donn´es : e e – Signature d’un message. ‘‘David’’. comme pour la s´curit´ utiliser le gestionnaire de transactions disponible dans Enterprises Services (DTC : e e Distributed Transaction Coordinator). ID_client2. l’ensemble du message dec vient illisible en cas de compromission des paquets du r´seau. // cr´ation de la connection a la base de donn´es e ` e client1. 1979. la partie essentielle du source de l’application : public class Programme { static void Main () { TdF transfert = new TdF (). Ce m´canisme constitue un choix judicieux lorsque les deux points d’entr´e e e de la communication sont bien connus et sous le contrˆle de la mˆme entit´ admio e e nistrative. e – Cryptage des parties sensibles d’un message si seulement des parties du message doivent ˆtre prot´g´es. ctx_client2.RequiresNew)] public class TdF : ServicedComponent { // h´rite d’un objet Services Interprises e public void Transfert (String ctx_client1. 1000) . Les signae e tures peuvent ˆtre utilis´es pour l’authentification au sein d’un mˆme processus. Compte client2 = new Compte ().6. – R´seau priv´ virtuel (VPN) qui permet d’´tablir un transport IP point a point e e e ` sur Internet (ou d’autres r´seaux). e e e 6. int solde_client2 = client2. e L’architecture de l’application est d´crite dans la figure 6.4.NET 6.9. 1960. il n’est pas e e e possible dans la technologie . montant) { Compte client1 = new Compte (). client2.4. Le cryptage d’un e message a l’aide d’algorithmes appropri´s permet ´galement de d´tecter les mes` e e e sages falsifi´s. Cela permet de d´tecter les messages falsifi´s.Connect (ctx_client1). De cette fa¸on.Transfert (‘‘Michel’’. COMPOSANTS ET SERVICES TECHNIQUES 173 – Protocole SSL (Secure Sockets Layer) recommand´ pour les communications avec e le protocole HTTP. int ID_client1. tranfert. Il s’agit d’un standard tr`s r´pandu et il est g´n´ralement e e e e permis d’ouvrir des ports SSL sur les pare-feu. – IPSec.Connect (ctx_client2).

celle-ci se faisant par l’utilisation de l’attribut Transaction sur une classe (dans l’exemple sur les classe TdF et Compte).MetAJour (ID_client1.MetAJour (ID_client2. int montant) { // connexion a la base de donn´es pour modification du solde du compte ` e // fermeture de la connexion a la base de donn´es ` e } } Il n’est pas n´cessaire d’ins´rer dans le code du programme une manipulation explicite e e des transactions. Ils sont d´crits e ` e ` e .174 CHAPITRE 6.NET Figure 6. LA PLATE-FORME . client2. solde_client2 += montant. // connection a la base de donn´es pour mise a jour du compte ` e ` client1. } } [Transaction(TransactionOption. solde_client2).9 – Application de transfert entre comptes solde_client1 -= montant.Required) public classe Compte : ServiceComponent { public void Connect (String ctx_client) { // ouverture de la connexion a la base de donn´e ` e } public int ConsulteCompte (int ID_client) { // connexion a la base de donn´es pour lire le solde du compte ` e } [autocomplete(true)] public void MetAJour (int ID_Client. solde_client1). Un composant peut adopter cinq comportements diff´rents face a la cr´ation ou a l’utilisation d’une transaction.

5.5. e e – NotSupported : les instances de ce composant n’utilisent pas de transaction mais peuvent ˆtre utilis´es pendant une transaction. int montant) { ContextUtil. Toutes les connexions avec des bases de donn´es e e utilis´es pendant cette transaction seront enrˆl´es dans celle-ci.SetAbort ().` 6. } 6. // connexion a la base de donn´es pour modification du solde du compte ` e // fermeture de la connexion a la base de donn´es ` e // si (l’op´ration s’est bien d´roul´e) alors la transaction peut continuer e e e ContextUtil. Il est aussi possible de provoquer par programme un arrˆt de la transaction : e // pas d’attribut pour cette m´thode e public void MetAJour (int ID_Client. e – Required : les instances de ce composant doivent ˆtre ex´cut´es en mode transactione e e nel. EXEMPLE : MISE EN ŒUVRE D’UNE APPLICATION COMPL ETE 175 par les cinq options de l’attribut Transaction suivant : – Disabled : les instances de ce composant n’utilisent pas de transaction et ne doivent pas ˆtre appel´es pendant une transaction. e oe Il est aussi possible de modifier l’option transactionnelle de chaque instance par programme et de cr´er explicitement par programme des transactions.5 6. Toutes les connexions avec ee e e des bases de donn´es utilis´es pendant cet appel seront enrˆl´es dans la transaction e e oe courante.DeactivateOnReturn = true. La transaction est propag´e aux instances de e e e composants appel´es par un composant en mode transactionnel Supported.SetComplete (). Il est possible de signaler le mode de terminaison e e e d’une m´thode ex´cut´e dans une transaction.1 Exemple : Mise en œuvre d’une application compl`te e Architecture g´n´rale e e Afin de d´crire l’application d’exemple que nous allons mettre en œuvre. la fin de la transaction correspond a la fin de la e ` m´thode ayant provoqu´ sa cr´ation. // sinon la transaction doit etre arr^t´e ^ e e ContextUtil. Attention. e Si la transaction a ´t´ cr´´e par le moniteur transactionnel de COM+ suite aux e e ee attributs pos´s sur les composants. L’attribut AutoComplete positionn´ sur la e e e e m´thode MetAJour () permet de provoquer un arrˆt de la transaction si cette m´thode ne e e e se termine pas normalement. – RequiredNew : un appel de m´thode sur une instance de ce composant provoque la e cr´ation d’une nouvelle transaction. nous nous e appuierons sur le cahier des charges suivant : . soit l’appel n’´tait pas dans une transaction et une oe e transaction est alors cr´´e pour ex´cuter cette m´thode. Soit l’appel de m´thode v´hiculait un contexte transactionnel et cette instance e e est enrˆl´e dans la transaction. la transaction n’est pas e e propag´e aux instances de composants appel´es par un composant en mode transace e tionnel NotSupported – Supported : les instances de ce composant n’utilisent pas de transaction et peuvent ˆtre utilis´es pendant une transaction. En cas de terminaison normale la transaction se poursuit.

NET Remoting (4) encapsulant les fonctionnalit´s de la biblioth`que TTS. 6. nous pr´sentons ici e e e e le processus de d´veloppement utilis´. Nous cr´erons donc un e e service . – Nous d´sirons offrir ce service a des applications tierces en dehors de la zone s´curis´e e ` e e de l’Intranet (5). Les choix de conception e .NET Remoting. e e Ce service sera distribu´ via un canal TCP Binaire permettant un acc`s rapide pour e e les clients de l’Intranet.NET – Nous disposons (virtuellement) d’une biblioth`que de synth`se vocale (1) pour la e e plateforme Windows XP que nous appellerons TTS. Figure 6.5.2 Impl´mentation et d´ploiement des services e e Etapes de la mise en œuvre Avant de d´crire en d´tails comment impl´menter cette architecture.10 – Architecture g´n´rale de l’application e e L’avantage de d´porter le traitement d’un service r´side souvent dans le fait que les e e clients de ce service ne disposent pas eux-mˆmes des fonctionnalit´s leur permettant d’efe e fectuer ce traitement sur le terminal sur lequel ils tournent. e – Certaines autres applications (3) de l’Intranet s´curis´ n´cessitent ´galement l’utilie e e e sation d’une biblioth`que de synth`se vocale. Nous mettons alors en place un Service Web (6) constituant ainsi une passerelle standardis´e vers e le service . Nous d´velopperons cette application en essayant de e e e modulariser le plus possible les diff´rentes parties de l’architecture. Nous voulons mettre a disposition ce service de Synth`se vocale ` e pour tout type de plate-forme (un client Java sous linux par exemple).176 CHAPITRE 6. Nous pouvons ´crire une applie cation (2) pour Windows XP qui inclut directement cette biblioth`que. mais nous ne poss´dons pas de version e e e de la biblioth`que pour ces plateformes (exemple d’un PDA). LA PLATE-FORME .

Cela consistera en une bie e blioth`que pour l’impl´mentation du service ainsi qu’une application pour h´berger le e e e service. using System. nous d´finirons l’interface e e e e e e du service.Schema { [Serializable] XmlType("sentence")] public class Sentence { public Sentence(){ } public Sentence(string lang. Dans un deuxi`me temps.Xml. En e r´ponse le service renverra un objet TTSResult dans lequel le flux audio sera repr´sent´ e e e par un tableau d’octets. string text) { this. using System.` 6.Serialization. EXEMPLE : MISE EN ŒUVRE D’UNE APPLICATION COMPL ETE 177 sont donn´s ici a titre indicatif mais peuvent ˆtre mis en œuvre de mani`re assez g´n´rale. } XmlAttribute("lang")] public string Language. } XmlElement("audio")] public byte[] AudioStream. nous ´crirons un client pour ce service afin de le tester.Xml. Les types de donn´es ´chang´es e e e Le client enverra sa requˆte sous la forme d’un objet Sentence contenant un texte a e ` convertir vocalement ainsi que la langue dans laquelle la synth`se vocale s’effectue. } [Serializable] [XmlType("result")] public class TTSResult { public TTSResult(){ } public TTSResult(byte[] stream) { this. this.Language=lang. Enfin nous ´crirons un client simple de ce e service web. Ces deux premi`res biblioth`ques constitueront le sous ensemble minimal a e e ` partager entre client et serveur dans notre application. e ` e e e e Nous commencerons tout d’abord par d´finir et impl´menter les types de donn´es e e e ´chang´es par les diff´rentes entit´s. Afin de d´passer e e les fronti`res de l’intranet.NET remoting. . namespace TTS. XmlElement("content")] public string Content. A’ partir de ces deux briques. Ensuite.5. using System. nous d´velopperons et d´ploierons le service . nous impl´menterons ensuite le service web qui redirigera les e e appels clients vers le service .NET Remoting.AudioStream=stream.Content=text.

le r´sultat sera e e e e une s´rie d’octets suivant une sp´cification propri´taire du Remoting .Schema.Schema.ServiceInterface { using TTS. ce qui formaterait les instances comme e e e ci-dessous : <Sentence Language="EN"> <Content>BONJOUR</Content> </Sentence> L’interface du service (partag´e entre client et serveur) e using System. Les deux classes sont donc marqu´es par l’attribut C# Serializable. TTSLibrary. nous devons marquer la classe ainsi que ses champs et m´thodes par des attributs e de s´rialisation. TTS. Le framework s’occupe par d´faut de tout ce qui a trait a e ` cette s´rialisation. e e ee using using using using System. les donn´es seront encod´es sous e e e forme de document XML.178 CHAPITRE 6. le framework aurait o e ee e par d´faut utilis´ les noms de classe. Selon e e e e la configuration dans laquelle sera publi´ notre service. Par contre. Dans le cas e e e ou le formateur de donn´es sera un formateur SOAP. } } L’impl´mentation du service . la s´rialisation pourra prendre e e plusieurs formes. public interface ISpeechService { TTSResult Speak(Sentence sentence). champs et m´thode. TTS. Par exemple une instance de la classe sentence contenant ”EN” dans le e champ Language et ”Bonjour” dans le champ Content sera transform´e en XML comme e suit : <sentence lang="EN"> <content>BONJOUR</content> </sentence> Si aucun attribut de contrˆle de la s´rialisation XML n’avait ´t´ employ´.ServiceInterface. namespace TTS. .NET.NET Remoting (4) e Il s’agit ici d’impl´menter l’interface du service sous la forme d’une classe h´ritant de e e la classe MarshalByRefObject afin qu’elle puisse ˆtre pass´e par r´f´rence. LA PLATE-FORME .NET } } Chaque instance de ces donn´es devra traverser les fronti`res du service et donc pouvoir e e ˆtre s´rialis´. Si les donn´es sont s´rialis´es via un formateur binaire. si l’on veut pouvoir contrˆler le format de ce document e o XML.

Runtime. Cette application e une fois ex´cut´e h´bergera les instances du service. Nous utiliserons ici deux canaux diff´rents permettant aux clients e d’atteindre le service via deux ports diff´rents : un canal ouvert sur le port 9000 et e dialoguant via le protocole HTTP.ISpeechService { public SpeechService() { Console.Configure("server. } } } En .Remoting { public class SpeechService: MarshalByRefObject. using System.Content)).WriteLine("Instance de ’SpeechService’ cr´ee.Service. Nous montrons ici comment effectuer ce param´trage a l’aide d’un fie ` chier de configuration.Language).NET Remoting au sein ee de cette application. Cette m´thode est beaucoup plus souple puisque le service n’a e pas besoin d’ˆtre recompil´ afin d’ˆtre d´ploy´ diff´remment.Remoting { public class MainClass { [STAThread] static void Main(string[] args) { RemotingConfiguration. using System.remoting> permettant de param´trer e ` e le mode d’ex´cution de notre service. return new TTSResult(speaker. e´ } public TTSResult Speak(Sentence sentence) { TTSObject speaker=new TTSObject(sentence. Console. } } } D´ploiement du service .ReadLine()) afin que l’application soit toujours disponible. Ce fichier respecte une grammaire XML compos´e de diff´rentes sections.runtime. un service Windows ou encore le serveur e web IIS. nous devons choisir de le d´ployer dans un conteneur.WriteLine("Appuyez sur [Entr´e] pour quitter. Nous allons d´ployer notre service dans une application Console. EXEMPLE : MISE EN ŒUVRE D’UNE APPLICATION COMPL ETE 179 namespace TTS. chaque application dispose de son propre fichier de configuration.DoSpeak(sentence.5."). e Ce conteneur peut ˆtre au choix une application. La partie <channels> permet de sp´cifier l’ene e semble des canaux de communication g´r´s par le framework .Remoting.Service.ReadLine(). un autre dialoguant sur le port 9001 via un canal ."). En particulier nous e e nous int´ressons ici a la section <system.NET Remoting e Pour rendre le service accessible.` 6. e e e Nous avons vu dans la section pr´c´dente comment param´trer ce d´ploiement par e e e e programmation. L’application hˆte consise e e e e e o tera uniquement a charger le fichier de configuration et a se bloquer (ici par l’appel a ` ` ` Console.NET. e Console.config"). namespace TTS.

runtime. TTSResult result=service.0" encoding="utf-8" ?> <configuration> <system. soit via un e e canal TCP sur le port 9001.ISpeechService. TTS. LA PLATE-FORME .NET Remoting (3) Le Code du client ISpeechService service=(ISpeechService)Activator. Fichier de configuration du client (client.Remoting. Fichier de configuration du serveur (server.remoting> <application> <client> <wellknown type="TTS.ServiceInterface" url="http://localhost:9000/speech"/> </client> .NET TCP.config) <?xml version="1.Text)).GetObject(typeof(ISpeechService).3 Client du service . 6.180 CHAPITRE 6.config) <?xml version="1. Vient ensuite la section <services> permettant de d´crire le mode de publicae tion de notre service.remoting> <application> <channels> <channel port="9000" ref="http" /> <channel port="9001" ref="tcp" /> </channels> <service> <wellknown mode="Singleton" type="TTS.textBox1.Remoting" objectUri="speech" /> </service> </application> </system.0" encoding="utf-8" ?> <configuration> <system. Dans notre exemple le e service sera accessible respectivement aux adresses http ://localhost :9000/speech et tcp ://localhost :9001/speech.Service.SpeechService. TTS.Speak(new Sentence("fr".url).runtime.ServiceInterface.5.Service. Les deux URI correspondantes seront respectivement http ://localhost :9000/speech et tcp ://localhost :9001/speech. le composant en mode singleton sera accessible de deux mani`res diff´rentes : soit via un canal HTTP sur port 9000. Nous le d´ployons dans notre exemple dans un mode Singleton en e sp´cifiant l’assembly contenant l’impl´mentation du service ainsi que l’adresse relative a e e ` l’URL implicitement d´finie par les canaux de communications.remoting> </configuration> Via ce fichier de configuration.runtime.

Tcp.Runtime. return remoting_service. Il faut e e e e e e placer ces biblioth`ques dans le r´pertoire bin de l’application web h´bergement le service e e e web.` 6. System.ServiceInterface.Remoting.Runtime.GetObject(typeof(ISpeechService).Speak(sentence). "tcp://localhost:9001/speech").Runtime. System.5.Channels.Services.remoting> </configuration> 6.5. . ce service e web a pour rˆle de rediriger ses requˆtes vers le service . Le Code du service web La classe du web service using using using using using System. System. Ainsi son code fonctionnel est tr`s similaire au code d’un client . EXEMPLE : MISE EN ŒUVRE D’UNE APPLICATION COMPL ETE 181 </application> </system. using TTS.Schema.4 Implementation du Service WEB (6) Nous allons a pr´sent cr´er le service web permettant d’acc´der aux fonctionnalit´s ` e e e e de notre service en dehors de l’intranet de l’entreprise.Remoting. ISpeechService remoting_service= (ISpeechService) Activator.NET Remoting impl´ment´ o e e e pr´c´demment. using TTS. System.Channels.Remoting.runtime.Configure("client. public class TTSService : WebService { [WebMethod] public TTSResult Speak(Sentence sentence) { //RemotingConfiguration. Selon notre sch´ma.config").NET e e e Remoting.cs" Class="TTSService"%> Compilation du service web Notre service web d´pend des diff´rentes biblioth`ques compil´es pr´c´demment. } } La page d’acc`s au webservice e <%@ WebService CodeBehind="TTSWebService.Web.

182

CHAPITRE 6.

LA PLATE-FORME .NET

Structure du r´pertoire de l’application e
\www_icar \bin TTS.Schema.dll TTSSpeechService.dll TTSWebService.dll tts.asmx TTSWebService.aspx

--> --> --> --> -->

Sch´mas de donn´e e e Interface du service .NET Remoting Le web service compil´ e La page d’acc`s e Le code c# du web service

La page d’acc`s au webservice e
set PATH=C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322;%PATH% SET LIB_SCHEMA=bin\TTS.Schema.dll SET LIB_INTERFACE=bin\TTS.SpeechService.dll SET OUTPUT=bin/TTSWebService.dll SET SOURCES=TTSWebService.cs csc.exe /reference:%LIB_SCHEMA% /reference:%LIB_INTERFACE% /reference:System.Runtime.Remoting.dll /out:%OUTPUT% /t:library %SOURCES% pause \ \

D´ploiement du service web e Le service doit ˆtre h´berg´ dans une application ASP.NET sous le contrˆle du serveur e e e o web IIS de Microsoft. La console d’administration des services Internet permet de cr´er ce e r´pertoire que nous nommerons icar. L’arborescence de cette application doit contenir un e sous-r´pertoire bin contenant tous les assemblages .NET n´cessaires au fonctionnement e e du service web. Dans notre cas, ce r´pertoire devra contenir la biblioth`que contenant le e e web service TTS.WebService.dll, la biblioth`que TTS.ServiceContract ainsi que la bie blioth`que TTS.SpeechService contenant l’interface du service. Dans un deuxi`me temps e e nous ´crivons une page web avec l’extension asmx permettant de d´crire le service web. e e Nous nommerons cette page ttsservice.asmx. Le service est alors disponible a l’url http ://hostname :80/icar/ttsservice.asmx. ` Sa description WSDL peut ˆtre e r´cup´r´e e ee a ` l’adresse http ://hostname :80/icar/ttsservice.asmx?WSDL. Notre service web est d´sormais e prˆt a l’emploi. e `

6.5.5

Ecriture du client du Service web

G´n´ration du proxy du service web via l’outil en ligne de commande wsdl.exe. e e
using System; namespace TTS.ClientWebService { /// <summary> /// Description r´sum´e de Class1. e e /// </summary>

6.6. EVALUATION

183

class Class1 { /// <summary> /// Point d’entr´e principal de l’application. e /// </summary> [STAThread] static void Main(string[] args) { TTS.WebService.sentence request = new TTS.WebService.sentence(); request.content = "Salut"; request.lang = "FR"; TTS.WebService.result result = new TTS.WebService.TTSService().Speak(request); Console.ReadLine(); } } }

6.6
6.6.1

Evaluation
.Net et les langages ` objets a

Comme on l’a vu dans les parties pr´c´dentes, .NET offre, grˆce a une machine virtuelle, e e a ` les m´canismes n´cessaires a la repr´sentation de donn´es et aux ´changes de donn´es e e ` e e e e entre modules ´crits dans des langages diff´rents. Le but de cette premi`re partie d’une e e e ´valuation de .NET est de s’assurer que les comportements des principaux langages (VB, e C++, C# et J#) de la plate-forme .NET sont conformes a ceux attendus, en particulier ` pour l’un des points essentiels de la programmation objet : la red´finition et la surcharge. e On parle de red´finition lorsqu’une m´thode poss`de plusieurs d´finitions qui peuvent e e e e participer a la liaison dynamique. Le compilateur ne peut pas choisir au moment de la ` compilation et met en place une proc´dure de lookup qui sera d´clench´e lors de l’ex´cution e e e e du programme pour s´lectionner la m´thode appropri´e ; en g´n´ral, celle qui se trouve e e e e e le plus bas dans le graphe d’h´ritage. Pour la surcharge il s’agit en fait de l’utilisation e d’un mˆme nom de m´thode mais pour des m´thodes que le compilateur consid`re comme e e e e diff´rentes et qui ne sont donc pas ´ligibles en mˆme temps lors de la liaison dynamique. Les e e e langages a objets font des choix diff´rents ; les red´finitions peuvent ˆtre invariantes, cova` e e e riantes ou contravariantes et la surcharge est parfois interdite. Pour mettre ces diff´rences e 9 propose une exp´rimentation simple. en ´vidence, Antoine Beugnard e e Nous consid´rons deux classes : Up, et Down qui est une sous-classe de Up. Chacune e des deux classes offre deux m´thodes cv et ctv qui requi`rent un param`tre unique. Les e e e param`tres sont des instances de trois classes : Top, Middle qui est une sous-classe de e Top et Bottom qui est une sous-classe de Middle. Pour tester tous les cas (covariants et contravariants) nous d´finissons les classes Up et Down selon la figure 6.11. La m´thode cv e e parait covariante car les classes o` elles sont d´finies et les classes des param`tres varient u e e dans le mˆme sens, tandis que la m´thode ctv parait contravariante puisque les classes e e des param`tres varient dans le sens inverse des classes de d´finition de ctv. e e Notre but n’est pas ici de discuter l’avantage de tel ou tel choix fait par les langages a objet, mais simplement de montrer qu’ils offrent de nombreuses s´mantiques et que le ` e
9

L’ensemble de l’´tude est disponible a l’adresse : http ://perso-info.enst-bretagne.fr/ beugnard/papier/lb-sem.shtml e `

184

CHAPITRE 6.

LA PLATE-FORME .NET

Figure 6.11 – Les classes utilis´es pour l’exp´rimentation e e

framework .Net les respecte. Pour illustrer cela on cr´e, pour chacun des langages ´tudi´, e e e un programme client qui instancie les objets puis essaye tous les appels possibles : les deux m´thodes (cv et ctv) ´tant appel´es successivement avec les trois classes de param`tres e e e e possibles (Top, Middle et Bottom) pour les trois objets r´cepteurs possibles : u de type Up e instanci´ avec un objet de classe Up, d de type Down instanci´ avec un objet de classe Down e e et ud de type Up mais instanci´ avec un objet de classe Down. Le dernier cas est autoris´ car e e Down est une sous-classe de Up. Ce code peut parfois ne pas compiler ou ne pas s’ex´cuter e lorsque le syst`me de type l’interdit. e Les r´sultats sont pr´sent´s sous la forme d’un tableau de 6 lignes (une e e e par appel possible) et 3 colonnes (une par objet r´cepteur possible). Chaque e case contient la classe dans laquelle a ´t´ trouv´e la m´thode effectivement ee e e ex´cut´e. Les sources et les r´sultats des ex´cutions peuvent ˆtre lus sur e e e e e http ://perso-info.enst-bretagne.fr/~beugnard/papier/lb-sem.shtml. Ces tableaux sont appel´s signature du langage (vis-`-vis de la red´finition et de la surcharge). e a e Nous reproduisons dans les tables 6.1 a 6.4 les signatures pour C++, C#, J# et ` VB.Net. Ce sont les mˆmes qu’avec d’autres compilateurs comme gcc ou javac (jusqu’` e a la version 1.3) par exemple. C++ cv(Top) cv(Middle) cv(Bottom) ctv(Top) ctv(Middle) ctv(Bottom) u Up Up Up Compil. error Compil. error Up d Compil. error Down Down Compil. error Down Down ud Up Up Up Compil. error Compil. error Up

Tab. 6.1 – signature de C++ On notera avec int´rˆt que bien que proches, ces langages ont tous une deuxi`me coee e

6.6. EVALUATION

185 u Up Up Up Compil. error Compil. error Up d Up Down Down Compil. error Down Down ud Up Up Up Compil. error Compil. error Up

C# cv(Top) cv(Middle) cv(Bottom) ctv(Top) ctv(Middle) ctv(Bottom)

Tab. 6.2 – signature de C# J# cv(Top) cv(Middle) cv(Bottom) ctv(Top) ctv(Middle) ctv(Bottom) u Up Up Up Compil. error Compil. error Up d Up Down Down Compil. error Down Compil. error ud Up Up Up Compil. error Compil. error Up

Tab. 6.3 – signature de Java before 1.3 (et J#) lonne diff´rente ! La diff´rence entre ces 4 langages est due a des interpr´tations diff´rentes e e ` e e de la surcharge. En effet, la troisi`me colonne montre que cv et ctv sont en fait des e surcharges ; il aurait fallu voir apparaˆ ıtre des Down dans la troisi`me colonne pour avoir e de la liaison dynamique et donc des red´finitions. Ces 4 langages n’acceptent que des e red´finitions invariantes. Des exp´riences avec d’autres langages a objets (comme ADA95, e e ` Dylan, Eiffel, OCaml ou Smalltalk) montrent une plus grande vari´t´ encore. ee Ce qui nous int´resse ici est de conclure que le framework .Net permet de d´finir plue e sieurs s´mantiques et que les langages existants hors du framework ont la mˆme s´mantique e e e qu’avec le framework (C++ et J#/Java version 1.3).

6.6.2

Compositions multi-langages en .Net

Comme nous venons de le voir, les interpr´tations de la red´finition et de la surcharge e e dans les langages a objets sont nombreuses. Quelle cons´quence cela peut-il avoir lorsqu’on ` e assemble des morceaux de logiciel ´crits dans des langages diff´rents ? Le framework .Net e e met en avant la notion de composants. Ces composants peuvent ˆtre ´crits avec plusieurs e e langages et leurs interfaces doivent assurer leur interconnexion. Mais, comme on va le voir avec .NET, les mod`les a composants n’ont pas un comportement neutre vis-`-vis des e ` a langages d’impl´mentation de chacun des composants. En effet, la diff´rence de compore e tement des langages a objets en ce qui concerne la red´finition et la surcharge n’est pas ` e prise en compte dans les interfaces des composants. Pour mettre cela en ´vidence, il suffit e de construire la petite exp´rience suivante, toujours reprise du document d’habilitation e d’Antoine Beugnard. Imaginons le d´coupage de la figure 6.12. Les quatre classes Up, Top, Middle et Bottom e de la partie pr´c´dente d´finissent un framework C1 ´labor´ dans le langage L1. Par la e e e e e suite, dans le cadre d’une ´volution du framework, la classe Up est ´tendue par la classe e e

186 VB.Net cv(Top) cv(Middle) cv(Bottom) ctv(Top) ctv(Middle) ctv(Bottom) u Up Up Up Compil. error Compil. error Up

CHAPITRE 6.

LA PLATE-FORME .NET

d Up Down Down Compil. error Down Up

ud Up Up Up Compil. error Compil. error Up

Tab. 6.4 – signature de Visual Basic

Figure 6.12 – Le d´coupage avec plusieurs langages e

Down dans le langage L2 pour former le composant C2. Cette extension, multi-langage est tout a fait permise par la plate-forme .Net. Enfin, pour compl´ter l’exp´rimentation un ` e e client C3 est ´crit dans le langage L3. Pour mettre en œuvre cette exp´rimentation nous e e avons utilis´ les langages VB, C++ et C# qui forment le trio des langages de base de la e plate-forme .Net. Nous obtenons donc un total de 27 (3*3*3) assemblages possibles. Pour pr´senter les r´sultats, nous construisons un tableau de 9 signatures pour chacun des 3 e e clients (C3). Les colonnes de chaque tableau repr´sentent les langages d’implantation du e framework de r´f´rence C1 et les lignes, les langages d’implantation de l’extension C2. ee Chaque cellule du tableau contient la signature observ´e. e Dans le tableau suivant, le client est en C#. Extension/Framework C# VB C++ C# C# C# C# VB C# C# C# C++ C++ C++ C++

On constate que le comportement attendu par le client est majoritairement celui de C#, mais que dans le cas o` le framework (C1) est ´crit en C++, l’anomalie d’h´ritage de u e e

6.6. EVALUATION

187

la signature de C++ (erreur de compilation ligne 1, colonne 2 de la table 6.1) est toujours pr´sente. e Dans le tableau suivant, le client est en Visual Basic. Extension/Framework C# VB C++ C# VB VB VB VB VB VB C# C++ C++ C++ C++

On constate que le comportement attendu par le client est majoritairement celui de Visual Basic, mais que dans le cas o` le framework (C1) est ´crit en C++, l’anomalie u e d’h´ritage de la signature de C++ est encore pr´sente. Un nouveau comportement apparaˆ e e ıt lorsque le framework est ´crit en Visual Basic et l’extension en C++, le client Visual Basic e observe un comportement “ a la ” C#. ` Dans le tableau suivant, le client est en C++. Extension/Framework C# VB C++ C# VB/C++ C++ C++ VB VB/C++ C++ C++ C++ VB/C++ C++ C++

On constate que le comportement attendu par le client est majoritairement celui de C++, mais que dans le cas o` l’extension (C2) est ´crit en C#, un nouveau comportement u e apparaˆ : la signature observ´e par le client est un m´lange de C++ et de VB (erreur de ıt e e compilation comme C++ ligne 1, colonne 2 table 6.1 et choix de Up comme VB ligne 6 colonne 2 table 6.4). Cette signature ne correspond a aucun des 13 langages a objet ´tudi´s ` ` e e par Antoine Beugnard. Au del` de la compr´hension fine des r´sultats, cette rapide exp´rience montre que a e e e pour pouvoir pr´voir le comportement d’un assemblage, le client (et donc l’utilisateur) e doit avoir connaissance de la mani`re dont la surcharge est interpr´t´e, et donc du langage e ee d’impl´mentation de la partie serveur. Il pourrait ˆtre int´ressant de pousser plus avant e e e cette exp´rimentation avec les services web, pour v´rifier l` aussi la r´elle neutralit´ de la e e a e e plate-forme vis-`-vis des langages d’impl´mentation. a e

6.6.3

Quelques ´l´ments de performances ee

L’´valuation d’un langage et d’une plate-forme est quelque chose de complexe. Cette e courte section ne se donne pas comme ambition d’´valuer toutes les caract´ristiques mais e e de donner quelques ´l´ments de r´f´rence. Une ´tude publi´e dans www.gotdotnet.com ee ee e e a propos de l’application PetStore qui servait d’exemple a la plate-forme J2EE titrait : ` ` “.NET, 10 fois plus rapide que J2EE”. N’ayant pas les capacit´s pour reproduire sur une e autre application significative cette ´tude nous avons dans un premier temps mesur´ le cout e e des appels de m´thodes. La figure suivante donne quelques valeurs comparatives entre un e appel de m´thode local en Java et en .NET, puis entre un appel distant entre Java RMI e et .NET Remoting, la taille des paquets d’appels ´voluant. e Attention il s’agit d’une ´chelle logarithmique (cf. figure 6.13). Nous n’arrivons pas a e ` expliquer les diff´rentes discontinuit´s pr´sentes dans les mesures .NET en local. e e e

188

CHAPITRE 6.

LA PLATE-FORME .NET

Figure 6.13 – Coˆt d’un appel de m´thode u e

Voici deux autres ´l´ments compl´mentaires incluant des utilisations ee e plus complexes du langage et de la plate-forme. L’ensemble des r´sultats, e y compris avec les principaux fichiers sources, est disponible a l’adresse : ` http ://www.dotnetguru.org/articles/Comparatifs/benchJ2EEDotNET/J2EEvsNETBench.html.

Etude du d´marrage d’une application graphique e L’application utilis´e pour ce test est simpliste par ses fonctionnalit´s mais permet de e e mesurer le temps de d´marrage d’initialisation de la partie graphique d’un client lourd e (cf. figure 6.14). Elle consiste a charger un formulaire permettant d’enregistrer un utilisa` teur, photos comprise dans une base. Sans ´quivoque la version C# avec Winforms a ´t´ e ee nettement plus rapide que la version Java avec Swing.

Efficacit´ de la mise en œuvre d’un service web e Pour ´valuer celle-ci, l’auteur du papier a choisi d’appeler une fonction permete tant de trouver le minima d’un tableau d’entiers. Ce service web a ´t´ implant´ en ee e .NET et a l’aide de la plate-forme Java/axis puis en Java avec la plate-forme Glue ` (www.themindelectric.com). A ´t´ mesur´ uniquement (cf. figure 6.15) le temps de r´ponse ee e e du service sans vouloir d´composer celui-ci entre les diff´rentes activit´s : empaquetae e e ge/d´paquetage, transfert des donn´es, activation du service, traitement du cot´ serveur. e e e

EVALUATION 189 Figure 6.6.15 – Cout d’utilisation d’un service web .14 – Coˆt d´marrage application graphique u e Figure 6.6.

. e e La construction d’un client Indigo sera identique (et proche de la mani`re de proc´der actuellee e ment pour le Web services) : a partir d’un proxy du service g´n´r´ a partir du fichier de publication ` e e e` du service. e e e e e e un composant qui devait utiliser le service transactionnel devait ˆtre pr´c´d´ de l’attribut e e e e [Transaction]. pour publier un web service.190 CHAPITRE 6.A) repose sur quatre principes e e fondamentaux : – un couplage faible entre services (fournis par SOAP et WSDL) .0 et Indigo : nouveaut´s ` venir e a Une nouvelle plate-forme de distribution L’architecture distribu´e orient´e Services Web (S. [ServiceContract] public class AnnuaireWebService { private AnnuaireService service. Par exemple.6.ServiceModel. ni du client qui le consomme il sera possible ` de pr´ciser dans un fichier de configuration : le protocole de transport (par exemple : HTTP).NET 2. e Pour atteindre cet objectif. Indigo fait lui-mˆme une partie e e e de la nouvelle version de Windows nomm´e Longhorm. Indigo propose d’introduire la notion de contrat : Using System. mais aussi sur les donn´es e e ´chang´es afin de permettre le transport de donn´es structur´es. L’objectif d’Indigo est de choisir les meilleurs abstractions pour construire des logiciels orient´s processus en int´grant de mani`re plus ´troites les services n´cessaires e e e e e a ces applications (bus de messages. Pour chaque points de publication e e e e d’un service. de mˆme. LA PLATE-FORME . Indigo unifie l’ensemble des « attributs » auparavant disponibles pour construire un service. il ´tait e n´cessaire de faire pr´c´der chaque m´thode expos´e de l’attribut [WebMethod].NET (appel´ Indigo) renforce encore plus le souhait de Mie crosoft de se positionner comme un acteur dans une approche de programmation orient´e e services. – un bus de communication synchrone (HTTP) ou asynchrone (Middleware Oriented Messages : MOM) – une invocation des services de type ´change de documents (XML. le client pourra acc´der au service de la mˆme mani`re quelque soit le protocole utilis´ e e e e (.Rechercher(nom). public AnnuaireWebService() { service=new AnnuaireService(). e l’adresse du service mais aussi les services techniques associ´s aux appels (s´curit´ ou transaction) e e e bas´s sur les sp´cifications du W3C pour les Web services.NET 6. . } [OperationContact] public CarteDeVisite Rechercher(string nom) { return service. sans avoir a modifier le code de celui-ci.4 La plate-forme . } } Les contrats peuvent porter sur les classes ou sur les m´thodes. s´curit´ et transaction) en s’appuyant de mani`re ` e e e explicite sur les travaux r´alis´s par le consortium Oasis.O. RPC) e – des processus m´tiers qui pilotent l’assemblage de services Web (Business Process e Management : BPM).NET remoting ou SOAP). Le futur de la plate-forme .

il ´tait n´cessaire de d´clarer un ’callback e e e e e d’´v´nement’ par une m´thode qui poss´dait un nom. e e e e les programmeurs C# utilisaient actuellement des collections d’objets non typ´s et sollicitaient e massivement l’usage coˆteux du boxing/unboxing et de cast.cs le code suivant : public partial class AnnuaireService : IAnnuaireService { // contructeur de la classe public AnnuaireService(){} // implementation de la m´thode m´tier e e public CarteDeVisite Rechercher(string nom) { AnnuaireDAL dal=new AnnuaireDAL(). L’introduction de la g´n´ricit´ deu e e e vrait permettre d’augmenter le typage statique des programmes et d’augmenter simultan´ment e l’efficacit´ de ceux-ci.Nom). return dal. } } Le fichier AnnuaireAdminService. Microsoft a ´cout´ les utilisateurs et l’a e ee ` e e mis en place en nommant dor´navant la technique Generic.Click += delegate(object dlgSender. Classes partielles Les classes partielles permettront a une ´quipe de d´veloppeurs de ` e e travailler en commun : la mˆme classe sera contenue dans plusieurs fichiers.0 ee C# va.EventArgs e) { this.Text = " Vous avez cliqu´ sur le bouton 1 !". pourra lui contenir : public partial class AnnuaireService : IAnnuaireAdminService { // implementation de la m´thode m´tier e e public void Ajouter(CarteDeVisite carte) { AnnuaireDAL dal=new AnnuaireDAL(). e ` M´thodes g´n´riques Les m´thodes anonymes sont aussi une mani`re d’all´ger le code en e e e e e e particulier dans la gestion des ´v´nements. e G´n´ricit´ En C++ les templates sont extrˆmement utilis´s et le fait qu’ils n’ont pas ´t´ ime e e e e ee plant´ sous C# a ´t´ un des reproches majeurs a sa sortie. if (test==null) . ˆtre compl´t´ par l’introduction de tr`s e ee e nombreuses nouveaut´s : la g´n´ricit´.Button1. avec la version deux de la plate-forme . il suffira juste de donner le code e e e e e a ex´cuter : ` e void Page_Load (object sender. Dor´navant. En reprenant e l’exemple de la section pr´c´dente. // on verifie que la carte existe pas d´j` e a CarteDeVisite test=dal.cs. e } }. on trouvera par exemple dans le fichier annuaireSere e vice.6. EVALUATION 191 Evolution du langage de r´f´rence : C# version 2.ExtraireCarte(nom). Actuellement.NET.ExtraireCarte(carte.6. e La g´n´ricit´ sera utilis´e pour simplifier l’´criture des classes de collections qui puissent ˆtre e e e e e e ´numerable (c’est a dire interrogeables dans une boucle foreach). EventArgs dlgE) { Label1. les it´rateurs. System. Pour contourner l’absence de g´n´ricit´. les m´thodes anonymes et les classes partielles e e e e e e pour ne citer que les am´liorations les plus notables.

NET.7 Conclusion La terre est envahie de composants COM. else throw new Exception("La carte existe d´j`"). Mais mˆme si vous souhaitez ´crire une a e e nouvelle application . il n’est pas non plus n´cessaire d’ajouter du code lors du d´ploiement e e pour permettre l’ex´cution du composant car celui-ci est inclus dans la plate-forme e ou directement associ´ avec les composants. n’importe quel e client Web peut acc´der a un service publi´ sur le Web. d’installer une pile de protocole. En ce qui concerne e e e l’ex´cution des services. En effet le choix d’utiliser le protocole SOAP afin de pouvoir ˆtre acc´d´ e e e depuis n’importe quel type de station cliente se paye au prix fort. e la description de ses services. e a } } 6. etc. permettant l’acc`s a e e e e e e e ` diff´rents formats de base de donn´es. Vous y trouverez a des outils de d´veloppement sophistiqu´s. Il n’est pas n´cessaire d’avoir e ` e e une configuration sp´cifique. La technologie propos´e permet essentiellement de relier entre eux des composants ayant une grosse e granularit´. les performances sont au rendez-vous : code compil´.NET propose aussi avec ADO un mod`le tr`s e e e e e ´volu´ pour l’acc`s aux donn´es acceptant le mode d´connect´. les appels inter-service seront lents e par nature. le code pour acc´der aux services et les services eux e mˆmes.NET est fait pour vous.192 CHAPITRE 6. et si l’application que vous voulez construire fait un usage intensif de cet univers l` alors . . la possibilit´ de construire un composant en utilisant plusieurs langages de proe grammation grˆce au langage de type commun. multie e processeur.AjouterCarte(carte).NET ne fait pas le choix d’un langage e de programmation a votre place. ceux-ci ´tant remplac´s par des e e e composants . de configurer un paree feu (firewall). COM permettait de faire . il vous laisse libre de choisir le langage que vous ` voulez utiliser en fonction de vos usages ou de votre humeur. L’int´gration avec les standards du Web est totale. voici quelques apports : e – Point d’acc`s : c’est le point fort par excellence de l’approche .NET dal. LA PLATE-FORME . Un composant est un objet simple qui e contient tout ce qui est n´cessaire pour le manipuler : la description de ses interfaces. un client XML e et la disponibilit´ prochaine du protocole SOAP permettront cet usage et rendront e peutˆtre inutile la programmation de script CGI. le point de vue est diam´tralement oppos´. – Les performances : selon que l’on s’int´resse a la mani`re dont le service est rendu e ` e ou l’acc`s au service. ´quilibrage de charge. Pour cela e e il n’est pas n´cessaire de d’envelopper (wrapper) les composants afin de les rendre e accessibles. Le d´ploiement est imm´diat. Par contre.NET peut aussi ˆtre fait pour vous. e – Multiplicit´ des langages de programmation : . Toutes les donn´es peuvent ˆtre acc´der e e e e e imm´diatement depuis n’importe quel client de la plate-forme qui se charge de les e transporter et de les convertir.NET. des langages de programmation adapt´s a vos e e e ` besoins. – Simplicit´ d’utilisation : . etc.NET a ´t´ con¸u d`s l’origine comme une plate-forme a e ee c e ` composants distribu´s int´grant les standards de l’Internet XML et SOAP.

Le typage est complet et les diff´rents types du Common Language e Runtime. des compilateurs APL. dont par exemple les threads sont disponibles dans les diff´rents langages e de programmation de la plate-forme. Python. Cobol.NET permet d’int´grer e e e e les langages les uns avec les autres. . . mˆme si les e e langages de types proc´duraux sont plus proches de la machine virtuelle propos´e. C#. Smalltalk et Java seront disponible sur la plate-forme . Des compilateurs C++.7. Pascal. Il e e par exemple est possible d’utiliser simultan´ment diff´rents langages (un par classe e e par exemple). VB et Jscript sont aujourd’hui disponibles et diff´rentes compagnies ont d´j` annonc´ qu’elles allaient e ea e sous peu fournir des compilateurs.NET. ML. Il est imaginable que dans peu de temps. Tous les langages sont a priori ´gaux. Perl. Oz. CONCLUSION 193 coop´rer des composants ´crits dans des langages diff´rents.6.

LA PLATE-FORME .NET .194 CHAPITRE 6.

cette premi`re sp´cification e e e e e e sp´cification s’est rapidement r´v´l´e tr`s int´ressante pour des applications diverses que e e ee e e personne n’imaginait a l’origine. La section 7.fr) Chapitre 7 La plate-forme dynamique de services OSGi Ce chapitre pr´sente les grands principes de la plate-forme dynamique de services OSGi. de l’industrie.3 d´taille le conditionnement et le d´ploiement des e e e e applications ainsi que la collaboration au travers des services. dont l’objectif e e s’est progressivement ´largi dans la direction d’une plate-forme horizontale de d´ploiement e e et d’ex´cution de services.0/fr/deed.2 rappelle les obe e jectifs initiaux de cette sp´cification. La premi`re version de la e e e 2 ´tait strictement orient´e par ce march´ de niche. Donsez (version du 19 janvier 2007 . Le chapitre d´bute par un bref ee e e historique de la sp´cification OSGi et de son ´volution. e ainsi que la programmation des services. N´anmoins. L’intention originelle de ces soci´t´s ´tait de d´finir une sp´cification ouee ee e e e verte pour d´velopper et d´ployer des t´l´-services sur des passerelles r´sidentielles comme e e ee e des d´codeurs de TV num´rique ou des modems-routeurs ADSL. e 2 qui est repartie du JSR008 transf´r´ par SUN a l’OSGi Alliance en novembre 1999 e e ` 1 .Intergiciel et Construction d’Applications R´parties e c 2006 D. beaucoup d’autres soci´t´s se sont jointes au ` ee consortium pour l’´laboration des versions successives de la sp´cification. Plusieurs services standardis´s sont d´taill´s dans e e e les domaines particuliers pour lesquels ils ont ´t´ d´finis. L’OSGi Alliance interdit d´sormais l’usage e e de cette d´nomination. Depuis.10:31) Licence Creative Commons (http://creativecommons. La section 7.1 Introduction L’OSGi 1 Alliance est un consortium industriel fond´ en mars 1999 par une quinzaine de e soci´t´s membres. Les domaines d’application d’OSGi couvrent d´sormais les e e march´s de l’´lectronique grand public.org/licenses/by-nc-nd/ 2. La section 7. La section 7. e 7. Le chapitre se tere e ` e mine par une revue des perspectives pour la sp´cification OSGi.5 d´taille trois services d´j` standardis´s e ea e pour le d´veloppement d’applications li´es a des domaines sp´cifiques. qui se focalisaient sur un mod`le d’administration e e d’applications d´port´es.4 pr´sente la e programmation de services OSGi. des moyens de transport (autoe e OSGi ´tait l’acronyme de Open Service Gateway initiative.

Ce dernier autorise le d´ploiement de e e e services fournis par les fournisseurs de services qui se partagent ainsi la passerelle et d´finit e les r´gles de partage des ressources. l’op´rateur est un syst`me autonoe e e mique qui g`re le d´ploiement des services en fonction de profils d´finis pour les passerelles e e e et du contexte environnemental de chaque passerelle. Dans le contexte d’un parc de passerelles constitu´ de e e plusieurs milliers d’unit´s (voir de plusieurs millions). il est sans doute le constructeur du v´hicule. e e e e ` e ! " $ ! " # $ ! " % $ # ' ( )* & Figure 7. Ces ´quipements dont la fonction est tr`s sp´cialis´e et fig´e. Le r´seau raccorde la passerelle a des ´quipements de l’environnement de l’usager e ` e final.a. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI mobiles et transports publics).196 CHAPITRE 7. L’adoption d’OSGi par la fondation Eclipse pour le d´ploiement de plugins e de son atelier de d´veloppement et sa plate-forme pour clients riches (rich-client) a pouss´ e e la sp´cification a adresser de mani`re plus g´n´rale le d´ploiement des applications Java. Cependant dans le contexte de l’automobile.2 Motivations La premi`re motivation de l’OSGi Alliance ´tait de d´finir un mod`le d’administrae e e e tion d’un parc de passerelles dans lequel l’administration est transparente a l’utilisateur ` b´neficiaire des services qui lui sont offerts. la plate-forme OSGi reste l´g`re et applicable e e e e e aux domaines initiaux. des t´l´communications mobiles. sont communicants e e e e e mais ne sont pas g´n´ralement prevus pour ˆtre raccord´s a un r´seau ouvert.1 – Mod`le d’administration de passerelles OSGi e La passerelle est administr´e par un op´rateur 3 . 7.d. Une passerelle est g´n´ralement un interm´diaire entre un r´seau ouvert e e e e (c.1. e . e ` e e e e Malgr´ la g´n´ralisation des buts de l’OSGi. de la domotique et de ee l’immotique. l’Internet) et un r´seau local priv´ qui est g´n´ralement d´di´ a un domaine d’applie e e e e e` cation. 3 L’op´rateur de la passerelle est vraisemblablement un op´rateur de t´l´communications dans le contexte e e ee de la domotique. Ce mod`le que nous allons d´tailler est illustr´ e e e e par la figure 7.

e e e e Cette propri´t´ est tr`s importante car la plate-forme est g´n´ralement partag´e par pluee e e e e sieurs fournisseurs comme nous l’avons vu dans la section 7. Par exemple. e ` le serveur du distributeur d’´lectricit´ proc`de a un t´l´-relev´ en contactant le service e e e ` ee e connect´ au compteur ´lectrique.3 La plate-forme de d´ploiement et d’ex´cution de sere e vices Java La plate-forme4 OSGi est une plate-forme d’ex´cution d’applications Java colocalis´es e e au sein de la mˆme machine virtuelle Java [Gong 2001]. La plate-forme est g´n´ralement repr´sent´e e e e e e e 5 introduisant la dynamicit´ dans comme une surcouche au Java Runtime Environnement e les relations entre les applications d´ploy´es. 1998] c’est a dire le chargement et l’installation des unit´s mais ´galement ` e e l’activation. Chaque application qui est attach´e e e a un fournisseur de services peut ´ventuellement collabor´e avec les applications des autres ` e e fournisseurs h´berg´es sur la plate-forme. o e e o e 7. et la collaboration e entre les applications s’ex´cutant au sein de la mˆme machine virtuelle.3. e Ce terme est synonyme du terme passerelle qui fait r´f´rence aux objectifs initiaux de la plate-forme ee OSGi. LA PLATE-FORME DE DEPLOIEMENT ET D’EXECUTION DE SERVICES JAVA197 Ces services sont g´n´ralement li´s aux ´quipements du r´seau priv´ dont ils exploitent e e e e e e les donn´es enfouies et agissent sur les fonctions. Les op´rations de d´ploiement sont ` e e e e r´alisables dynamiquement sans n´cessairement red´marrer compl´tement la plate-forme. L’interaction peut ˆtre a l’initiative du serveur ou de la passerelle. e e e ee ee Les services d´ploy´s interagissent ´galement avec les serveurs d’entreprise des foure e e nisseurs. Pour OSGi. Les ee e e services (et leurs fournisseurs) peuvent coop´rer entre eux dans l’´laboration de services e e plus complexes. l’op´rateur e e e e assure que les ´quipements ´ventuellement li´s a un fournisseur (compteur ´lectrique du e e e ` e distributeur d’´lectricit´. l’hˆpital e e o peut r´cup´rer le flux vid´o des cameras op´r´es par la soci´t´ de gardiennage. moniteur cardiaque de l’hˆpital. 5 au minimum J2SE ou J2ME/CDC/Foundation Profile 4 . Par exemple. L’autre exemple est celui du service pilotant le moniteur e e cardiaque.´ ´ 7. Si ce dernier d´tecte une d´fibrillation du cœur du patient. La plate-forme contrˆle les d´pendances de ` o e code (et leurs versions) entre les unit´s de d´ploiement avant d’autoriser l’activation d’une e e application.2 et chacune des applications peut avoir une mission critique a remplir. Pour des questions de s´curit´. e e Dans ce contexte de h´bergement multi-fournisseur. la sp´cification OSGi s’est focalis´e e e e sur deux points importants qui jusqu’alors avaient ´t´ d´laiss´s ou n´glig´s par les platesee e e e e formes Java : le conditionnement et le d´ploiement des applications. e e Le conditionnement et le d´ploiement des applications Les applications sont e d´ploy´es sur la plate-forme sous la forme d’unit´s de conditionnement et de livraison ape e e pel´es bundles. cam´ras et centrale d’alarme de e e o e la soci´t´ de gardiennage) ne peuvent ˆtre utilis´s que par les services du fournisseur. la granularit´ de code est un paquetage Java. la mise a jour. en cas de malaise d´tect´ par le moniteur cardiaque. l’arrˆt et la d´sintallation. Le d´ploiement avec OSGi couvre l’ensemble des op´rations de d´ploiement e e e e [Carzaniga et al. il contacte le serveur e e de l’hˆpital qui d´pˆche aussitˆt une ´quipe de secours.

a. un m´canisme de notification des changements qui se produisent sur e e les services.d.3. la disparition de services en cours d’utilisation ou bien le changement de terme du contrat.2 – Architecture multi-couche d’une plate-forme OSGi (avec l’aimable autorisation de Peter Kriens). le CLASSPATH. Ce CLASSPATH est implicitement compl´t´ par ee les fichiers d´pos´s dans le r´pertoire des extensions de l’environnement d’ex´cution e e e e (c. et d’autre part. Ceci provoque ´galement des erreurs non r´cup´rables a l’ex´cution. e 7. Les applications sur une plate-forme OSGi collaborent par le biais de services 2. Les changements concernent l’apparition des nouveaux services. Le premier est l’absence d’une classe dans un des fichiers JAR list´s dans le e e CLASSPATH et dans le $JRE HOME/lib/ext qui provoque l’abandon d’une ex´cution e de l’application qui peut ˆtre fort avanc´e.1 Conditionnement et d´ploiement des applications OSGi e Une application Java est classiquement conditionn´e sous la forme d’un ou plusieurs e fichiers JAR (Java ARchive) plac´s dans des r´pertoires et list´s dans le chemin de ree e e cherche des classes. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI Bundle Bundle Bundle services OSGi Java VM Système d’exploitation Pilote Pilote Pilote Pilote Matériel Figure 7. La plate-forme offre aux applications d’une part un registre de services qui permet de rechercher des objets offrant un contrat de service donn´. Le second probl`me concerne l’incompatibilit´ e e e e de version des classes pr´sentes dans l’environnement op´rationnel avec celui qui a servi a e e ` compiler l’application. $JRE HOME/lib/ext). e ` e .1. e e e ` e OSGi rem´die a ces deux probl`mes en introduisant la notion de bundle.198 CHAPITRE 7. Il e e constitue aussi une charge de travail suppl´mentaire pour le d´veloppeur d’application e e La suite de cette section d´taille ces deux points. La collaboration entre les applications . Ce type de conditionnement conduit g´n´ralement a deux e e ` probl`mes. Ce dernier point permet de r´aliser des applications supportant l’arrˆt de composants optionnels.

entre autres. e e 7 6 . des classes) dans OSGi est le paquetage et chaque paquetage est versionn´. le canevas audio-vid´o de e Java. nom symbolique.d. . . e R´solution des d´pendances Le bundle passe a l’´tat RESOLVED quand les paquetages e e ` e qu’il importe (list´ dans Import-Package). C’est. le bundle est prˆt pour exporter les e e e paquetages list´s dans l’entr´e Export-Package du manifeste. les paquetages ime port´s (Import-Package) et les paquetages export´s (Export-Package).d.* pour les plugins de la soci´t´ ACME. e 8 La sp´cification 4 introduit la notion d’intervalle de versions pour limiter la compatibilit´ ascendante. url vers le d´pot de l’archive. Quand un paquetage identique est export´ par plusieurs bundles. e e L’atome de partage de code (c. OSGi suppose a priori une compatibilit´8 ascendante vis a vis e ` e ` des versions ant´rieures. La sp´cification e e e e e introduit ´galement le concept de extension bundle qui permet de compl´ter le Boot-class-path sans passer e e par le m´canisme d’import-export. e Cycle de vie des bundles Le bundle suit le cycle de vie repr´sent´ par le diagramme d’´tat de la figure 7. de la forme com. Ces entr´es e e ` e d´crivent. Il est e e e conditionn´ sous la forme d’un fichier JAR contenant le code binaire des classes. sont tous export´s par des bundles install´s et e e e r´solus sur la plate-forme. url vers la documentation. e e e Installation L’installation consiste a t´l´charger et stocker le fichier JAR du bundle ` ee dans le syst`me de fichiers de la plate-forme (appel´ aussi bundle cache). ni dans l’entr´e Export-Package. et des biblioth`ques de code e natives (c. des informations factuelles (auteur. le cas des codecs pour Java Media Framework. nom.plugin. Un bundle fragment est g´n´ralement utilis´ pour conditionner des ressources loe e e calis´es ou des biblioth`ques natives d´pendant du syst`me d’exploitation et du processeur.acme. L’entr´e DynamicImport-Package liste les patrons 9 de paquetages qui sont attendus e apr`s l’activation. Les paquetages conditionn´s dans le bundle qui n’apparaissent ni e e dans l’entr´e Import-Package. des rese sources comme des fichiers de configuration ou des images.3. la classe servant de point d’entr´e pour l’activation des services e e (Bundle-Activator). LA PLATE-FORME DE DEPLOIEMENT ET D’EXECUTION DE SERVICES JAVA199 Bundle Le bundle 6 est l’unit´ de d´ploiement7 versionn´e dans la plate-forme OSGi. La r´solution est retard´e le e e e e plus possible jusqu’` l’activation d’un bundle important les paquetages export´s par le a e pr´c´dent. licence. e e par exemple.). .´ ´ 7. Ce m´canisme assure un espace de nommage priv´ n’interf´rant pas avec ceux e e e des autres bundles. dans cet ´tat. un seul de ces e e e baluchon en fran¸ais c La sp´cification 4 introduit le concept de fragment bundle qui permet de conditionner un bundle sous la e forme de plusieurs JAR. e e 9 par exemple. vendeur. Le fichier de mae e nifeste du JAR est augment´ d’une certain nombre d’entr´es propres a OSGi. Le bundle est e e alors dans son ´tat initial INSTALLED. La sp´cification 3 d’OSGi a introduit la possibilit´ de d´marrer un bundle alors que des e e e paquetages qu’il utilisera ne sont pas export´s par un autre bundle au moment de l’activae tion. n’ont qu’une port´e locale e e e au bundle.a. Ceci est fort utile pour les applications a plugin pour lesquels les plugins peuvent ˆtre ` e dynamiquement install´s bien apr`s l’activation du noyau central de l’application.a. Une fois. d´pendant du processeur et du syst`me d’exploitation).3.

e e Mise a jour La mise a jour d’un bundle provoque l’arrˆt. La d´signation de l’exportateur effectif se fait par rapport au plus haut num´ro de version e e 10 . le processeur cible et le syst`me d’exploitation e e e requis. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI bundles devient l’exportateur effectif et les autres se comportent comme des importateurs.200 CHAPITRE 7. la d´sinstallation du bundle provoque la suppression du JAR e e du bundle du syst`me de fichier local. Ces e e biblioth`ques sont d´crites dans le manifeste grˆce a l’entr´e Bundle-NativeCode. certaines classes restent charg´es en e e m´moire tant que tous les bundles qui en d´pendent (c. en enregistrer e et si besoin d´marrer des threads. ou a l’´tat RESOLVED si la r´activation ` e e du bundle avec la m´thode start(BundleContext) s’est sold´e par une exception. la r´installation. dans l’´tat ACTIVE). Le rafraichissement de la r´solution des paquetages provoque e e aussi la lib´ration de ces classes. la r´solution ` ` e e e puis la r´activation en continu. e Biblioth`ques natives e Un bundle OSGi peut livrer ´galement des biblioth`ques de fonctions natives. les e e groupements de paquetage qui ne peuvent ˆtre import´s/export´s qu’ensemble. Cette e e a ` e entr´e d´crit le chemin dans le fichier JAR. L’invocation de e 10 La sp´cification 4 introduit de nouvelles contraintes pour guider la r´solution comme par exemple. le bundle retourne a l’´tat RESOLVED. Le chargeur v´rifie pr´alablement la compatibilit´ du processeur ee e e e et du syst`me d’exploitation de la plate-forme avant de lier la biblioth`que. Cette m´thode doit d´senregistrer les services fournis. e e D´sinstallation Enfin. Le e ` e bundle se retrouve dans l’´tat INSTALLED dans le cas o` des nouveaux paquetages sont e u requis et sont non disponibles dans la plate-forme.a.d. L’objet e e e e ` e e d’activation est alors r´cup´rable par le ramasse-miette. e e e . e e Arrˆt L’arrˆt d’un bundle d´clenche la m´thode stop(BundleContext) de l’interface e e e e BundleActivator. Cependant e e seuls les objets cr´´s par le bundle peuvent invoquer les fonctions de la biblioth`que li´e. Le bundle repasse a l’´tat r´solu. Sinon il se trouve dans l’´tat ` e e ACTIVE. relˆcher les sere e a vices utilis´s et arrˆter les threads d´marr´s. La m´thode start(BundleContext) peut rechercher des services. L’´tat STARTING est l’´tat temporaire dans lequel est le bundle tant que l’ex´cution e e e de la m´thode start(BundleContext) n’est pas termin´e. Cependant. En cas d’exception lev´e lors de l’ex´cution la m´thode e e e e start(BundleContext). La classe doit impl´menter l’interface BundleActivator qui r´git le cycle de e e vie du bundle.a. Une biblioth`que peut ˆtre li´e a la JVM quand le bundle est activ´ et d´li´e e e e ` e e e quand le bundle est arrˆt´. La m´thode start(BundleContext) est alors invoqu´e avec en param`tre e e e un objet BundleContext qui repr´sente a la fois le contexte du bundle et le contexte de la e ` plate-forme. Il arrive qu’une mise a jour se termine sur un ´chec. qui les importent) sont actifs e e (c. ee e e L’invocation se fait via le m´canisme des JNI (Java Native Interface). de paquetage puis au plus petit identifiant d’installation de bundles Activation L’activation d’un bundle devient alors possible. L’activation consiste pour la plate-forme a instancier un seul objet de la classe donn´e par l’entr´e Bundle-Activator ` e e du manifeste.d.

Popularis´ par le d´veloppement des sere e vices Web 4.2 Service OSGi suit le paradigme de la programmation orient´e service dynamique e ([Bieber and Carpenter 2002]. ıne e e 7. L’installation de bundles en cascade reste a la charge d’outils ` tiers de d´ploiement. Un fournisseur enregistre son service aupr`s du registre de services en y associant e un contrat qualifi´.3.1). La programmation orient´ service dynamique consid`re de plus que les e e e services utiles a un client peuvent apparaˆ a tout moment et que les services en cours ` ıtre ` .1).3. D’autres outils proposent des m´canismes de points de reprise (checkpoint) pour d´faire un d´ploiement e e e en chaˆ ayant ´chou´.´ ´ 7.1.3 – Cycle de vie d’un bundle OSGi ces fonctions natives depuis un autre bundle doit obligatoirement passer par un objet de service jouant le rˆle de mandataire (cf. Cependant. LA PLATE-FORME DE DEPLOIEMENT ET D’EXECUTION DE SERVICES JAVA201 Transition explicite Transition automatique install update refresh INSTALLED INSTALLED resolve refresh update STARTING STARTING start STARTING STARTING stop STOPPING STOPPING uninstall RESOLVED RESOLVED uninstall UNINSTALLED UNINSTALLED Figure 7. il est n´cessaire d’installer pr´alablement les bundles fournissant les paquetages e e ou les services requis. Ces bundles peuvent a leur tour requ´rir l’installation d’autres ` e bundles et ainsi de suite.3. o D´ploiement en cascade e La plate-forme OSGi ne se charge que de l’installation d’un seul bundle a la fois. ` Si un bundle d´pend d’autres bundles pour l’importation de paquetages ou l’usage de e services. 2. Le client r´cup`re la liste des services en interrogeant un registre de ` e e e services. un tr`s r´cent RFE a la sp´cification propose un service e e e ` e de d´ploiement en cascade qui se base sur une description de bundles en terme de pae quetages import´s et export´s et en terme de services requis et fournis. et d’autre part que le choix e ` d’un candidat parmi un liste de services respectant le contrat est d´cid´ le plus tard pose e sible a l’ex´cution. voir aussi 2. Ce RFE s’appuie e e sur le BundleRepositoryService de l’OBR de la plateforme OSGi OSCAR. la programmation orient´e service consid`re d’une part que tout service e e respectant un contrat demand´ est substituable a un autre.

Il convient que le client soit sensible (en ıtre ` anglais aware) a ces changements. getPages(). ce n’est pas le seul moyen de coop´ration car les membres et m´thodes statiques des classes export´s sont e e e accessibles de tout importateur. Il est constitu´ par une ou e plusieurs interfaces Java qualifi´es par un ensemble de propri´t´s (typ´es) obligatoires ou e ee e optionnelles.npm". } public class PrintService extends Exception {} public interface Constants { public final static String public final static String public final static String public final static String } 11 TYPE="org.print. STATUS_KILLED=4. D’autre part. getStatus().3). les services sont le moyen pour les bundles de coop´rer e entre eux11 . seuls deux services d’impression remplissent le contrat de qualit´ e de service d´fini ici par la g´o-localisation au premier ´tage. Le e e e contrat de service d’une imprimante peut ˆtre a la fois l’interface PrintService et l’interface e ` FaxService. L’interface Job n’est pas une interface de service mais e n´anmoins sert aux param`tres et aux retours des m´thodes de l’interface de service. getRemainingPages().type".device. . Cependant ce proc´d´ de partage doit ˆtre proscrit dans le d´veloppement e e e e d’applications car il ne respecte pas le cycle de vie des bundles.print. STATUS_STOPPED=2. le ` e e contrat est d´fini par l’interface PrintService compl´t´e par des propri´t´s dont les noms e ee ee sont list´s dans l’interface Constants. STATUS_COMPLETED=3.device.print. Le contrat de service dans OSGi est a la fois syntaxique et quantitatif selon ` la classification de [Beugnard et al. DPI="org.1. } public interface Job { public final static int public final static int public final static int public final static int public final static int public public public public int int int int STATUS_WAITING=0. e e e package org. NPM="org. Les interfaces servent a la n´gociation syntaxique tandis que les propri´t´s ` e ee servent a la n´gociation de qualit´ de service. 1999] (voir aussi 2.device.202 CHAPITRE 7.device. public Job[] list(). Dans l’exemple fictif de la figure 7. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI d’utilisation peuvent disparaˆ a tout moment.4. Dictionary printParams) throws PrintException.device. public interface PrintService { public Job print(InputStream in. getJobId().print.print. COLOR="org. STATUS_ACTIVE=1.color". ` Dans la plate-forme OSGi. public void kill() throws PrintException.dpi".

. PROGRAMMATION DES SERVICES OSGI 203 % # ! "!! #!! # !! $!! % ! "!! #!! !! % $ & % % ! "!! #!! ! "!! #!! !! Figure 7. Les sous-sections d´taillent les API.a.microedition. ee Cette propri´t´ pr´cise la date et la p´riode des invocations.midp.pattern (cas des bundles 1 et 2). 13 12 javax. ee e e 7. java. .xlet.Xlet. java.Runnable et la propri´t´ obligatoire crond. leurs apparitions et leurs disparitions). G´n´ralement.applet. La plate-forme ` est g´n´ralement partag´e par plusieurs fournisseurs qui y d´ploient des bundles. Un bundle e e e e peut d´marrer un thread 12 pour lancer une activit´ relative a l’application apport´e par le e e ` e fournisseur. Ce bundle invoque e p´riodiquement la m´thode run() des services enregistr´s dont le contrat est l’interface e e e java.7. Cette derni`re tache ´tant fastidieuse pour le d´veloppeur. la recherche et la liaison aux services et l’observation de la dynamique des services (c. La derniere est consacr´e e e aux mod`les de composants.MIDlet.4 – Exemple d’une application li´e par les services e Il n’existe pas de notion d’application a proprement parler dans OSGi.Applet. e de pr´f´rence via un service de r´serve (pool ) de threads ee e Par exemple.microedition. L’essentiel de cette API concerne l’enregistrement des services.lang. plusieurs e e e travaux se sont attach´s a proposer des mod`les de composants simplifiant la prise en e ` e charge de la dynamique.lang.Runnable. La figure e e e 7.4 Programmation des services OSGi Cette section est consacr´e a la programmation des objets utilisant et fournissant des e ` services. le point d’entr´e d’une application est un contrat de cycle de e e e vie13 qui est pilot´ par un gestionnaire d’application (d´ploy´ comme un bundle). . La programmation de ces objets est essentiellement fond´e sur des API fournis par e le canevas.d. java.5 pr´sente un tel exemple de gestionnaire d’application CronDeamon.4.

LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI java. e . L’autre rˆle de l’instance de la classe d’activation est celui de d´activer les services o e fournis. e e 4. de relacher les r´f´rences vers les objets de service utilis´s et de lib´rer les ressources ee e e utilis´es (threads. Cette classe publique doit impl´menter l’interface e e BundleActivator. e e 3. e La m´thode stop(BundleContext) se d´roule donc a contre-sens de la mani`re suivante : e e ` e 1.lang. sockets. positionnement d’´couteurs (listener ) sur les ´v´nements de services. puis cr´e une seule instance de la classe e d’activation et enfin invoque la m´thode start(BundleContext) sur cette instance.Runnable R R Application 3 Application 3 Fournisseur C Fournisseur C Figure 7. d´senregistrement des services enregistr´s. cr´ation des objets impl´mentant les interfaces Java d’un contrat.lang. etc. descripteur de fichiers. enregistrement de ces objets comme des services avec les propri´t´s de courtage. la plate-forme invoque la m´thode stop(BundleContext) sur l’instance e e 14 . puis d´truit le chargeur de classes du bundle e Le rˆle de l’instance de la classe d’activation est g´n´ralement de cr´er les objets qui o e e e utiliseront les services fournis par d’autres bundles et qui fourniront a leur tour des services. e 2. suppression des objets de services 4. des bundles et e e e de la plate-forme. relˆche des services auxquels il est li´. recherche des services n´cessaires ou optionnels.Runnable crond.1 Activation L’entr´e Bundle-Activator du manifeste d´signe la classe qui sert de point d’entr´e pour e e e l’activation et pour l’arrˆt du bundle. retrait des ´couteurs e 2.) au cours des invocations de services.4. e e 3. la plate-forme cr´e un chargeur de classe (class e loader ) [Liang and Bracha 1998] propre au bundle. ee 5. liaison avec les services s´lectionn´s. lib´ration de ressources.204 CHAPITRE 7. Pour e arrˆter le bundle. ` La m´thode start(BundleContext) se d´roule donc en g´n´ral de la mani`re suivante : e e e e e 1. a e 5.lang.5 – Exemple de gestionnaire d’applications bas´ sur les services e 7. e 14 La destruction du chargeur provoque le d´chargement et la recyclage (garbage collection) de toutes les e classes qu’il a charg´es.pattern=* 5 | * * * * * * R R Application 2 Application 2 Fournisseur B Fournisseur B java.pattern=* 10 | * * * * * * R R Application 1 Application 1 Fournisseur A Fournisseur A Cron Cron Deamon Deamon java. Pour activer le bundle.Runnable crond.

PrintService". } } L’enregistrement 7. new int[]{72.3 Courtage et liaison de services L’utilisation d’un service se fait en deux ´tapes : la recherche (ou courtage) des services e puis la liaison aux services choisis. ce privil`ge est n´anmoins e e e e e r´serv´ aux bundles d’administration qui ont la permission AdminPermission.7.Object.4.put("org.print. Cette m´thode prend e en param`tre. props.osgi.300.600.laser. e ` a Courtage Le services se fait au moyen de la m´thode e getServiceReferences(String. } public void stop(BundleContext ctxt) throws BundleException { if(reg != null) reg. ee ` e L’exemple suivant pr´sente l’enregistrement du service d’impression par le bundle Lexe Mark de la figure 7. Dictionary props=new Properties().device.1200}). la mise a jour et e ` e ` la d´sinstallation d’un autre bundle.type".Dictionary) du package com.framework. Cette m´thode retourne ee e e e courtage de . Lorsqu’un service n’est plus utilis´ ou bien que le canevas e signale son desenregistrement. public void start(BundleContext ctxt) throws BundleException { servant=new PrintServiceImpl().2 Enregistrement de services d’un service se fait au moyen de la m´thode e contexte.lexmark. props. l’activation. props).150. "laser").impl.registerService( "org. Cet objet e e` e qui impl´mente l’interface BundleContext.4. Il permet e ` ´galement de demander a la plate-forme l’installation. registerService(String[].4. props.*.device.put("org. private PrintService servant=null.dpi". le bundle usager doit proc´der a la relˆche de liaison.unregister(). impl´mente l’interface ServiceRegistration et sert a modifier ult´rieurement e e ` e les propri´t´s d’enregistrement et a d´senregistrer le service. servant. l’arrˆt. le tableau des interfaces du contrat. e e 7. "1st floor").printer. PROGRAMMATION DES SERVICES OSGI 205 Le param`tre pass´ a l’invocation de ces 2 m´thodes est le contexte du bundle. reg=ctxt. la r´f´rence vers l’objet qui remplit e ee le service et le dictionnaire des propri´t´s d’enregistrement. public class Activator implements BundleActivator { private ServiceRegistration reg=null.String) aupr`s de l’objet de contexte. Pour des raisons de s´curit´.device.print.4.put("location". Le premier pae ram`tre est le nom de l’interface des services recherch´s et le deuxi`me est un filtre sur e e e les propri´t´s d’enregistrement d´taill´ au paragraphe suivant. permet au bundle d’obtenir des informations e sur lui-mˆme et d’interagir avec le registre de services interne a la plate-forme.print. L’objet retourn´ par la ee e m´thode. import org.

device. La propri´t´ e e e e e ee ee objectClass repr´sente les noms des interfaces du service. il est n´cessaire de mettre a null toutes les r´f´rences vers l’objet de service pour e ` ee celui-ci puisse ˆtre recycl´.class.PrintService.print. e e refs=bundleContext.print.FaxService))" + "(location=4th floor))" ). e Le courtage peut ˆtre g´n´ralement restreint a un sous-ensemble des services enree e e ` gistr´s au moyen d’un filtre. 2.3. refs=bundleContext. "(objectClass=org. e Les sections de code ci-dessous pr´sentent plusieurs exemples de courtage avec des e filtres.print.device.getServiceReferences( null.device.device. ee e e e !.device. Tous les services d’impression.getName().print. "(&(!(org.device.getServiceReferences( null. Le service d’impression et de fax au 3i`me ´tage.fax.class. Les op´rateurs de comparaison sont limit´s a sup´rieur ou ´gal (<=). refs=bundleContext.device. Relˆche Quand le service n’est plus utilis´ ou quand le service se d´senregistre. null). la a e e m´thode ungetService() de l’objet ServiceReference permet de relˆcher le service. refs=bundleContext. refs=bundleContext. |). 3. ´galit´ (=). Liaison La m´thode getService(ServiceReference) de l’objet BundleContext permet e alors d’obtenir la r´f´rence directe sur l’objet de service. Certains services d’impression. e ` L’exemple suivant pr´sente l’utilisation du service d’impression par le bundle Editor e de l’exemple ci-dessous. Tous les services de org.getName(). . ´galit´ approximative (~=) et pr´sence de la propri´t´ (=*).206 CHAPITRE 7.PrintService)" + "(objectClass=org. "(objectClass=org.type=laser))"+ "(!(org. "(&(&(objectClass=org.print. L’expression contient des exee e pressions simples (propri´t´s op´rateur valeur) connect´es par des op´rateurs logiques (&.device. Tous les services d’impression (alternative). Ce dernier point est important car cet oubli conduit a ne pas e e ` pouvoir arrˆter ou mettre a jour proprement le bundle qui fournissait le service. OSGi n’introduit pas de mandaee taire 2.*)" ).PrintService. 1. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI un tableau de plusieurs objets ServiceReference qui d´crivent les services conformes au e contrat demand´. Cee a pendant.dpi<=300))(location=*)))" ). 5. Ce filtre est une expression de condition de syntaxe LDAP e (RFC1960) sur les propri´t´s enregistr´es par les services.getServiceReferences( org.device.getServiceReferences( null.getServiceReferences( org. inf´rieur ou ´gal e e ` e e e e (<=).1 entre les bundles qui introduisent une indirection et nuisent aux performances.print.PrintService)" ). 4.

..eclispe. // car il faut que l’objet puisse etre recycl´ ^ e // On le relache quand on en a plus besoin servant=null. public class Activator implements BundleActivator { private ProgressBar progressbar.4.. ref=null.ServiceRegistration) de l’interface ServiceFactory r´alise cette e ..getRemainingPages()/job. if(servant!=null) { // On l’utilise Job job=servant.osgi. ServiceReference[] refs=context. context.setLevel(job. } else { // Ce cas se produit quand le service a et´ ´ e // d´senregistr´ dans le laps de temps e e } } } public void start(BundleContext context) throws BundleException { // on le relache bien que la plate-forme ne l’oublie !! if(ref!=null){ servant=null.)..4.. import org. .4 Interception des demandes de liaison L’interface ServiceFactory est une interface de rappel (callback ) qui permet a l’objet qui est enregistr´ d’intercepter la demande de liai` e son (m´thode e getService(ServiceReference) du contexte).getServiceReferences ("org."(location=1st floor)"). } } } 7. ref=null. job=null. servant=(PrintService) context.print(.print..texteditor.PrintService".*.getService(ref). if(refs!=null) { // On prend le premier offert! ServiceReference ref=refs[0].. private PrintService servant..ungetService(ref).framework.getPages()).impl. private ServiceReference ref.ungetService(ref). public void start(BundleContext context) throws BundleException { // On va voir si quelqu’un offre un PrintService . // car il faut que l’objet puisse etre recycl´ ^ e context. .7. La m´thode e getService(Bundle...device. PROGRAMMATION DES SERVICES OSGI 207 package org. progressbar.

ServiceRegistration serviceRegistration) { .2) car plusieurs invocations de la e e m´thode getService(ServiceReference) pour le mˆme service (c. L’objet de service est enfin e e d´truit lorsque le bundle usager relˆche la liaison (m´thode ungetService()). N´anmoins. La classe e a e PrintLazySingleton retarde l’instanciation de l’objet (singleton) de service jusqu’` l’ina terception de la premi`re demande de liaison de la part d’un bundle usager (m´thode e e getService()). Ce dernier peut ˆtre nouvellement e fabriqu´ ou bien pris dans une r´serve (pool) d’instances. Par exemple. Ce m´canisme est g´n´ralement utilis´ pour v´rifier les permissions e e e e e e attach´es des bundles usagers.d. L’objet de service PrintInstanceImpl e peut r´aliser des traitements diff´renci´s en fonction de l’identifiant du bundle qui lui e e e a ´t´ pass´ lors de sa cr´ation. le mˆme objet e e e ServiceReference) par un bundle retourne syst´matiquement l’objet retourn´ a la e e ` premi`re invocation. pour distinguer le traitement a effectuer en fonction du e ` bundle usager ou bien r´aliser l’activation paresseuse (lazy activation) de l’objet de service e afin de retarder l’usage de ressources. Cette classe utilise un compteur de r´f´rence pour d´truire l’objet de seree e vice et lib´rer les ressources qu’il detient lors que le dernier bundle utilisant l’objet relˆche e a celui-ci (m´thode ungetService()).208 CHAPITRE 7. e Le m´canisme de ServiceFactory ne permet pas n´anmoins de fabriquer directement e e des objets de session. la m´thode list() ne retourne que les ee e e e travaux d’impression command´s par le bundle concern´. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI interception et retourne l’objet effectif de service. L’exemple ci-dessous illustre ces deux derniers cas d’utilisation. } public Job[] list() { // ne retourne que les travaux lanc´s par le bundle usager e } public start() { // fait quelque chose } public stop() { // d´fait quelque chose e } } public class PrintFactory implements ServiceFactory { public Object getService(Bundle bundle. e public class PrintInstanceImpl implements PrintService { // identifiant du bundle usager private long bundleId.3. Le d´veloppeur doit alors se tourner vers l’utilisation de contexte de e thread pour traquer les sessions et les ressources qui leur sont attach´s.bundleId=bundleId. public PrintInstanceImpl(long bundleId){ this. La classe PrintFactory instancie un nouvel objet de service PrintService pour chaque nouvelle demande de liaison de la part d’un bundle (m´thode getService()). ce m´canisme e e e e n’est pas r´ellement une v´ritable usine (voir 2.a.

Object instance) { ((PrintInstanceImpl)instance). } referenceCounter++. public Object getService(Bundle bundle. singleton=null. public void start(BundleContext context) throws BundleException { regFact = context.4.7. singleton.class. return instance. } } public class PrintLazySingleton implements ServiceFactory { private int referenceCounter=0. new PrintFactory(). .getBundleId()). instance. regLazy = context. } public void ungetService(Bundle bundle. return singleton.getName(). if(referenceCounter==0){ singleton. null ).stop(). ServiceRegistration serviceRegistration) { if(referenceCounter==0){ singleton=new PrintInstanceImpl(null).class. ServiceRegistration serviceRegistration. } public void ungetService(Bundle bundle. null ). if (regLazy != null) regLazy. private ServiceRegistration regLazy. // pour que le singleton soit recycl´ e } } } public class Activator implements BundleActivator { private ServiceRegistration regFact. PROGRAMMATION DES SERVICES OSGI 209 PrintInstanceImpl instance=new PrintInstanceImpl(bundle.getName().registerService( PrintService.start().stop(). Object instance) { referenceCounter--.unregister().registerService( PrintService.unregister(). ServiceRegistration serviceRegistration.start(). private PrintInstanceImpl singleton=null. new PrintLazySingleton(). } public void stop(BundleContext context) throws BundleException { if (regFact != null) regFact.

est fastidieuse pour a le d´veloppeur. arrˆt´.4. il est imp´ratif de relˆcher e e e a toutes les r´f´rences (directes) vers ce service quand l’´v´nement de service indique le ee e e d´senregistrement de ce service.Object>*/ ref2servantMap. quand un service est utilis´. Elle est simplifi´e par l’usage d’utilitaires comme le ServiceTracker et des e e mod`les a composant orient´s services qui sont pr´sent´s dans la section 7. Set servants. Cette e e e ee tˆche.4. e ` e e e L’exemple de ServiceListener ci-dessous pr´sente le code n´cessaire pour g´rer la liaie e e son dynamique avec tous les services d’impression disponibles. La sp´cification 3 a introduit l’interface SynchronousBundleListener d’un obe e e servateur synchrone des ´v´nements li´s aux bundles. L’interface FrameworkListener est celle de l’observateur asynchrone de ces ´v´nements. En effet. . Les ´v´nements (interface ServiceEvent) relatifs aux services sont : e e – l’enregistrement d’un nouveau service. e e e Les ´v´nements (interface FrameworkEvent) relatifs a la plate-forme concernent les e e ` changements dans le cycle de vie de la plate-forme : red´marrage. qui est critique pour le bon fonctionnement de la plate-forme. voire requise. e – la modification d’une ou plusieurs propri´t´s d’un service d´j` enregistr´. public MyServiceListener(BundleContext context. public class MyServiceListener implements ServiceListener { BundleContext context. e e L’observation est n´cessaire. Set/*<Object>*/ servants. – le d´senregistrement d’un service. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI } } 7. Tous les observae e e e teurs asynchrones sont ex´cut´s les uns a la suite des autres par un seul thread attach´ a e e ` e` la plate-forme. aux bundles et a la e e ` plate-forme au moyen d’observateurs. Un observateur peut ˆtre synchrone ou asynchrone. alors que l’observae e e teur asynchrone est ex´cut´ alors que l’´v´nement a lieu et se poursuit. changement de nie veau de d´marrage.servants=servants. Ce sont les ´v´nements de service qui occupent le plus souvent l’attention du e e d´veloppeur OSGi. Si la relˆche n’est pas effectu´e.6.5 Ev´nements et observateurs e Le bundle peut souscrire aux ´v´nements relatifs aux services. String interfaceName. rafraˆ e ıchissement des exportateurs effectifs de package. pour rendre les bundles sensibles aux chane gements. e L’observateur synchrone s’ex´cute avant que l’´v´nement soit effectif. d´marr´. L’interface BundleListener est celle de l’observateur asynchrone de ces e e ´v´nements. ee ea e L’interface ServiceListener est celle de l’observateur synchrone de ces ´v´nements.context=context. this. mis a jour e e e ee ` et d´sinstall´. String interfaceName) { this. e e Les ´v´nements (interface BundleEvent) relatifs aux bundles concernent les changee e ments suivants dans le cycle de vie des bundles : install´. l’objet de service ne e a e peut pas ˆtre recycl´ et le bundle fournisseur ne peut ˆtre correctement arrˆt´. Map/*<ServiceReference.210 CHAPITRE 7.

if(servant==null) continue.getService(ref).add(servant). while(iter.i++){ if(!objectClasses[i].ungetService(ref).servant).i<srs. ref2servantMap.7. } public void open() { ServiceReference[] srs=context.getType()) { case ServiceEvent. if(servant==null) continue.getServiceReference().length. PROGRAMMATION DES SERVICES OSGI 211 this. servants.getService(srs[i]).remove(ref).i++){ Object servant=(Object) context. for(int i=0.ref2servantMap=new HashMap().i<objectClasses. servants.REGISTERED: { Object servant=context.remove(ref). context. switch (e.put(ref.equals(interfaceName)) continue. } case ServiceEvent.keys().servant).MODIFIED: break. } } public void close() { Iterator iter=ref2servantMap.UNREGISTERING: { Object servant=ref2servantMap.interfaceName=interfaceName. String[] objectClasses=ref.length. servants. } } } } public class Activator implements BundleActivator { . } } public void serviceChanged(ServiceEvent e) { ServiceReference ref = e.getProperty("objectClass").getServiceReferences(interfaceName). servants. break. if(ref==null) continue. context.add(servant).remove(servant). } case ServiceEvent.ungetService(ref). for(int i=0. ref2servantMap. break.next().remove(servant). Object servant=(Object) ref2servantMap.4. this.hasNext()){ ServiceReference ref=(ServiceReference)iter.put(ref.

Le d´veloppement est grandement simplifi´ par la description du ee e e e composant au moyen d’un descripteur d´claratif dans une grammaire XML.util. Le composant fournisseur du service (` droite de la figure) est d´crit par le descripteur a e de droite.. listener=new MyServiceListener(context.getName()).PrintService.. } } 7. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI Set printers.close(). e Service Component Runtime Le Service Component Runtime (SCR). public void start(BundleContext context) throws BundleException { servants=new HashSet().class.6 Mod`les de composants e L’observateur de la section de code pr´c´dente est relativement simple car un e e ServiceListener complet doit traiter les expressions de filtre pour restreindre le nombre de services et prendre en compte les changements de propri´t´s.printers.addServiceListener(listener).open().6 pr´sente deux composants interagissant autour d’un service e d’impression. } public void stop(BundleContext ctxt) throws BundleException { context. // faire quelque chose avec les servants . MyServiceListener listener. Ce composant fournit un service (c’est-`-dire une facette) d´crit par l’´l´ment a e ee service.212 CHAPITRE 7. listener.removeServiceListener(listener). propose un e mod`le a composants [Szyperski 2002] orient´ services qui capture la dynamique des sere ` e vices et assujettit le cycle de vie de l’objet usager a la pr´sence et a l’absence des services ` e ` r´f´renc´s obligatoires. L’exemple de la figure 7. Ce service impl´mente une interface fonctionnelle (PrintService) et une intere . introduit dans la sp´cification 4. Ce mod`le de e e composant autorise l’´criture d’applications a partir de composants SCR mais ´galement e ` e de services fournis par des bundles patrimoniaux. Le constat est que la prise en charge de la dynamique des sere vices est une tˆche tr`s lourde pour le d´veloppeur OSGi et qu’elle conduit a un taux a e e ` ´lev´ d’erreurs de programmation qui peut provoquer un blocage partiel de la platee e forme. Cette tˆche devient ing´rable quand le nombre de sera e vices utilis´s grandit. .4. ServiceTracker est limit´ par le fait qu’il ne traque qu’un seul service et ne g`re pas le e e cycle de vie de l’objet utilisateur des services en fonction de leurs disponibilit´s effectives.servicetracker)qui comme son nom l’indique suit un service.. context. Il peut ´ventuellement ee e agir sur le cycle de vie de l’utilisateur des services si la disparition de ceux-ci empˆche e un fonctionnement normal.osgi.. Une premi`re r´ponse a ce constat est la classe utilitaire ServiceTracker (pae e ` quetage org. listener.

Cette fonctionnalit´ permet de limiter l’usage des ressources e de la machine hˆte lorsque de nombreux services sont d´ploy´s sans ˆtre utilis´s. FROGi e e [Donsez et al. SCR le compl`te n´anmoins par la e e possibilit´ de retarder l’instanciation de l’objet de service jusqu’` la demande de liaison e a effective par un bundle usager.7. Le caract`re multiple de la liaison signifie que le composant e peut utiliser un ensemble de services PrintService. Elles sont invoqu´es lors de l’instanciation ou de la destruction du e composant et lors de l’apparition ou de la disparition des services int´ressants le compoe sant. ` Le composant usager du service (` gauche de la figure) est d´crit par le descripteur a e de gauche. Le caract`re obligatoire signifie que le e composant est instanci´ d`s qu’un service PrintService est disponible et il est d´truit d`s e e e e que le dernier PrintService est d´senregistr´. la s´curit´. Les m´thodes optionnelles activate /desactivate sont e les m´thodes de rappel pour le contrˆle du cycle de vie. Les ´l´ments references indiquent que le composant r´f´rence plusieurs seree ee vice obligatoires d’impression (PrintService) et un service optionnel de journalisation (LogService). PROGRAMMATION DES SERVICES OSGI 213 face technique (ConfigMBean15). Les propri´t´s d´clar´es dans les ´l´ments property sont ee e e ee utilis´es pour qualifier le service fourni. Le d´veloppeur OSGi doit encore g´rer ceux-ci de mani`re ad-hoc et e e e non transparente.4. e e Leurs chemins sont list´s dans l’entr´e Service-Component du manifeste. L’attribut cardinality indique si la liaison est simple ou multiple et si elle est obligatoire ou optionnelle. Les m´thodes de rappel (callback ) pour le contrˆle de la liaison sont d´crites par les e o e attributs bind /unbind. e e Travaux apparent´s e SCR reprend a ` son profit les principales id´es e de ServiceBinder [Cervantes and Hall 2004][Cervantes 2004]. Le composant peut alors r´cup´rer la ou les r´f´rence(s) vers le e e ee service au travers de son contexte. Par exemple. etc. Le fournisseur de service peut ˆtre une usine de e e services (non pr´sent´e dans l’exemple) qui instancie des services personnalis´s a chaque e e e ` composant usager au lieu du singleton commun a tous. la distribution. L’attribut e e policy indique qu’un service qui disparaˆ est substituable dynamiquement par un autre ıt service ´quivalent. 2004] propose de d´velopper les applications selon le canevas Fractal et e de conditionner celles-ci dans un ou plusieurs bundles. e e les sessions. La m´thode activate est invoqu´ e o e e au moment de l’instanciation juste apr`s la cr´ation des liaisons et la m´thode deactivate e e e est invoqu´ au moment de la destruction juste avant la cr´ation des liaisons. L’attribut target e ee e restreint le courtage a un sous-ensemble de services PrintService au moyen du expression ` LDAP. Le caract`re optionnel indique que le come e e posant peut fonctionner sans n´cessairement r´f´rencer le service d´crit. Les descripteurs de composants du bundle sont conditionn´s et livr´s dans le bundle. Les liaisons entre composants Fractal s’appuient sur le courtage de services OSGi lors que les composants sont d´ploy´s e e 15 qui permet la configuration du composant via un agent JMX embarquable sur la plateforme [Fr´not and Stefan 2004] e . SCR o e e e e reste cependant un mod`le de composants simple et non-hi`rarchique qui ne prend pas e e en charge les aspects non fonctionnels comme la persistance. Il existe n´anmoins plusieurs travaux apparent´s. Ces m´thodes sont cependant optionnelles comme dans le cas de la r´f´rence vers un e ee service de journalisation. La politique statique interdit toute substitution apr`s l’activation du e e composant.

LOG_INFO.log(LogService. “Editor stopped")). com.PrintService.print.remove(ref).locateService("LOG").add(ref).log(LogService. 6 7 '$ '$ '$ . LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI # # $ % # -. if(log!=null) log.xml HPPrinter HPPrinter cmp. '$ !" .locateService("LOG").xml % & [org. 1 ()* + ( /0. if(log!=null) log. } public Job print(InputStrean in. #' '$ #' $ Word Word Processor Processor 34 5 cmp. } } public void unbindPrintService(PrintService ref){ synchronized (printServices ){ printServices. Dictionary printParams ) throws PrintException { … } // méthodes de ConfigMBean public long getPrintedPageCounter(){ … } public void setDefaultTrailer(int trailerId){ … } … } Figure 7. ( 34 5 2 . 00 & '$ # # $ ( # 2 # 2 # . } public void bindPrintService(PrintService ref){ synchronized (printServices ){ printServices. // must release this reference // démarre la thread principale du traitement de texte … } public void deactivate(ComponentContext ctxt) { // arrête la thread principale … LogService log = (LogService)ctxt.printer. log=null.hp. ConfigMBean { // méthodes de PrintService public Job[] list(){ .. # $ # # #' $ $ ( & . } } … } public class PrinterComp implements PrintService. “Editor starting")). log=null.ConfigMBean] ( & ()* + !" public class EditorComp { private List printServices = new ArrayList() public void activate(ComponentContext ctxt) { LogService log = (LogService)ctxt.LOG_INFO.device. '$ & '$ ( 2 '$ # 2 .6 – Exemple de composants SCR .214 CHAPITRE 7. 3 " 1 ..

Le service HttpService permet a des bundles de publier 17 une application Web (en ` anglais raccourci WebApp) constitu´e de servlets et de JSP respectant la sp´cification e e J2EE5. SERVICES STANDARD 215 dans des bundles diff´rents. des o fichier JAR d’applet ou de midlet. le Wire Admin Service pour ` les applications bas´es sur la collecte de mesures depuis un r´seau de capteurs et l’UPnP e e Device Driver dans le contexte des services a l’habitat. Les ressources statiques qui sont e conditionn´es dans le fichier JAR du bundle. d’exportation des journaux d’audit. Certains services sont assez g´n´raux pour ˆtre utilie e e e sables dans n’importe quel domaine d’application tandis que les autres traitent des besoins sp´cifiques a un domaine comme l’automobile ou la t´l´phonie mobile. a 17 16 . ee e Cette section n’a pas la vocation de pr´senter l’ensemble des services standardis´s e e par l’OSGi Alliance. de e e configuration. Cet objet permet un acc`s contrˆl´ et typ´ (type e e oe e MIME) aux ressources conditionn´es dans le fichier JAR d’un bundle via son chargeur de e classes. Le d´veloppement e ` ee e d’une application ne requiert en g´n´ral qu’un sous-ensemble des services standard e e compl´t´s par des services propri´taires.http) est un des trois premiers services sp´cifi´s par l’OSGi Alliance. enregistre un service HttpService. Pour cela. 7. des icˆnes. le bundle qui impl´mente le serveur HTTP e charg´ de recevoir les requˆtes.7. Ce choix s’explique par la tendance effective a ade e ` ministrer des ´quipements r´seaux en s’appuyant sur HTTP via des documents HTML 16 .5. sont enregistr´es via un objet HttpContext e e avec la m´thode registerRessource(). Il est cependant recommand´ de conditionner les JSP dans leur forme compil´e 18 e e en anglais Web-based management rendre accessible via HTTP 18 la tˆche ANT <jspc> effectue cette compilation avant le conditionnement (Ahead Compile Time).5. Le lecteur peut se reporter a la sp´cification pour en avoir la liste ` e exhaustive.1 Http Service Le service HttpService (paquetage org. e e L’´quipement embarque un serveur Web qui ex´cute les fonctions d’administration. Une application Web peut contenir des scripts JSP (Java Server Page) qui seront compil´s a la vol´e par la servlet embarqu´e JspServlet comme dans un serveur J2EE e ` e e classique. Ceux-ci sont g´n´ralement optionnels par rapport au noyau OSGi (core) qui e e ne d´pend d’aucun d’entre eux. D’autres travaux s’int´ressent a l’ing´nierie des conteneurs e e ` e dynamiques pour les services OSGi par l’utilisation de la programmation orient´e aspect e ou bien encore par l’injection de code sur des POJOs (Plain Old Java Objects). ` 7.service. Cette section d´taille trois d’entre eux repr´sentatifs des domaines applicatifs : e e le Http Service pour l’administration a distance via le Web.1 mais aussi des documents statiques comme des documents HTML. etc.5 Services Standard L’OSGi Alliance a progressivement enrichi les sp´cifications successives de services e standard. Un bundle publiant e e une application Web se lie a ce service et enregistre chacune des servlets en invoquant ` la m´thode registerServlet() du service HttpService.osgi.

+ ' " +$ " " 0& " +$ " & 0& " Passerelle enfouie Figure 7. le compteur ´lectrique de la figure 7. e e Les requˆtes GET provenant de la console sont redirig´es vers le bundle WebConsole qui e e effectue l’action d´mand´e et retourne un document HTML repr´sentant l’´tat rafraˆ de e e e e ıchi la plate-forme. les commandes sont des plugins du bundle ShellService. Ces ee ` e requˆtes SOAP sont relay´es vers le bundle SoapService qui d´code les messages contenus e e e et r´alise l’invocation des services des bundles qui y sont li´s.1.1 dont l’´l´ment Body contient un script de lignes de commande a ex´cuter. Parall`lement.7 – Administration de passerelle via HttpService 19 par exemple. e e e e La figure 7.. -. e . LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI afin d’´viter le surcoˆ t li´ a la compilation elle-mˆme et a l’embarquement d’un compilateur e u e` e ` de JSP. gw123 Web Console 3 UserAdmin 4 ShellService 5 SerialConsole 6 HttpService 7 SoapService 8 HttpAdmin 9 OBRCommand 10 SSHDConsole start stop start stop start stop start stop start stop start stop start stop start stop port tcp 443 Web Console Server ! "# $ " " " $ ! "# + & / & / & ' % & &# # ' " () *' . En marge de cette application d’administration. le bundle SoapService e e peut servir d’autres services Web embarqu´s comme le SensorLoggerWebSvc qui r´alise e e la rel`ve de mesures acquises sur des capteurs connect´s 19 a la passerelle et journalis´es e e ` e depuis la rel`ve pr´c´dente. e e e Le serveur embarqu´ dans le bundle HttpService sert les requˆtes provenant du Web.2. Les requˆtes POST provenant du serveur de d´ploiement sont des messages e e SOAP4. Le service HttpService peut ´galement servir a publier des services Web (voir chapitre e ` 4). est pr´sent´ a la e e e e e e` section 7.216 CHAPITRE 7.4.7 pr´sente un exemple d’administration s´curis´e de la passerelle par HTTP. Dans le cas qui nous int´resse. Plusieurs impl´mentations de services Web sont bas´es sur le reconditionnement en e e bundle d’impl´mentations comme AXIS ou la tr`s l´g`re kSOAP. Ce type d’application dite orient´e capteur.5. e e e le service invoqu´ est le service de script du bundle ScriptService qui invoque le service e de shell du bundle ShellService pour chaque commande du script envoy´. Dans cette e architecture. le e service de shell sert a des consoles textuelles comme le bundle SerialConsole qui g`re une ` e console branch´e sur le port s´rie ou le bundle SSHDConsole qui permet un acc`s distant e e e s´curis´ au shell.

l’initiative peut venir ´galement de service Consumer qui peut demander a tous e e e ` les objets Wire de forcer les services Producer a produire une donn´e conform´ment au ` e e mod`le pull.wireadmin) pour la construction de telles applications. la notion de flavor d´crit la e e liste ordonn´e des classes Java des objets que peut produire un service Producer et qu’un e service Consumer peut consommer. la temp´rature d’une poche de transfusion sane e e guine ou celle du moteur d’un v´hicule. Ainsi il pousse par le biais d’un objet Wire un objet du type de la liste flavors du service Consumer. e e Le service WireAdminService cr´e un objet Wire qui r´f´rence un service Producer et un e ee service Consumer pour chaque liaison de la topologie de l’application.service.osgi. Ce type est la premi`re classe commune des deux listes e flavors des services Producer et Consumer raccord´s au Wire. l’image infrarouge d’une cam´ra de surveillance. De plus. e e le niveau de toner d’un photocopieur ou bien encore la fr´quence cardiaque d’un soldat e au contact de l’ennemi ou celui d’un patient en convalescence a son domicile. o e e . Ces mesures peuvent ˆtre aussi vari´es que l’identifiant d’un badge RFID lu par e e un portique. analyser et r´agir aux mesures acquises par les capteurs diss´min´s e e e e dans le monde r´el afin de les int´grer en temps r´el dans les syst`mes d’information des e e e e entreprises. e Afin d’´viter l’inondation des consommateurs par les producteurs. Ces services ` s’articulent principalement autour du traitement de flux de mesures acquises en d´but de e chaˆ par une myriade de capteurs. Pour cela. le service WireAdmin e sp´cifie cinq sch´mas de contrˆle de flot.5. e e o Ces sch´mas de contrˆle sont : e o – envoi en cas de changement de valeur – envoi en cas d’´cart absolu de la nouvelle valeur par rapport a la pr´c´dente e ` e e – envoi en cas d’´cart relatif de la nouvelle valeur par rapport a la pr´c´dente e ` e e – envoi sur hyst´r´sis encadr´ par un seuil bas et par un seuil haut ee e – envoi p´riodique pour un certain seuil fix´ e e Le contrˆle de flot est r´alis´ soit par le service Producer. Un fois la liaison ´tablie. Un objet Wire ne peut ˆtre cr´er que si les services e e Producer et Consumer partagent une classe en commun dans les 2 listes de flavors. soit par l’objet Wire. ıne Sous l’impulsion des fabricants d’automobile. un bundle participe a une application en enregistrant un service Producer ` pour produire des donn´es ou un service Consumer pour consommer des donn´es produites. la e e e puissance consomm´e par une chaudi`re. un service Producer doit adapter l’envoi de donn´es vers les services Consumer en fonction e de leur listes de flavors. Contrairement au mod`le push e pr´c´dent. un producteur peut ˆtre li´ a plusieurs consommateurs et un consommateur peut ˆtre e e ` e li´ a plusieurs producteurs. agr´ger. la position GPS d’un v´hicule ou celle d’un prisonnier en libert´ supervis´e.7. col` e lecter. Ce service maintient une topologie dynamique de liaisons (Wire) reliant des producteurs de mesures aux consommateurs de ces mesures.2 Wire Admin Les applications a base de capteurs (sensor-based services) proposent d’acqu´rir. un service Producer peut pousser e ` e une donn´e (par exemple. SERVICES STANDARD 217 7. l’OSGi Alliance a sp´cifi´ le Wire Ade e min Service (paquetage org. Dans une topologie. Pour cela. Le service Wire Admin impose a la fois la compatibilit´ des donn´es ´chang´es e ` e e e e et leurs adaptations si celles-ci sont n´cessaires. une mesure r´cup´r´e sur un capteur physique) vers tous les e e ee objets Wire qui les propageront vers les services Consumer. filtrer.5.

altitude. accident. longitude.5. . radio. appareil-photo. cap> – un bundle Initial Sensor pilotant un capteur inertiel qui produit des objets DiffPosition qui sont des doublets de variation instantan´e de cap et de vitesse. e – un bundle Position Correlator corr´lateur de position qui inf`re et produit des objets e e Position a partir d’un objet Position de r´f´rence consomm´e et une suite d’objets ` ee e DiffPosition consomm´es.218 CHAPITRE 7. . Ce bundle prend en compte la dynamique e e` des services Producer et Consumer fournis par des bundles qui n’´taient pas forc´ment e e pr´vus initialement comme par exemple un bundle produisant des positions a partir e ` des informations de positionnement des r´seaux GSM. Cette application est constitu´e de : ee e – un bundle GPS Receiver pilotant un r´cepteur de position GPS qui produit des e objets Position qui sont des quintuplets <latitude. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI Un exemple d’application avec WireAdmin L’application a base de capteurs per` met d’indiquer au conducteur d’un v´hicule la distance restante et le cap vers des points e d’int´rˆt choisis (station essence. e GPS GPS Receiver Receiver flavors=Position Inertial Inertial Sensor Sensor flavors=DiffPos Position Position Correlator Correlator flavors=Position. DiffPos flavors= Position POI POI Locator Locator flavors= Position WireAdmin WireAdmin Binder Binder WADL P P P P C C C C P P C C WireAdmin P Wire C P Wire C P Wire C flavors=Position flavors=DiffPos flavors=Position Wire Admin Service Impl Wire Admin Service Impl Figure 7. – un bundle POI Locator de localisation de points d’int´rˆt (Point Of Interest) qui ee calcule et affiche le cap a tenir et la distance restante avec le point d’int´rˆt le plus ` ee proche a partir des objets Position produits par le bundle Position Correlator. ` – un bundle Wire Admin Binder de construction de la topologie des Wires a partir ` d’un ADL d´di´ a ce type d’application. Mediae . TV. . Les domaines couverts sont la micro-informatique/bureautique (imprimantes. . Ce bundle de m´diation est utile quand le r´cepteur GPS e e e perd le signal des satellites GPS (sous un tunnel par exemple) et ne produit plus d’objets Position.). vitesse.3 UPnP Device Driver Universal Plug and Play (UPnP) Forum [UPnP Forum 2005] est un consortium industriel ouvert qui s’est form´ en 1999 pour la d´finition de standards simplifiant la mise en e e r´seaux d’´quipements communicants dans les maisons et dans les entreprises (SOHO : e e Small Office Home Office).8 – Exemple d’application a base de capteurs ` 7. l’´lectronique grand public (DVD.).

soit tous les p´riph´riques e e e e d’un mˆme type ou bien soit tous les services d’un mˆme type. . l’objet UPnPService d´crit la liste de variables d’´tat au moyen d’obe e jets UPnPStateVariable et la liste des actions au moyen d’objets UPnPAction. qui assure le pont entre les points de contrˆle UPnP et les o p´riph´riques UPnP pr´sents sur le r´seau IP adhoc. Un point de contrˆle qui souhaite e o ˆtre inform´ des changements d’´tat des variables enregistre un service UPnPEventListener. et les bundles h´berg´s par la platee e e e e e forme20 .5. e e 20 L’Alliance avait sp´cifi´ un service pour JINI avec des objectifs similaires dans la version 3 de la e e sp´cification OSGi. . WS-Policy.service. . etc. Ce chapitre d´crit d’une part l’API org. Le chapitre UPnP Device Driver de la sp´cification OSGi traite la mani`re de e e d´velopper des p´riph´riques UPnP et des points de contrˆle UPnP au dessus une platee e e o forme OSGi. WS-Security. . e e e – leur description et celles des services qu’ils fournissent. L’API comporte ´galement l’interface de service UPnPEventListener. Cependant ce service a ´t´ retir´ de la version 4 faute d’un soutien des ´quipementiers. Cette interface contient prine e e cipalement les r´f´rences vers des objets UPnPService qui d´crivent les services associ´s ee e e au p´riph´rique. e e e Les bundles (dont l’UPnP Base Driver ) qui fournissent des services UPnPDevice.2. La demande ` de notification peut concerner soit un p´riph´rique particulier. r´gulation du chauffage. A son tour.). Cette interface UPnPService n’est jamais enregistr´e comme un service e e e OSGi. . la communication (t´l´phones. XML Schema. SERVICES STANDARD 219 Center. L’invocation d’une action sur le p´riph´rique UPnP se traduit par l’invocation de la m´thode e e e Dictionary invoke(Dictionary args) sur l’objet UPnPAction correspondant. t´l´vision. r´frig´rateur. et d’autre part un ´l´ment de la pase e e ee serelle. Les protocoles UPnP traitent : e e e e – la d´tection et le retrait dynamique des p´riph´riques. Les proe ` tocoles de UPnP DA s’appuient sur XML. L’interface de service UPnPDevice d´crit le p´riph´rique.). . e e UPnP DA n’est pas attach´ a un langage particulier (comme JINI avec Java). . WS-Discovery et WSEventing.0 et HTTP au dessus de TCP. – l’utilisation par les points de contrˆle (PDA. e Universal Plug and Play (UPnP) Device Architecture (DA) sp´cifie les protocoles pour e des r´seaux spontan´s de p´riph´riques (devices) . volets roulants. l’UPnP Base Driver. la domotique (alarme antiee intrusion. doivent alors se lier a ce service UpnPEventListener afin d’effectuer les notifications. La prochaine version d’UPnP DA devrait s’orienter vers les protocoles vers les standards actuels des services Web.upnp dont l’interface e principale UPnPDevice repr´sente un p´riph´rique. .7. SOAP 1. UPnP Forum a publi´ une premi`re version des protocoles e e e e r´seaux requis (UPnP DA) et un certain nombre de d´finitions standard de p´riph´riques e e e e (devices) et de leurs services associ´s. routeur ADSL. ` WS-Addressing. Cependant. WS-MetadataExchange. La proposition DPWS (Device Profile for Web Services) candidate a UPnP v2 s’appuie sur SOAP 1.osgi.1. WSDL 1. e e UPnP DA a les mˆmes objectifs que JINI [Waldo 1999] propos´ par SUN. UDP et UDP Multicast. t´l´commande RF. e e e e e .) des o ee ee services fournis – la notification des changements de valeurs des variables d’´tat associ´es aux services.).) ou bien encore l’´lectrom´nager e e e (lave-linge.

Le point de contrˆle e ` o enregistre a son tour un service UPnPEventListener quand il souhaite ˆtre notifi´ des chan` e e gements d’´tat d’un p´riph´rique concern´. En effet. install´ e e e o e e e .220 CHAPITRE 7. e e e e t´l´vision. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI Cas d’utilisation Cette section pr´sente quatre mises en œuvre possibles d’OSGi UPnP Device Service. cependant. enregistre un sere e e vice UPnPDevice pour chaque p´riph´rique UPnP d´couvert. t´l´phone mobile. Le bundle p´riph´rique doit alors se lier a ce e e e ` service pour pouvoir notifier les changements de valeur. Le bundle point de contrˆle utie e o lise ce service et fournit a son tour un service UPnPEventListener pour ˆtre inform´ des ` e e changements de valeur des variables d’´tat. Le bundle point de contrˆle e e e o s´lectionne les services UPnPDevice pertinents pour lui et se lient a eux. e Figure 7. e Colocalisation La premi`re mise en œuvre colocalise un bundle point de contrˆle et e o un bundle p´riph´rique sur la mˆme passerelle et aucun ´change r´seau n’´tant op´r´. Le bundle UPnP Base Driver qui fait le pont en les autres bundles d´ploy´s et le r´seau UPnP. les probl`mes pouvant provenir du e e o e r´seau. panneau sensible ou touchpanel) embarquant une passerelle ee ee OSGi (avec une machine virtuelle Java J2ME/CDC ou J2SE).9 – Colocalisation d’un point de contrˆle et d’un p´riph´rique o e e Point de Contrˆle UPnP La mise en œuvre consiste dans la r´alisation d’interfaces o e homme-machine (IHM) plus ou moins ´volu´es pour le contrˆle de p´riph´riques UPnP. e e e e e e ee Le bundle p´riph´rique fournit un service UPnPDevice. La plate-forme OSGi permet alors la r´alisation d’IHM dynamique r´agissant e e a l’apparition et a disparition de p´riph´riques dans l’environnement r´seau du point de ` ` e e e contrˆle. Le bundle UPnP Base Driver se lie au service e e e e UPnPEventListener et annonce au p´riph´rique sa demande de notification conform´ment a e e e ` l’UPnP DA. le bundle contenant le code de l’IHM d´di´e au p´riph´rique n’est pas o e e e e n´cessairement install´ au d´marrage du point de contrˆle et peut ˆtre charg´. Cette mise en œuvre a un int´rˆt ee limit´ d’un point de vue op´rationnel . elle permet de mettre au point des e e p´riph´riques et des points de contrˆle sans en ajouter. e e o e e Ces IHM sont g´n´ralement ex´cut´es sur des terminaux domestiques (assistant personnel.

Ce dernier type r´seaux non-IP (comme X10.7. 21 . le code du service UPnPDevice peut ˆtre d´ploy´ au moment de la d´couverte. Le niveau fonctionnel des ´quipements raccord´s e e e e est g´n´ralement tr`s faible car la partie communication de l’´quipement est fortement e e e e contrainte par son coˆ t. Pour chaque point de contrˆle externe a la passerelle qui o ` souhaite ˆtre notifi´ des changements de valeur dans le p´riph´rique. le bundle UPnP Base Driver se lie a ce service et annonce l’apparition d’un nouveau p´riph´rique dans le r´seau ` e e e ad hoc. OneWire e de r´seaux est appel´ « micro-monde ». SERVICES STANDARD 221 et d´marr´ dynamiquement au moment de l’apparition du p´riph´rique [Donsez 2006]. ModBusTM . le bundle UPnP Base e e e e Driver enregistre un service UPnPEventListener. e e oe a )!) ! "# )!) ! *" ! ! "# $ % & '! ' ( Figure 7. Le e e e e Certains r´seaux comme X10 n’offrent pas de m´canismes de d´couverte ou de sondage. La figure pr´sente un d´codeur de TV num´rique e e e e e e embarquant une passerelle OSGi et une machine virtuelle Java J2ME/CDC. .5. Le bundle p´riph´rique contrˆle le mat´riel de la STB comme la carte tuner et la carte son. De mani`re similaire a la seconde mise en e e e ` œuvre. IEEE1394.). A ce moment. Les adresses des e e e ´quipements du micro-monde doivent donc ˆtre entr´es manuellement par l’installateur des ´quipements e e e e via l’interface de configuration de la passerelle. Passerelle UPnP avec les micro-mondes La derni`re mise en œuvre propose d’utie liser la passerelle OSGi pour cr´er des ponts entre un r´seau UPnP (bas´ sur IP) et des e e e TM . Les points de contrˆle externes a la passerelle peuvent alors invoquer des actions o ` qui seront convertit en appel de m´thode invoke(Dictionary) sur l’objet UPnPAction par e le bundle UPnP Base Driver. Le e e e e bundle sera g´n´ralement charg´ depuis un site Web qui peut ˆtre celui du constructeur e e e e du p´riph´rique contrˆl´ ou bien d’un site miroir ou pair-`-pair. . Ce e e o e bundle enregistre tout d’abord un service UPnPDevice.10 – Point de contrˆle UPnP o P´riph´rique UPnP Cette mise en œuvre permet d’utiliser Java et OSGi pour e e d´velopper des p´riph´riques UPnP. La mise en œuvre est tr`s semblable a la pr´c´dente car le bundle u e ` e e qui r´alise le pontage avec le micro-monde enregistre un service UPnPDevice pour chaque e ´quipement d´couvert dans le micro-monde 21 .

Plusieurs services standardis´s ont ´t´ ´galement d´taill´s. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI $ $ & $ $ %& !" !! # Figure 7. Ce chapitre a pr´sent´ les grands principes de la e e e e plate-forme dynamique de services OSGi. 7. e e $ $ & $ $ %& !" !! # Figure 7. e eee e e . La passerelle e o e e est d´crite alors comme un p´riph´rique.12 – Liaison interne entre un appareil et un point de contrˆle o Pour terminer cette section. ainsi que la programmation des services dynamiques. elle embarque seulement un bundle e e e d’administration fournissant un service UPnPDevice.6 Conclusion et Perspectives OSGi s’est impos´ comme le standard de fait pour l’ex´cution et l’administration des e e plates-formes Java de services d´port´es.11 – P´riph´rique UPnP e e bundle UPnP Base Driver assure quand a lui le pontage entre les services UPnPDevice ` enregistr´s et le r´seau UPnP.222 CHAPITRE 7. Pour cela. UPnP DA peut ˆtre ´galement utilis´ comme support pour e e e d´couvrir et contrˆler les passerelles OSGi pr´sentes sur un r´seau ad hoc.

CONCLUSION ET PERSPECTIVES 223 Le march´ des passerelles OSGi compte d´j` plusieurs fournisseurs commerciaux (IBM e ea SMF. et aux supports e e par les machines virtuelles du march´ pour les J2ME/CLDC.NET repose sur une machine virtuelle.2).2. e ea 22 par analogie avec le DLL Hell de Microsoft DCOM . Siemens VDO TLA. . e Et cˆt´ serveur ? Jusqu’` pr´sent. Le nouveau mod`le de conditionnement que vise a d´finir ce JSR risque fort de e e ` e ressembler a la sp´cification 4 de OSGi sortie en Octobre 2005.1). La diff´rence entre ces plates-formes tiennent e surtout aux outils (d´veloppement.7.) et des impl´mentations open-source mae tures (Oscar. ProSyst mBedded. Felix. 2006]. e e e ` une bonne partie de la sp´cification du noyau de la plate-forme OSGi R4 sera absorb´e e e par l’environnement d’ex´cution de Java. e Et la plate-forme Microsoft . Mais on peut parier que Microsoft corrigera le tir si le besoin de dynamicit´ se fait sentir dans les domaines de e march´ encore vierges que vise d´j` OSGi. 2006]. le grain de d´chargement des classes est le domaine d’application et les r´f´rences e ee directes entre domaines d’applications sont interdites. Si ces deux JSR sont adopt´s et int´gr´s a la plate-forme Java. Ce e e e JSR a ´t´ tr`s r´cemment compl´t´ par le JSR 291 Dynamic Component Support for Java ee e e ee SE qui propose le mod`le d’ex´cution d’OSGi R4 comme mod`le d’ex´cution dynamique e e e e pour les applications Java. Il constate que les probl`mes de d´ploiement des applications Java (J2SE et Java e e EE) sont li´es au manque de m´ta-informations d´crivant les d´pendances des unit´s de e e e e e d´ploiement. qui ex´cute e un code portable. ` ` . avec son adoption par le projet Eclipse [Gruber et al. aux bundles dise e ponibles impl´mentant des services standard ou des services propri´taires. pour e e l’instant. administration de parc. section 6. oe a e e Cependant. La disponibilit´ de ce JSR ` e e dans l’´dition standard de la plate-forme est pr´vue pour sa version 7 (appel´e Dolphin). J2ME/CDC et J2SE. .NET alors ? Le grand concurrent de Java pourrait-il servir a construire une plate-forme dynamique de services semblable a OSGi ? Comme Java. avec les versions actuelles de la CLR [Escoffier et al. Knoplerfish. OSGi est synonyme de serveurs embarqu´s ou enfouis. section 6. le MSIL (voir chapitre 6.6. La r´ponse semble ˆtre non.2. Cepene dant. OSGi pourrait bien ˆtre demain la plate-forme de r´f´rence pour construire des serveurs d’application e ee d’entreprise dynamiques et flexibles [D´sertot et al. e De fa¸on g´n´ral. charg´ dynamiquement. d´ploiement). tout d´veloppeur d’application gagne a conditionner ses applications c e e e ` sur la forme de bundle OSGi afin d’´viter l’enfer du CLASSPATH 22 lors du d´ploiement e e des applications. la CLR (voir chapitre 6. Equinox). 2005] et r´cemment e par plusieurs projets de l’Apache Software Foundation [Rodriguez 2005]. La tr`s r´cente annonce du JSR 277 Java Module System confirme cette e e tendance.

224 CHAPITRE 7. LA PLATE-FORME DYNAMIQUE DE SERVICES OSGI .

org/licenses/by-nc-nd/ 2.10:31) Licence Creative Commons (http://creativecommons.fr) Chapitre 8 Conclusion Chapitre provisoirement indisponible.Intergiciel et Construction d’Applications R´parties e c 2006 (version du 19 janvier 2007 . .0/fr/deed.

CONCLUSION .226 CHAPITRE 8.

Sophia Antipolis e 4 Universit´ Pierre et Marie Curie et INRIA e 5 Scalagent Distributed Technologies 6 France Telecom R&D 2 1 . OSGi en pratique D. Balter 5 . AOKell : une r´alisation r´flexive du mod`le Fractal e e e E. D. Bersihand6 . Infrastructure M2M pour la gestion de l’´nergie e M. Speedo : un syst`me de gestion de la persistance e G. Riveill3 . e S.NET en pratique C. Balter 5 Queensland University of Technology. Emsellem3 D. Grenoble e 3 Universit´ de Nice . Joram : un intergiciel de communication asynchrone F. Brisbane (Australie) Universit´ Joseph Fourier. Les services Web en pratique B. A. . Donsez2 L. Dumas 1 . A. Freyssinet5 P.Annexes A. A¨ ıt-Bachir2 M. Y.-C. D´chamboux 6 . M. Seinturier 4 R. Chassande-Barrioz6 R. Fauvet2 .

228 ANNEXES .

ee e e e Les versions utilis´es pour ces outils sont valides au 31 juillet 2006. A¨ ıt-Bachir (version du 19 janvier 2007 . Fauvet. Dumas. les outils qui doivent avoir ´t´ install´s sur la machine sont list´s ci-apr`s.4 Les variables d’environnement list´es ci-apr`s doivent avoir ´t´ correctement posie e ee tionn´es (consulter les documentations d’installation. ainsi que les ressources qu’il utilise sont accessibles via : http ://www-clips.tar. Objectifs : Nous proposons de mettre en pratique le cours d´di´ aux services Web par le biais e e d’une activit´ qui consiste a programmer et implanter des services web simples.imag. Beehive 4.fauvet/icar06/ Avant de commencer ce TP copier l’archive webserv prat 1. Ant 1.10:31) Licence Creative Commons (http://creativecommons. Elles sont bien sˆ r e u amen´es a ´voluer avec le temps.fr/mrim/User/marie-christine. et positionner les variables en fonce tion de l’installation locale) : – AXIS HOME – AXIS LIB .5 5.5 (` rendre accessible via le port 8080) a 3.1).1 Pr´ambule e Attention : Les utilisateurs d’autres syst`mes d’exploitation que unix/linux doivent adapter en e cons´quence les notations utilis´es ci-apr`s.-C. M. puis extraire les fichiers qu’elle contient. Tomcat 5. JDK 1. Axis 1. Cela aura pour effet de cr´er l’arborescence et les fichiers n´cessaires au e e TP (voir section A.Intergiciel et Construction d’Applications R´parties e c 2006 M. e ` A.8.org/licenses/by-nc-nd/ 2. e `e 1. e e e Outils a installer : ` Pour ce TP.6. A.5 2.fr) Annexe A Les Services Web en pratique La version HTML de ce document.0/fr/deed.

La notion de programmation avec annotations est introduite par le projet JSR (Java Specification Request). e e 1. Beehive e e e s’appuie sur les biblioth`ques fournies par Axis.home par la valeur core ` respondant a l’installation locale) : ` ----------------build. LES SERVICES WEB EN PRATIQUE – AXISCLASSPATH – ANT HOME – BEEHIVE HOME – CATALINA HOME – CATALINA LIB – CATALINACLASS – JAVA HOME – CLASSPATH NB : Les services Web seront d´ploy´s dans un serveur Apache Tomcat sur la machine e e locale accessible via le port 8080. A.com/wls/docs92/webserv/annotations.name=TimeNow . Editer ce fichier pour modifier les lignes suivantes et les positionner comme suit (remplacer le chemin d’acc`s a beehive.properties-----------beehive.home=/home/fauvet/Beehive/apache-beehive-incubating-1. les deux utilisant SOAP e (Simple Object Application Protocol). il poss`de e e e une seule op´ration non param´tr´e : getTimeNow. A.2 Beehive et Axis Beehive : Le projet Beehive est lanc´ par Apache Group pour le d´veloppement rapide e e d’applications Web entre autres. e L’autre annotation utilis´e est @WebMethod qui permet d’indiquer parmi les m´thodes e e celles qui sont expos´es par le service Web. L’id´e estt d’introduire e des annotations dans du code java afin de d´crire plus facilement le service Web. Dans le r´pertoire webserv prat 1/ws time/WEB-INF/src se trouve le fichier e build. Dans le r´pertoire webserv prat 1/ws time/WEB-INF/src-ws/web cr´er un fichier e TimeNow. 2.2).html Axis : Le projet Axis est aussi un projet de Apache Group pour le d´veloppement et e le d´ploiement de services Web.8. Voir la documentation annotations e JWS : http ://e-docs. section A.java (voir son contenu. Pour concevoir ce service Web nous e e e allons dans un premier temps ´crire le code Java de la classe TimeNow.230 ANNEXE A.bea. Axis est une biblioth`que de classes sur laquelle on e e s’appuie pour le d´veloppement du service et celui du client. e ses m´thodes et ses param`tres. e 3.properties. Respecter le nom.3 D´ploiement d’un service e Le service TimeNow donne l’heure syst`me du serveur sur lequel il s’ex´cute.0m1/ service. Il faut noter que ce qui est en gras apr`s le symbole @ sont des annotations qui e permettent de signaler que la classe TimeNow repr´sente un service Web (@WebService). Beehive fait appel a l’outil de compilation Ant qui e e ` permet de compiler et de d´ployer le service Web d´velopp´ en Java et JSR.

4.java (voir son contenu. ex´cuter l’instruction suivante : e e $ java ClientTimeNow.4 D´ploiement d’un client e Il s’agit ici de d´velopper en java un client qui va ex´cuter la m´thode du service TimeNow e e e d´j` ´tudi´e.DataHandler and javax.0. Aller dans le r´pertoire webserv prat 1/ws time et dans le fichier index. A la date pr`s.class e e u a ´t´ plac´.´ A.html v´rifier e e les lignes signal´es ci-apr`s : e e -----------------index.java 3.1 :8080/TimeNowWS/ . sectionA. Cette fois l’appel au service va ˆtre effectu´ a partir d’un programme java et eae e e e` non plus via un navigateur.MimeMultipart). DEPLOIEMENT D’UN CLIENT 231 -------------------------------------------- 4. Observer les informations rendues disponibles au travers du lien http ://127.activation.class. le r´sultat doit ressembler a ce qui suit : e e ` $ java ClientTimeNow Bonjour d’Autrans ! ! Ici il est : Sun Mar 05 17 :38 :49 CET 2006 Le message d’erreur : . A. 1. e . 2.internet.Unable to find required classes (javax. Avant d’ex´cuter la classe compil´e il faut avoir bien d´fini dans la variable d’environe e e nement CLASSPATH le chemin d’acc`s au r´pertoire o` le fichier ClientTimeNow.jws?wsdl">WSDL</a> <a href="web/TimeNow. est sans cons´quence.. Respecter le nom.3).0. Attachment support is disabled. 7.war (g´n´r´ par ant dans le r´pertoire e ee e webserv prat 1/).html--------------<a href="web/TimeNow. Avec l’outil Tomcat Web Application Manager (WAR file to deploy ) d´ployer l’ape plication contenue dans le fichier TimeNowWS. Compilation et d´ploiement avec ant : e e Aller dans le r´pertoire webserv prat 1/ws time/WEB-INF/src et ex´cuter la come mande suivante : ant clean build war 6. Compiler le fichier : $ javac ClientTimeNow.jws?method=getTimeNow">appel op´ration</a> e ------------------------------------------ 5. ee e 4.mail.8. Dans le r´pertoire webserv prat 1/ws client cr´er un fichier java nomm´ e e e ClientTimeNow. Dans le r´pertoire de ClientTimeNow.

e e 3.0m1/ service.jws?wsdl">WSDL</a> <a href="web/Hello.8.properties-----------beehive. Observer les informations rendues disponibles au travers du lien http ://127.0.5 Un service avec une op´ration param´tr´e.war (g´n´r´ par ant dans le r´pertoire e ee e webserv prat 1).8. Compilation et d´ploiement avec ant : e Aller dans le r´pertoire webserv prat 1/ws hello/WEB-INF/src/ et ex´cuter la come e mande suivante : ant clean build war 6. Dans cet e e exemple il n’y a qu’une m´thode param´tr´e (sayHelloWorldInParam(String name)) e e e qui renvoie un bonjour au nom pass´ en param`tre (@WebParam). Compiler et ex´cuter ClientHelloInParam avec les param`tres ad´quats.jws?method=sayHelloWorldInParam&name=you"> appel op´ration</a> e ------------------------------------------ 5. e 1. Dans le r´pertoire webserv prat 1/ hello/WEB-INF/src-ws/web/ cr´er un fichier e e Hello. 7. Avec l’outil Tomcat Web Application Manager (WAR file to deploy ) d´ployer l’ape plication contenue dans le fichier HelloWS.home par la valeur correspondant e ` a l’installation locale) : ` ----------------build. section A.properties.html--------------<a href="web/Hello. Dans le r´pertoire webserv prat 1/ws hello/WEB-INF/src/ se trouve le fichier e build. Aller dans le r´pertoire webserv prat 1/ws hello et dans le fichier index. 2. Cette derni`re est obtenue par e e l’appel au service TimeNow r´alis´ pr´c´demment. LES SERVICES WEB EN PRATIQUE A. section A.name=Hello -------------------------------------------- e 4. Implantation d’un client : e 1. Dans le r´pertoire webserv prat 1/ws client cr´er le fichier ClientHelloInParam. Pour concevoir ce service Web nous allons e e e e dans un premier temps ´crire le code Java de la classe Hello.java (voir son contenu.232 ANNEXE A. 2.html v´rifier e les lignes signal´es ci-apr`s : e e -----------------index. Editer ce fichier pour modifier les lignes suivantes et la positionner comme suit (remplacer le chemin d’acc`s a beehive.1 :8080/HelloWS/. et un client e e e Ce service Web affiche un message concat´n´ au nom pass´ en param`tre de l’op´ration e e e e e sayHelloWorldInParam(String name) et de la date syst`me.java e (voir son contenu. Respecter le nom.home=/home/fauvet/Beehive/apache-beehive-incubating-1.5). e e e .4). Noter que ce qui est en gras apr`s le @ sont des annotations qui permettent de signaler e que la classe Hello repr´sente un service Web (@WebService). L’autre annotation e utilis´e est @WebMethod qui permet d’indiquer les m´thodes du service Web.0.

et cˆt´ Entrepˆt. Tester le d´ploiement via le serveur web (Tomcat).properties. et Disponibilit´ e e e implant´e par l’Entrepˆt (´tude de cas vue dans le cours). 3.9) et e la classe Personne.tar (cliquer ici) sous la racine e webserv prat 1/. PERFECT GLASS INC. o e e Modifier les codes fournis afin d’implanter le fournisseur via un service web : sur le e mod`le de l’arborescence ws time.6.8.html. et l’entrepˆt o Version 1 : param`tres simples e Les fichiers qDemandeeLocal. 1.java). ` e 2.8). e e Veiller a ce que ce dernier r´pertoire soit dans la variable d’environnement CLASSPATH. compl´ter l’arborescence de racine Entrepot (dans le e r´pertoire webserv prat 1). e 1.8.ˆ A.java (voir son contenu. Cr´er le client ClientHelloObjet.8.properties et index. sur la mˆme machine. Observer l’arborescence ainsi cr´´e : le service s’appuie sur classe ee Personne dont le code est fourni dans le paquetage hello (voir ws helloObjet/WEB-INF/src/hello/Personne. Compiler et tester le client.java (voir son contenu. Cette extension e consiste a param´trer l’op´ration sayHello expos´e par le service Hello de mani`re a ce ` e e e e ` qu’elle re¸oive un objet de la classe Personne et renvoie une chaˆ de caract`res.7) contiennent respectivement la description des op´rations qDemandee implant´e par Perfect Glass Inc.java dans le r´pertoire webserv prat 1/Entrepot/WEB-INF/src-ws/web/ e e 2. e o e Les codes fournis utilisent des actions de saisie d´finies dans Saisie. section A. Adapter les fichiers build. e 4. section A.8. ` Dans ces codes. par exemple webserv prat 1/PerfectGlass. c ıne e Il s’agit ici d’exploiter la possibilit´ offerte par Axis de s´rialiser/d´s´rialiser des classes e e ee Java implant´es selon le patron des Java Beans qui fixe le format d’´criture des s´lecteurs e e e et des constructeurs. 2.java a compiler et e ` a rendre accessible (voir son contenu.java (voir son contenu.6. Cr´er qDemandee.java .6. Cr´er Entrepot.6) et EntrepotLocal.1 Perfect Glass Inc. section A. section A.10) dans le r´pertoire e webserv prat 1/ws client.java et ClientHelloObjet. e Implanter le client : 1. 3.java dans un r´pertoire.java (voir son contenu. ET L’ENTREP OT 233 A.2 Version 2 : param`tres complexes e L’objectif est d’´tendre le service Hello et son client ClientHello. Compiler et d´ployer le service. e e A. Copier et d´compresser l’archive ws helloObjet.8. Voir le corrig´ cˆt´ Perfect Glass Inc. section A. on a consid´r´ que le client (Perfect Glass Inc. Compiler Personne. Penser a modifier si n´cessaire e oe oe o ` e les param`tres concern´s dans le fichier build.6 A.) et le fournisseur ee (Entrepˆt) ´taient accesssibles en local.

e Voir le corrig´ pour le service et pour le client. e Sur le mod`le fourni. e . A..234 ANNEXE A.1.properties.properties.properties (plac´ dans le r´pertoire e e e webserv prat 1/ws helloObjet/WEB-INF/). modifier le service Entrepot et son client PerfectGlass. LES SERVICES WEB EN PRATIQUE 4. de mani`re e e a ce que l’op´ration Disponibilite admette un param`tre de type Produit (` d´finir). eae e Client Hello TimeNow demander salut + heure demander heure envoyer heure envoyer salut + heure Figure A. e e A.java d´j` ´tudi´). et l’entrepˆt e e o est d´crit par la figue A. Implanter le client (sur a base du client ClientHelloInParam.7.2 Composition ` base d’op´rations uni-directionnelles a e L’objectif est d’´tudier l’implantation de services dont les interactions s’appuient sur e des op´rations unidirectionnelles. ` e e a e Voir le corrig´ client cˆt´ Perfect Glass Inc. e e e 2.2. Personnaliser les param`tres dans build. Le diagramme e e de s´quence mod´lisant les interactions est d´crit par la figue A. Penser a modifier en cons´quence les e ` e param`tres concern´s dans le fichier build. (classe Produit) et (cliquer ici) pour obtenir e oe l’archive qui contient le service EntrepotObjet . Le diagramme de s´quence mod´lisant ces interactions. Compiler et d´ployer le service.1 – Interactions entre les services sur la base d’op´rations bidirectionnelles.1 Composition de services Composition ` base d’op´rations bi-directionnelles a e 1. Modifier le service Hello afin qu’il r´alise l’appel au service TimeNow et retourne au e client le message issu de la concat´nation du salut et la date syst`me. Tester. 5. Penser a modifier en cons´quence les param`tres concern´s dans le fichier ` e e e build.7.7 A. e e e dans le cadre des ´changes entre le d´partement Ventes de Perfect Glass Inc.

tar (cliquer ici) sous la racine e webserv prat 1/ 2.8. Tester (le message de retour est enregistr´ dans le e e fichier PerfectGlass plac´ dans /tmp).8.2 – Interactions entre les services sur la base d’op´rations unidirectionnelles. 4.3. Copier et d´compresser l’archive EntrepotUnidir. Cette archive contient le client PerfectGlassClient.java qui initialise les interactions.java.A. e e Client PerfectGlass Entrepôt envoyer demande devis envoyer demande disponibilité envoyer disponibilité envoyer devis / rejet devis Figure A. et l’arborescence du service PerfectGlassUnidirService qui traite la r´ception de la r´ponse envoy´e par l’entrepˆt. o A. Copier et d´compresser l’archive PerfectUnidir.properties. pour chacun des deux services e EntrepotUnidir et PerfectGlassUnidir. Personnaliser les param`tres dans build.1 Ressources Arborescence de webserv prat 1/ (telle que fournie dans l’´nonc´) e e webserv_prat_1/ webserv_prat_1/EntrepotLocal/ . Compiler et d´ployer les services.java ainsi que la classe Produit. e 1. Compiler le client PerfectGlassClient. RESSOURCES 235 PerfectGlass Entrepôt envoyer demande disponibilité envoyer disponibilité Figure A.tar (cliquer ici) sous la racine e webserv prat 1/. e e e o 3. PerfectGlass et Entrepˆt. 5.8 A. e Sur le mod`le fourni implanter les interactions d´crites dans la figure A.3 – Interactions entre les services Client.

xml webserv_prat_1/ws_hello/WEB-INF/src/build. return t.xml webserv_prat_1/ws_time/WEB-INF/src/build.jsp webserv_prat_1/ws_time/WEB-INF/ webserv_prat_1/ws_time/WEB-INF/server-config.WebService. String t=d. import javax.html webserv_prat_1/PerfectGlass/ A. LES SERVICES WEB EN PRATIQUE webserv_prat_1/ws_hello/ webserv_prat_1/ws_hello/WEB-INF/ webserv_prat_1/ws_hello/WEB-INF/server-config.8.236 ANNEXE A.xml webserv_prat_1/Entrepot/WEB-INF/src/build. import javax.jws.WebMethod.xml webserv_prat_1/Entrepot/WEB-INF/src-ws/ webserv_prat_1/Entrepot/WEB-INF/src-ws/web/ webserv_prat_1/Entrepot/index.wsdd webserv_prat_1/ws_hello/WEB-INF/src/ webserv_prat_1/ws_hello/WEB-INF/src/build.Date. } } .xml webserv_prat_1/ws_hello/WEB-INF/src-ws/ webserv_prat_1/ws_hello/WEB-INF/src-ws/web/ webserv_prat_1/ws_hello/index.properties webserv_prat_1/ws_time/WEB-INF/web.html webserv_prat_1/ws_time/ webserv_prat_1/ws_time/happyaxis.html webserv_prat_1/ws_client/ webserv_prat_1/PerfectGlassLocal/ webserv_prat_1/Entrepot/ webserv_prat_1/Entrepot/WEB-INF/ webserv_prat_1/Entrepot/WEB-INF/server-config.wsdd webserv_prat_1/Entrepot/WEB-INF/src/ webserv_prat_1/Entrepot/WEB-INF/src/build.jws. @WebService public class TimeNow { @WebMethod public String getTimeNow() { Date d=new Date().2 Code du service TimeNow package web.util.properties webserv_prat_1/Entrepot/WEB-INF/web.wsdd webserv_prat_1/ws_time/WEB-INF/src/ webserv_prat_1/ws_time/WEB-INF/src/build. import java.toString().xml webserv_prat_1/ws_time/WEB-INF/src-ws/ webserv_prat_1/ws_time/WEB-INF/src-ws/web/ webserv_prat_1/ws_time/index.properties webserv_prat_1/ws_hello/WEB-INF/web.

toString()).println("Bonjour d’Autrans !! Ici.Call.axis.8. ". public class ClientTimeNow { public static void main(String [] args) { try { // l’URI a contacter String endpointURL = "http://localhost:8080/TimeNowWS/web/TimeNow.client.Options.WebParam.axis.namespace. RESSOURCES 237 A. System.invoke( new Object[] { } ). Call call = (Call) service.client. } catch (Exception e) { System. import javax. call.err.WebService.utils.axis.encoding. } } } A. import javax.QName.toString().jws. import javax.apache.jws".3 import import import import Code du client ClientTimeNow org. org.net.4 Code du service Hello package web.jws.xml.apache. // L’appel String ret = (String) call.XMLType. "getTimeNow") ). } } } . @WebService public class Hello { @WebMethod public String sayHelloWorldInParam(@WebParam String name ) { try { return "Hello.createCall(). org.apache. import javax.8.jws. " + name + ".A.setOperationName( new QName("TimeNow". org.WebMethod.axis. // l’operation du service call.apache.setTargetEndpointAddress( new java. il est " + ret).URL(endpointURL) ).8.out. // Le service a executer ` Service service = new Service().Service.println("erreur "+ e. } catch (Exception e) { return "Erreur " + e.

setReturnType( org.QName.println(e.println(ret).apache. org.Call.setOperationName( new QName("Hello".1:8080/HelloWS/web/Hello.getRemainingArgs().apache. // L’operation a executer avec ses parametres d’entree et de sortie call.XSD_STRING ).utils.axis.axis.apache.out. call.Service. call.8.URL(url) ). String textToSend.invoke( new Object[] { textToSend } ). public class ClientHelloInParam { public static void main(String [] args) { try { // on attend un parametre Options options = new Options(args). System.0.238 ANNEXE A.net. args = options. ParameterMode. call.ParameterMode.XMLType. if ((args == null) || (args.Options.addParameter( "s".toString()+" ici").length < 1)) { textToSend = "l’inconnu".setTargetEndpointAddress( new java.createCall(). // L’appel String ret = (String) call. org.client.apache.xml.rpc.axis. import javax. } } } . org.encoding. XMLType.xml. Call call = (Call) service. LES SERVICES WEB EN PRATIQUE A.encoding.XSD_STRING.jws".axis.0. } catch (Exception e) { System.namespace. // L’URI du service a appeler String url = "http://127.err.5 import import import import Code du client ClientHelloInParam org.client.axis.XMLType. } // Le necessaire pour realiser l’appel : Service service = new Service(). import javax.IN).apache. "sayHelloWorldInParam") ). } else { textToSend = args[0].

. e e System. quantite).8.Disponibilite (produit.. int quantite) { .8.* .toString()+" ici"). } public int getQuantite() { return quantite . public Produit() { } public void setRef(String ref) { reference = ref .err. private int quantite .. } catch (Exception e) { System. } public String getRef() { return reference.println ("V´rification de disponibilit´.out. } public void setQuantite (int qte) { quantite = qte .println(e.io.8. RESSOURCES 239 A.7 Code du programme EntrepotLocal class Produit { private String reference .lire_String ("Saisie de la r´f´rence produit : ")..."). } } public class Entrepot { public static String Disponibilite (String produit.A.lire_int ("Saisie de la quantit´ demand´e : ").6 Code du programme qDemandeeLocal import java. e e quantite = Saisie. // la quantit´ demand´e e e produit = Saisie.out. } } } A.. System. // la r´f´rence du produit e e int quantite . e e String ret = Entrepot. public class qDemandee{ public static void main(String args[]) { try { String produit..println(ret).

BufferedReader br = new BufferedReader(isr).240 ANNEXE A. } public static String lire_String (String question) { System.in).equals (produit) && v. ligne_lue = br. v. } } } A.out.setRef("assiettes") .setQuantite(200). est disponible. } public static int lire_int (String question) { . v.readLine (). return (lire_String()).8. class Saisie { public static String lire_String () { String ligne_lue=null . en quantit´ " + quantite .getQuantite() >= quantite) || (a. res = "Le produit " + produit + ".*. } catch (IOException e) {System. e if ((v.println(e).equals (produit) && a.print (question). est indisponible" .getRef().setRef("verres") . try { InputStreamReader isr = new InputStreamReader(System. } else { res = res + ".8 Code des proc´dures de Saisie e import java. Produit v = new Produit () . } catch (Exception e) { return "Erreur " + e. } return res .parseInt (lire_String ()).err.setQuantite(4500).io. } public static int lire_int () { return Integer. Produit a = new Produit ().toString().} return ligne_lue. a. LES SERVICES WEB EN PRATIQUE try { String res .getQuantite() >= quantite)) { res = res + ".getRef().". a.

charAt(0).Options. import javax. import javax. int age .A.out.print (question). } public static float lire_float() { return Float. org. org. } public static double lire_double (String question) { System.client. .apache. return (lire_int()).print (question).apache. } public static char lire_char() { String reponse = lire_String ().axis. return reponse.9 import import import import Code du client ClientHelloObjet org. public class ClientHelloObjet { public static void main(String [] args) { try { String nom . } } A.axis.print (question). return (lire_float()).8. return (lire_double()). org.encoding.parseFloat (lire_String ()).XMLType.axis.out.axis. } public static double lire_double() { return Double.8.parseDouble (lire_String ()).ParameterMode. RESSOURCES 241 System.xml. return (lire_char()).QName.print (question).Call.namespace.out. } public static char lire_char (String question) { System.apache.apache. } public static float lire_float (String question) { System.rpc.utils.xml.client.Service.out.

"Personne" ). call = (Call) service.lire_String ("Donner une adresse : ") . call.encoding.class. "sayHello") ). // L’operation a executer avec ses parametres d’entree et de sortie call.registerTypeMapping(Personne.IN). personneXML).. } } } A.createCall(). LES SERVICES WEB EN PRATIQUE String adresse ...println(ret). String ret = (String) call.println(e.242 ANNEXE A.setTargetEndpointAddress( new java. personneXML.lire_int ("Donner un age : ") .setAdresse(adresse)..apache. age = Saisie.axis. personneXML)).encoding.8. // Le necessaire pour le parametre en entree // qn est la correspondance XML de la classe Personne QName personneXML = new QName( "http://HelloObjetWS/web".class. personneXML. private int age . adresse = Saisie.. call..toString()+" ici").setNom(nom). call...0. new org.XMLType.net.invoke( new Object[] { personne } ).ser.lire_String ("Donner un nom : ").BeanSerializerFactory( Personne.encoding.URL(url) ).. ParameterMode.out. call. personne.0.apache. new org.10 Code de la classe Personne public class Personne { private String nom .class. private String adresse .axis.setAge(age).1:8080/HelloObjetWS/web/HelloObjet.ser.out.err.setReturnType( org. Service Call service = new Service().println ("Connexion .axis.setOperationName( new QName("HelloObjet". Personne personne = new Personne ().addParameter( "p".apache."). personne. nom = Saisie. System. personne.jws". } catch (Exception e) { System. public Personne () { . String url = "http://127.XSD_STRING ).BeanDeserializerFactory( Personne. System...

} public String getNom() { return nom. } } .A. setAdresse (String a) { = a . RESSOURCES 243 } public void nom = n } public void adresse } public void age = a } setNom(String n) { . public String getAdresse() { return adresse.8. } public int getAge() { return age. setAge (int a) { .

LES SERVICES WEB EN PRATIQUE .244 ANNEXE A.

D.com/france/msdn/netframework/default.microsoft.Net\SDK et contient les principaux utilitaires : xsd.exe (pour g´n´rer la documentation associ´e aux classes).Intergiciel et Construction d’Applications R´parties e c 2006 M.10:31) Licence Creative Commons (http://creativecommons.NET. Pensez e ` e a mettre a jour vos variables d’environnement avec l’adresse d’installation du ` ` framework . Pour atteindre ce but.exe). l’application se compose de deux parties : le service d’annuaire qui doit pouvoir ˆtre utilis´e a distance et diff´rentes applications clientes de type client l´ger ou e e ` e e client lourd graphique ou en ligne de commande.mspx SDK : http ://www.com/france/msdn/netframework/default. Riveill.exe (le e e e d´sassembleur) ou wsdl. Le framework .Net\Framework et contient les principales classes n´cessaires a l’ex´cution des programmes ainsi que le compilateur (csc.NET1 est g´n´ralement e e install´ e a ` l’adresse C:\Windows\Microsoft . Emsellem (version du 19 janvier 2007 .Net : http ://www. Une version html de ce texte est disponible a ` l’adresse http ://rangiroa. Pour cela nous allons d´velopper une petite e application permettant a chacun de g´r´ ses cartes de visite (ajout.NET. Pour des raisons de simplicit´ nous ne e nous int´resserons pas aux probl`mes li´s a l’authentification des diff´rentes classes d’utie e e ` e lisateurs. ildasm.fr) Annexe B .essi.1 Les outils ` utiliser a Comme nous allons faire des d´veloppements simples nous allons utiliser les outils mis e ’gracieusement’ en ligne par Microsoft et les installer les uns apr`s les autres : e 1. suppression et consul` ee tation) et de les rendre accessibles aux autres utilisateurs (uniquement consultation). Le kit de d´veloppement (SDK)2 est g´n´ralement install´ a l’adresse e e e e ` C:\Program Files\Microsoft.microsoft.NET en pratique L’objectif de cette annexe est de permettre a chacun de se familiariser un peu avec ` l’environnement de programmation .html. e B. 2.exe (le g´n´rateur de talon pour les services web).0/fr/deed.org/licenses/by-nc-nd/ 2.mspx .fr/riveill/enseignement/tp/carteVisite. Elle contiendra les ´volutions futures du sujet. e e e 1 2 Framework .

microsoft.mspx 7 MSDN AA : http ://www.1. . L’environnement de programmation Web Matrix 3 a comme principaux avantages d’avoir une faible empreinte m´moire.asp. e e B. Microsoft met a disposition des programmeurs des ` versions gratuites de ses environnements de d´veloppement 6 .org 5 SharpDevelop : http ://sourceforge.2 Architecture de l’application “Cartes de Visite” Nous allons d´velopper au cours de ce TD une application de gestion de cartes de visite e qui respectera l’architecture d´crite dans la figure B. L’offre MSDN Academic Ale liance7 permet aux universit´s d’avoir acc`s a Visual Studio. simple d’utilisation. e Ce n’est pas le seul environnement possible. Par ailleurs.net/webmatrix/ Mono : http ://www. SQL Serveur et a l’ensemble e e ` ` des outils de d´veloppement commercialis´s par Microsoft.go-mono. e Cette application sera d´velopp´e en C#.microsoft.246 ANNEXE B. d’inclure e e un serveur HTTP et de permettre la cr´ation et l’acc`s a des bases de donn´es simples e e ` e au format access sans aucune installation suppl´mentaire.net/projects/sharpdevelop/ 6 Visual Studio Express : http ://www.1 – Architecture de l’application Web Matrix : http ://www.com/france/msdn/abonnements/academic/default. en effet vous pouvez utiliser Mono 4 . si vous le souhaitez. e e Figure B. d’ˆtre gratuit.NET EN PRATIQUE 3.mspx 4 3 .com/france/msdn/vstudio/express/default. comme impl´mentation du framework et SharpDevelop 5 comme environnement de programmae tion.

3 Les objets m´tiers e Nous choisissons de repr´senter les donn´es de chaque carte dans des instances d’une e e classe CarteDeVisite dont le code C# est donn´ ci-dessous : e CarteDeVisite (CarteDeVisite. namespace MonPremierTP { [Serializable][XmlType("carte-de-visite")] public class CarteDeVisite { [XmlElement("nom")] public string Nom.´ B.3.0")] public class AnnuaireDAL { public AnnuaireDAL() {} // constructeur public CarteDeVisite ExtraireCarte(string nomRecherche) { // op´ration de recherche d’une carte dans la BD e return null.dll.1.. using System. [NonSerialized()] public string Telephone.cs) using System. using System.5.cs B. Nous donnons uniquement ici l’interface. La description et l’utilisation des diff´rents attributs e e e sont pr´sent´s dans la section B.cs) // volontairement le namespace n’est pas r´p´ter. } public void AjouterCarte(CarteDeVisite carte){ // op´ration d’insertion d’une nouvelle carte e } } . } } Nous verrons ult´rieurement comment les diff´rentes fiches seront initialis´es par des e e e donn´es issues de la base de donn´es.Serialization. e e Pour g´nerer la biblioth`que CarteDeVisite.Xml. LES OBJETS METIERS 247 B. e e // a vous de l’indiquer et d’utiliser les bonnes directives ’using’ ` [assembly:AssemblyVersion("0. la commande est la suivante : e e csc /target:library CarteDeVisite.6.4 La couche d’acc`s aux donn´es e e Cette couche permet de d’alimenter en donn´es les diff´rents objets m´tiers manipul´s e e e e par l’application cartes de visite. la description de l’impl´mentation sera faite ult´rieurement.. [XmlElement("email")] public string Email.0. Voici la version 0. [XmlElement("prenom")] public string Prenom.1 : e e AnnuaireDAL (AnnuaireDAL.Xml.

Voici les interfaces des deux services : ` IAnnuaireService (IAnnuaireService. } } public class AnnuaireAdminService : IAnnuaireAdminService { // constructeur de la classe public AnnuaireAdminService(){} // impl´mentation de la m´thode m´tier e e e public CarteDeVisite Rechercher(string nom) { AnnuaireDAL dal=new AnnuaireDAL().dll AnnuaireDAL. void Ajouter(CarteDeVisite carte). l’un pour consulter les cartes de visites existantes et un autre pour en ins´rer e de nouvelles. .NET EN PRATIQUE Pour g´n´rer la biblioth`que AnnuaireDAL. il ne nous reste qu’` les implanter en utilisant la couche e a d’acc`s aux donn´es d´crite pr´c´demment. Il s’agit d’implanter e deux services.248 ANNEXE B.cs) public interface IAnnuaireService { CarteDeVisite Rechercher(string nom). la commande est la suivante : e e e csc /target:library /reference:CarteDeVisite. } Une fois ces interfaces d´finies.ExtraireCarte(nom). . return dal.5 La couche m´tier e Quand nous aurons impl´ment´ la classe AnnuaireDAL d´crite dans la section e e e pr´c´dente. e e e Pour cr´er l’ind´pendance entre conservation des donn´es et manipulation des donn´es.cs) public class AnnuaireService : IAnnuaireService { // constructeur de la classe public AnnuaireService() {} // impl´mentation de la m´thode m´tier e e e public CarteDeVisite Rechercher(string nom) { AnnuaireDAL dal=new AnnuaireDAL(). L’id´e est ici de sp´cifier clairement les services sous la forme d’interface. } public interface IAnnuaireAdminService { CarteDeVisite Rechercher(string nom). nous disposerons d’un moyen d’acc´der aux donn´es persistantes du service e e e e d’annuaire sans avoir a connaˆ la technologie de stockage employ´e. L’interrogation et ` ıtre e la mise a jour des donn´es seront faites au travers des interfaces de la DAL (Data Access ` e Layer) en ne manipulant que des entit´s li´es au domaine m´tier. Cette e e couche ne sera manipul´e qu’au travers de ces seules interfaces et non par un acc`s direct e e a leur implantation.cs B. e e e e e AnnuaireService (AnnuaireService.dll. e e e e nous allons cr´er la couche contenant la logique du service d’annuaire.

AjouterCarte(carte).ExtraireCarte(nom).cs.2 G´n´rer les fichiers de documentation e e Pour commenter le code. nous avons ´crit 4 fichiers : CarteDeVisite.6 Premi`res manipulations en C# e Ces exp´rimentations ne sont pas directement li´es avec la mise en œuvre de l’applicae e tion cartes de visite mais permettent de se familiariser avec le langage C# et le framework . – La balise param permet de documenter les param`tres d’une m´thode ou d’une e e propri´t´. e .6. le fait de e e e mettre trois slash a la suite dans un endroit valide fait apparaitre un menu avec les balises ` XML de documentation dont nous pr´sentons ici les principales : e – La balise summary sert a donner la description compl`te de l’´l´ment que l’on sou` e ee haite documenter. la fin ´tant la fin de ligne . B. e e IAnnuaireService. le type de la ee e variable est automatiquement d´termin´ par le g´n´rateur de documentation. ce dernier type va nous int´resser car il permette de g´n´rer des fichiers de doe e e cumentation associ´s au code d´velopp´. d’une propri´t´ e e e ee ou une variable.cs et AnnuaireService.Nom).` B. PREMIERES MANIPULATIONS EN C# 249 return dal. – La balise value permet de d´crire la valeur de retour ou d’entr´e d’une propri´t´. } public void Ajouter(CarteDeVisite carte) { AnnuaireDAL dal=new AnnuaireDAL().6. else throw new Exception("La carte existe d´j`").1 Construire le diagramme UML A cette ´tape du TP. // on v´rifie que la carte n’existe pas d´j` e e a CarteDeVisite test=dal. la fin ´tant la fin de ligne. B.6.Net. Il peut ˆtre utilis´ sur une classe. e e ee Elle joue le mˆme rˆle que la balise param pour une fonction. une m´thode. C# offre trois types de commentaires : – les commentaires introduits par les balises ’//’. e – les commentaires introduits par les balises ’/*’ et termin´ par les balises ’*/’ .ExtraireCarte(carte. e Seul. Il prend en compl´ment uniquement le nom de la variable. AnnuaireDAL. e a } } B. if (test==null) dal. e o – La balise paramref permet d’indiquer que le mot dans le commentaire est un param`tre de la fonction afin que le g´n´rateur de documentation puis mettre un lien e e e vers le commentaire du param`tre. e – les commentaires introduits par les balises ’///’. Dans Visual Studio ou SharpDevelop.cs et il peut ˆtre souhaitable de construire le e diagramme UML de l’ensemble.cs. e e e e – La balise returns permet de documenter la valeur de retour d’une fonction seulement.

La propri´t´ cref du tag permet de sp´cifier le type d’exception ee e document´. ¡see>.0. <example>. Le param`tre e e e ` e e /// d’entr´e est <paramref name="nomRecherche" /> e /// </summary> /// <param name="nomRecherche"> /// le param`tre d’entr´e est le nom du titulaire de la carte de visite recherch´e e e e /// </param> /// <returns> /// le r´sultat est la carte de visite associ´e au nom e e /// <returns> /// <exception cref="NomInconnu"> /// Une exception est lev´e si le nom est inconnu e /// </exception> public CarteDeVisite ExtraireCarte(string nomRecherche) { // op´ration de recherche d’une carte dans la BD e return null. <include>. <code>. . <permission>.250 ANNEXE B. /// </summary> public AnnuaireDAL() {} // constructeur /// texte pour la m´thode ExtraireCarte e /// <summary> /// Cette m´thode tr`s sophistiqu´e reste totalement a impl´menter. } .NET EN PRATIQUE – La balise exception permet d’informer sur le(s) type(s) d’exception(s) que la fonction peut lever.2.xml ` [assembly:AssemblyVersion("0. <para>. e – Il existe bien d’autres balises : <c>. /// </summary> public class AnnuaireDAL { /// <remarks> /// Des commentaires plus longs peuvent etre associ´s a un type ou un membre ^ e ` /// gr^ce a la balise remarks</remarks> a ` /// <example> Cette classe permet d’isoler la partie m´tier de la persistance e /// des donn´es. <remarks>. Voici un exemple de programme comment´ avec ces balises : e // xml_AnnuaireDAL.cs // a compiler par : csc /doc:xml_AnnuaireDAL. <seealso>. <list>. elle comporte essentiellement deux m´thodes.0")] /// Mon texte pour la classe AnnuaireDAL /// <summary> /// Description de la classe AnnuaireDAL . A vous de d´couvrir leur utilisation en e lisant la documentation. e e /// <code> /// public CarteDeVisite ExtraireCarte(string nomRecherche) /// public void AjouterCarte(CarteDeVisite carte) /// </code> /// </example> /// <summary> /// Constructeur de la classe AnnuaireDAL.

xml /reference :CarteDeVisite. PREMIERES MANIPULATIONS EN C# 251 /// texte pour la m´thode AjouterCarte e /// <summary> /// Description de AjouterCarte.6.dll /r:CarteDeVisite.6. Faites bien la diff´rence entre les commentaires d´butants par ’///’.cs et compilez le : csc. a vous de jouer en commentant les diff´rentes classes pr´c´demment ` e e e ´crites. Qu’observez-vous : nombre de classes. seulement pr´sent dans le fichier source. Voici un exemple : e e . e e /// </summary> /// <value>donne toujours 0492965148</value> public int UnePropriete { get { return 0492965148. B.exe annuaire.cs et examinez le fichier XML produit.4 Utilisation de la r´flexivit´ e e Nous allons utiliser la r´flexivit´ pour imprimer a l’´cran les diff´rents ´l´ments de la e e ` e e ee dll pr´c´demment produite.dll commentaire1. fonctions membres ? ildasm. Maintenant.</summary> /// <param name="carte"> Emplacement de la description du param`tre carte</param> e /// <seealso cref="String"> /// Vous pouvez utiliser l’attribut cref sur n’importe quelle balise pour /// faire r´f´rence a un type ou un membre.` B.dll /t:library /r:AnnuaireDAL. e e ` /// et le compilateur v´rifiera que cette r´f´rence existe.3 Compilation du code Compilez les diff´rents fichiers pour obtenir une dll. vous compiler aussi le code en e e question.6. pris en compte e e e dans la g´n´ration du fichier de documentation XML et les commentaires d´butant par e e e ’//’ ou ’/*’. </seealso> e e e public void AjouterCarte(CarteDeVisite carte){ // op´ration d’insertion d’une nouvelle carte e } /// <summary> /// Une propri´t´ introduite juste pour montrer la balise "value".exe /doc :commentaire1.dll \ AnnuaireService. e csc.exe /out:annuaire.cs Observez avec ildasm la dll produite et commentez. } } } Mettez ce code dans le fichier commentaire1.cs IAnnuaireService. e Attention : lorsque vous g´n´rez la documentation.dll B.

} } } return 0.Binary.Name). mi).252 ANNEXE B. puis faites une e lecture attentive du source. using using using using using System. uneCarte.WriteLine (" {0}". System. class Serialisation { static void Main(string[] args) { CarteDeVisite uneCarte = new CarteDeVisite().Name). . foreach (MethodInfo mi in mInfo) { Console.Serialization.LoadFrom ("annuaire. System. System. type.GetMethods(). e // inspecter toutes les m´thodes du type e MethodInfo[] mInfo = type. // lire les modules de l’assembly Module[] modules = a.5 S´rialisation binaire et XML e Voici un cours programme qui permet de s´rialiser/d´s´rialiser une carte de visite en e ee XML et en format binaire. module.WriteLine("Dans le module {0}. // lire tous les types du module Type[] types = module.6.Nom = "RIVEILL".Formatters. uneCarte.Prenom = "Michel".IO.Serialization.WriteLine("Le type {0} a cette(ces) m´thode(s) : ".Runtime. using System.GetModules().cs) et ex´cutez le code. } } Compilez cette classe (csc <nom de fichier>. using System. // inspecter tous les types foreach (Type type in types) { Console.Xml. Avez-vous tout compris ? B.Xml. // inspecter tous les modules de l’assembly foreach (Module module in modules) { Console.dll"). . public class Meta { public static int Main () { // lire l’assembly Assembly a = Assembly.fr".NET EN PRATIQUE using System.GetTypes().Reflection. uneCarte. System.IO. on trouve".Email = "riveill@unice.

BinaryFormatter formatter = new BinaryFormatter (). obj2.Open("Demo.WriteLine ("uneCarte. e e .Open). uneCarte.Telephone. // Nom. Console. FileMode. // on d´s´rialise depuis un fichier (mode binaire) e e stream = File.Prenom.email (a ete serialisee)").Email).Close(). Console.WriteLine ("uneCarte.WriteLine ("uneCarte.Open ("Demo. FileMode. prenom et email ont bien et´ s´rialis´s ´ e e e Console.Serialize(stream2.` B. } } Compilez et ex´cutez ce code. Console.6. obj2. Analysez-le.WriteLine ("\t\t{0}\t{1}\t{2}". obj.Create). serializer = new XmlSerializer (typeof(CarteDeVisite)). Console.prenom (a ete serialisee)"). XmlSerializer serializer = new XmlSerializer (typeof(CarteDeVisite)).Telephone).Close().Close ().Prenom). uneCarte. obj2.WriteLine ("\t\torigine\t\tbinaire\t\tXml").WriteLine ("uneCarte. tous les objets du tableau e ou de la collection sont s´rialis´s.Create).Nom). // on d´s´rialise depuis un fichier (mode XML) e e stream2 = File.WriteLine ("\t\t{0}\t{1}\t{2}".Email.WriteLine ("\t\t{0}\t{1}\t{2}". obj.Serialize (stream. obj2. uneCarte.telephone (n’a pas ete serialisee)").Nom.Prenom.Open). uneCarte). formatter = new BinaryFormatter().nom (a ete serialisee)"). serializer. PREMIERES MANIPULATIONS EN C# 253 uneCarte. // on s´rialise en binaire et on sauvegarde dans un fichier e Stream stream = File. stream2. Console.xml". obj. uneCarte. uneCarte).Deserialize (stream). FileMode.Close ().Open ("Demo. Console.Deserialize (stream2). // on s´rialise en XML et on sauvegarde dans un fichier e Stream stream2 = File.Telephone = "04 92 96 51 48". CarteDeVisite obj = (CarteDeVisite) formatter. Console. FileMode. e Remarque : Si vous s´rialisez un tableau ou une collection.Nom.bin". formatter. stream.xml".WriteLine ("\t\t{0}\t\t{1}\t\t{2}". stream. stream2.Email. // t´l´phone n’a pas et´ s´rialis´ e e ´ e e e Console.Telephone.Open("Demo. CarteDeVisite obj2 = (CarteDeVisite) serializer.bin". obj.

un courriel et un num´ro de t´l´phone. e Figure B. un pr´nom. dans la BD cr´´e e e ee 7. et finir e de remplir le formulaire (le suffixe du fichier sera aspx).2 – Format de la base de donn´es e Il est alors possible d’initialiser la base de donn´es en s´lectionnant l’onglet ’Data’.254 ANNEXE B. cr´er les entr´es de la table qui doivent au moins contenir les champs e e suivants ainsi qu’une cl´ primaire non d´crite ici : e e string string string string Nom. cr´er une base de donn´es Access e e 6. La proc´dure est e ` e e relativement simple. e B. Telephone. ouvrir web matrix 2. ’ASP. ouvrir web matrix 2. . Prenom.7 La couche de stockage physique des donn´es e On reprend la conception de l’application. 1. Par exemple la table obtenue peut avoir le format d´crit dans la figure B. aller dans la fenˆtre ’Workspace’ e 3. cr´er la table en s´lectionnant table. . cliquer sur l’icone ’Nouvelle Table’ 8.8 Acc`s direct ` la base de donn´es par un client l´ger e a e e Dans un premier temps et pour nous familiariser avec l’environnement. ’New File’) puis ’General’. Les donn´es stock´es dans l’annuaire sont e e des cartes de visite contenant un nom. s´lectionner l’onglet ’Data’ e 4. Un e e exemple de contenu est donn´ dans la figure B. nous allons construire un premier client capable d’acc´der a la base de donn´es. Voici la mani`re de proc´der : e e e 1.NET EN PRATIQUE B. cliquer sur l’icone ’Nouvelle Base de Donn´es’ e 5.Net Page’.3.2. e e ee Pour que ceux qui ne sont pas tr`s aguerri avec la manipulation des bases de donn´es il e e est possible de cr´er celles-ci directement avec Web Matrix. Email. cr´er un nouveau fichier (’File’. Pour finir.

ACCES DIRECT A LA BASE DE DONNEES PAR UN CLIENT LEGER 255 Figure B. en mode ’html’ vous pouvez renommer les identificateurs des diff´rents ´l´ments. remplissez la clause WHERE pour obtenir la e requˆte d´crite dans la figure B. le DataGrid a "listeCartes" comme identificateur et le Button a "Button" comme id et "Chercher" comme Text.8. e Pour cela. ’html’ et ’code’ est a votre e e ` disposition (’all’ est la fusion du mode ’html’ et ’code’). e 4.` ` ´ ´ B. 5. une fenˆtre d’´dition comportant 3 modes : ’dessin’. puis de construire la requˆte e e e SELECT souhait´e. e e e Pour ´crire la m´thode ExtraireCarteSQL a l’aide de l’utilitaire pr´sent dans Web e e ` e matrix il faut ˆtre en mode ’code’. s´lectionnez les bonnes colonnes. e ee Par exemple pour moi. En mode ’dessin’ mettez sur la page une TextBox (saisie de chaine de caract`re).3 – Contenu de la base de donn´es e 3. Elle permet de s´lectionner la base de donn´es. puis faire glisser la zone SELECT Data Method de la e colonne ToolBox a l’endroit ou vous voulez ins´rer la m´thode. ´crire la m´thode ExtraireCarteSQL a l’aide de l’utilitaire fournit par Web Matrix e e ` (proc´dure d´crite ci-apr`s). Une boite de dialogue ` e e s’ouvre.4. le TextBox a "nom" comme identificateur. un DataGrid et un Button. e e Figure B.4 – Clause WHERE .

en mode ’dessin’. donnez e e e e le nom de la m´thode et demandez le r´sultat sous la forme d’un DataSet.9 La couche d’acc`s aux donn´es e e Cette couche a pour rˆle de faire abstraction de la technologie utilis´e pour stocker ` o e les donn´es. L’avantage de cette abstraction est qu’il est e ea e possible de remplacer le moteur de SGBD utilis´ par toute autre moteur de base de donn´es e e ou encore par un syst`me de stockage simple a l’aide d’un syst`me de gestion de fichier. La fenˆtre d’´dition e e e e bascule en mode ’code’ et l’on peut saisir le code associ´ a l’´v`nement ’clic sur le Button’. certes tr`s efficace en terme de programmation ne respecte e e pas du tout l’architecture initiale.8.Visible = true.NET EN PRATIQUE Apr`s avoir cliqu´ sur le bouton suivant. La suite e du TP reprend la construction pas a pas des diff´rentes couches de l’application cartes de ` e visite.DataSet requete = ExtraireCarteSQL (nomRecherche). Les deux lignes mettent a jour le DataSet ` et le rendent visible. Il faut maintenant impl´menter la classe en charge du dialogue avec la base e de donn´es pour lire et ins´rer des cartes de visite. seule cette couche d’acc`s aux donn´es devrait ˆtre e e e r´´crite et la modification serait transparente au reste de l’application. il reste a programmer la m´thode appel´e lorsque le bouton ` e e sera s´lectionn´.8 pr´c´dente. testez la requˆte ´crite.cs. elle a juste permis d’utiliser la base de donn´es cr´´e et e ee de nous familiariser avec Web Matrix pour la cr´ation de page web dynamique. listeCartes. ee L’API ADO. compl´ter la m´thode ExtraireCarte qui s’appuie sur la fonction ExtraireCarteSQL e e de la section B. e e Pour terminer l’exemple. System. le param`tre e e e e e est le texte de la TextBox contenue dans la page.Text). e ` e Si une telle modification avait lieu. Pour cela. compl´ter la m´thode AjouterCarte selon le mˆme principe en utilisant la commande e e e SQL INSERT pour cr´er la fonction AjouterCarteSQL. cliquez 2 fois sur le Button.DataSource = ExtraireCarteSQL (nom. Attention : cette m´thode. Pour cela : e 1. . . 2.DataBind(). B.NET est utilis´e pour dialoguer avec le serveur de base de donn´es utilis´ e e e (ici Access).256 ANNEXE B. Petites explications : la premi`re ligne met a jour la liste des donn´es du DataSet en e ` e appelant la m´thode ExtraireCarteSQL construite dans l’´tape 6 pr´c´dente. Les fonctions ExtraireCarteSQL e et AjouterCarteSQL font partie du fichier AnnaireDal. public CarteDeVisite ExtraireCarte(string nomRecherche) { CarteDeVisite carte = new CarteDeVisite (). Si elle convient. e` e e Le code de cette m´thode est le suivant : e listeCartes. Elle doit masquer le moteur de base de donn´es utilis´ a la couche suivante. listeCartes. Pour ne pas avoir a ´crire directement e e `e les requˆtes SQL d’interrogation de la base de donn´es nous utiliserons Web Matrix pour e e construire les fonctions n´cessaire comme dans la section B. e e 3.Data. e e e` la couche m´tier que nous avons d´j` ´crit. reprendre la classe AnnuaireDal.

carte.netmodule /addmodule:AnnuaireDAL. LA LOGIQUE METIER : ANNUAIRESERVICE.cs Voici un exemple de compilation globale : csc /out:AnnuaireService. carte.10 La logique m´tier : AnnuaireService.dll /t:library IAnnuaireService.Nom = requete.cs /t:module /addModule:CarteDeVisite.netmodule AnnuaireDAL.Tables["Table"].Email = requete.dll /t:library /addModule:IAnnuaireService. carte.Rows[0]["nom"].dll e Nous avons maintenant les diff´rents ´l´ments pour construire la biblioth`que e ee e AnnuaireService. return carte.netmodule AnnuaireService.ToString()). carte. carte.DLL 257 carte.Tables["Table"].cs AnnuaireService. } catch (Exception e) { Console.netmodule IAnnuaireService. construire un client local capable d’ajouter une nouvelle fiche et de consulter les fiches pr´sentes dans la base.´ B.Email.Email). } B.Rows[0]["prenom"].cs.cs \ AnnuaireDAL.Nom.WriteLine ("l’email de RIVEILL est {0}".Prenom.cs CarteDeVisite.Rows[0]["telephone"]. carte. CarteDeVisite carte = annuaire.cs B. carte. } return 0.Telephone).cs REM liaison des modules produits avec la logique m´tier e csc /out:AnnuaireService2. e public class ClientLocal { public ClientLocal() { } static int Main() { try { IAnnuaireAdminService annuaire = new AnnuaireAdminService ().Rows[0]["email"].Tables["Table"]. Voici un exemple de compilation s´par´e : e e REM csc csc csc production des diff´rents modules e /t:module CarteDeVisite.10.WriteLine (e. Console.netmodule \ /addModule:CarteDeVisite.Tables["Table"]. } public void AjouterCarte(CarteDeVisite carte) { AjouterCarteSQL (carte.Prenom = requete.Telephone = requete.11 Utilisation depuis un client local Nous allons maintenant.dll par compilation du fichier annuaireService.Rechercher ("RIVEILL"). } } .cs /t:module /addModule:CarteDeVisite.

IAnnuaireService { IAnnuaireAdminService annuaire = new AnnuaireAdminService ().12. public CarteDeVisite Rechercher(string nom) { return annuaire.Runtime.258 ANNEXE B.Remoting.NET Remoting et le service de consultation e sera accessible au travers d’un Web Service.5.Runtime.5 – Objets utilis´s pour les diff´rents appel a distance e e ` B.12 Publications des services Il s’agit d’exposer maintenant le service d’annuaire afin de le rendre accessible aux clients distants.NET Remoting il faut cr´er un conteneur (objet servant e dans la terminologie de l’OMG) capable de distribuer cet objet.Channels.cs) using using using using System.NET Remoting Pour exposer un service via le .Remoting. La figure suivante pr´sente les diff´rents objets qui seront cr´´s dans le cas de e e ee l’approche .Runtime. public class AnnuaireServiceRemoting: MarshalByRefObject. System.Remoting. System. . .1 Publication . Le service e e d’ajout de carte de visite sera publi´ via le .NET EN PRATIQUE B.Tcp.Channels. Nous allons exposer ces services de deux mani`res diff´rents.Net Remoting et dans le cas de l’approche par service web. ` e AnnuaireServiceRemoting (AnnuaireServiceRemoting. il s’agit d’enrober la logique m´tier de l’application dans des conteneurs permettant l’acc`s distant e e au service. e e e Figure B. Les diff´rents objets utilis´ sont d´crits dans la figure B.Rechercher(nom). Pour cela nous allons construire un ex´cutable qui publiera l’objet sur le port 7000 via un canal TCP en mode e singleton (un seul objet serveur actif a la fois partag´ par tous les clients). Dans le cas de cet exemple d’annuaire. System.

ChannelServices. using System. Voici un cours r´sum´ : e e 1.ReadLine().Runtime. ’XML Web Service’. System.").12.Remoting. Le code est presque le mˆme que pour le servant dans le cadre e ` e du ’Remoting’. public class AnnuaireWebService : System. il faut un serveur Web. <%@ WebService language="C#" class="AnnuaireWebService" Debug="true" %> using System.essi.asmx (File.Channels. "TcpService". Seules les m´thode devant ˆtre acc´d´es a distance sont pr´c´d´es de e e e e ` e e e l’attribut [WebMethod].Tcp.Remoting. Console.Singleton). } } Server (Server. Le tutorial de Web Matrix (http ://rangiroa.Ajouter(carte). Il vous reste a compl´ter le code pour qu’il e ` e acc`de a l’annuaire.Serialization. Pour cela. e New File) puis ’General’.Runtime.B.fr/cours/tutorial-webmatrix) explique en d´tail la marche a e ` suivre. PUBLICATIONS DES SERVICES 259 } public void Ajouter(CarteDeVisite carte) { annuaire.Xml.RegisterWellKnownServiceType( typeof (AnnuaireServiceRemoting).cs) using using using using System.Web. false). IAnnuaireService { private IAnnuaireService service. ıte 2.Services. et finir de remplir la boˆ de dialogue.RegisterChannel (chan. } } B. System. System.2 Publication WEB Service Pour pouvoir ex´cuter un service Web. nous allons e utiliser Web Matrix qui permet d’activer un serveur Web interne. public class Server { [STAThread] static void Main(string[] args) { IChannel chan = new TcpChannel (7000).Runtime.WebService. . WellKnownObjectMode.WriteLine("Press Enter to disconnect the annuaire.Remoting.Web. Console. RemotingConfiguration.Channels. using System. un canevas de service web est cr´e.Services. cr´er la classe AnnuaireWebService dans le fichier AnnuaireWebService.12.

} } 3.NET Remoting class Client { static void Main (string[] args) { // creation d’une connection TCP TcpChannel channel = new TcpChannel ().cs /n:proxy http://machine:port/URL?WSDL REM la directive /n permet de pr´ciser l’espace de nom e Voici de mani`re comparative les diff´rentes mani`res de construire le client : e e e Client local class Client { static void Main (string[] args) { // creation de l’objet IAnnuaireService annuaire = new AnnuaireService (). http://localhost:80/AnnuaireWebService.Net Remoting. } } Client . ChannelServices. le client n’a besoin de connaˆ que l’interface du service.Rechercher(nom).NET EN PRATIQUE public AnnuaireWebService() { service=new AnnuaireService(). } [WebMethod] public CarteDeVisite Rechercher(string nom) { return service.asmx?WSDL pour avoir acc`s a la description WSDL e ` B.13 B.RegisterChannel (channel. Un navigateur s’ouvre avec une page vous permettant d’interroger le service web. false).13. e 4.Recherche ("auteur"). Ceci peut ˆtre fait par l’utilisation de l’utilitaire WSDL : e wsdl. ıtre Dans le cas de la consommation du service web il est n´cessaire d’obtenir un proxy en C# e sur ce service web. CarteDeVisite c = annuaire. Sauvegarder et ex´cuter le service web (appuyer sur la touche F5). . Copier la dll dans un r´pertoire bin.1 Utilisation de ces services Par un client lourd Dans le cas de .260 ANNEXE B.asmx pour avoir acc`s au service web e http://localhost:8086/AnnuaireWebService. Une boite de e dialogue vous demande le port d’activation du Web Service (80 par d´faut) e 5. .exe /out:proxy_webservice.

cartedevisite carte = annuaire. e Solution 1 Cr´er un client l´ger qui appelle le service pr´c´demment cr´´. l’entˆte de la page (onglet ’all’) doit e contenir la directive debug ainsi que le chargement du proxy g´n´r´ : e ee <%@ Page Language="C#" Debug="true" %> <%@ assembly Src="proxy_annuaireWS.B.Text = carte.Email. B.0.GetObject (typeof (IAnnuaireService).Rechercher (nom. nous l’avons d´j` fait.Text).cartedevisite c } } = annuaire.1:7000/TcpService"). LabelEmailValeur.Visible = true. proxy. LabelEmailValeur. la partie code d’une telle page.13.Text = carte. } } Client service web class Client { static void Main (string[] args) { // creation du proxy proxy. // rendre visible les ’Label" de la page LabelPrenom.Recherche ("auteur").Recherche ("auteur"). UTILISATION DE CES SERVICES 261 // creation du proxy IAnnuaireService annuaire = (IAnnuaireService) Activator. LabelPrenomValeur. Pour respecter ee e ea celle-ci.AnnuaireWebService (). Voici par exemple.AnnuaireWebService annuaire = new proxy. CarteDeVisite c = annuaire. nous avons deux possibilit´s.13.Visible = true. "tcp://127. via le proxy e e e e ee g´n´r´ pr´c´demment.cs" %> La partie code est la suivante : void Button_Click(object sender.AnnuaireWebService (). // mise a jour des ’Label’ contenu dans la page ` LabelPrenomValeur.AnnuaireWebService annuaire = new proxy.Prenom.Visible = true. } .Visible = true. LabelEmail. EventArgs e) { // cr´ation du proxy et appel du service web e proxy.0. proxy. e ee e e Pour pouvoir mettre au point le programme.2 Par un client l´ger e A part l’architecture qui n’avait pas ´t´ respect´e.

LabelPrenomValeur. LabelPrenomValeur.NET EN PRATIQUE La partie ’html’ de la page contient un TextBox pour saisir le nom et quatre Label : deux pour afficher le texte ”pr´nom” et ”email” et deux autres pour afficher les valeurs e associ´es. e – Nous avons construit tr`s rapidement cet exemple. en l’absence de la directive e e e e import.Text).14 Pour poursuivre le TP – Utiliser le d´ploiement et la gestion de version afin de pouvoir faire ´voluer le code e e et g´rer de multiples versions de chaque composants. EventArgs e) { IAnnuaireService annuaire = new AnnuaireService (). <asp:TextBox id="nom" runat="server"></asp:TextBox> .Text = carte.. il faut aussi d´placer dans ce r´pertoire e e les diff´rents modules.Visible = true.Prenom. <asp:Label id="LabelPrenom" runat="server" text="Pr´nom : " \ e visible="False"></asp:Label> <asp:Label id="LabelPrenomValeur" runat="server" text="Label" \ visible="False"></asp:Label> . LabelEmailValeur.Email.Visible = true.. en particulier les cas d’erreur ne e sont pas trait´s. LabelEmailValeur.Visible = true. puis en e e e c e utilisant la directive ’import’ pour charger le ’namespace’ du TP : <%@ import Namespace="TP" %> Attention : si votre dll utilise des modules.Text = carte.... . } B. LabelPrenom.Rechercher (nom. e Le code est le suivant (tr`s voisin de l’´tape pr´c´dente... CarteDeVisite carte = annuaire. e . . Il faudrait en particulier quand des champs des cartes de visite sont e vides. il est aussi possible d’utiliser les noms de classe complet) : void Button_Click(object sender.. <asp:Label id="LabelEmail" runat="server" text="Email : " \ visible="False"></asp:Label> <asp:Label id="LabelEmailValeur" runat="server" text="Label" \ visible="False"></asp:Label> Solution 2 Cr´er un client l´ger qui utilise directement la dll pr´c´demment produite.262 ANNEXE B. LabelEmail. e e e e Ceci peut ˆtre fait tr`s facilement en d´pla¸ant la dll dans un r´pertoire bin.Visible = true.

e – Mettre en place un m´canisme d’authentification afin que seule les personnes autoe ris´es puissent acc´der au donn´es sensible. e – Cr´er d’autres tables afin d’avoir par exemple pour chaque personne son compte e bancaire afin d’effectuer des transfert entre compte de mani`re transactionnelle.B.14. POUR POURSUIVRE LE TP 263 – Il est possible de construire d’autres classes d’acc`s aux donn´es afin d’utiliser une e e sauvegarde dans un fichier XML et non plus une base de donn´es. e e e .

264 ANNEXE B. .NET EN PRATIQUE .

Donsez (version du 19 janvier 2007 .0/fr/deed.org/licenses/by-nc-nd/ 2.Donsez/cours/exemplesosgi/tutorialosgi. .fr/users/Didier.fr) Annexe C OSGI en pratique Le texte de cet atelier se trouve a l’URL : ` http ://www-adele.Intergiciel et Construction d’Applications R´parties e c 2006 D.10:31) Licence Creative Commons (http://creativecommons.htm.imag.

OSGI EN PRATIQUE .266 ANNEXE C.

La section D. il est n´cessaire de se munir de l’archive aokell.1.Intergiciel et Construction d’Applications R´parties e c 2006 L.4 – Ant 1.objectweb.6. e Cette annexe pr´sente l’extension des membranes des composants Fractal primitifs avec e un contrˆleur permettant de journaliser (logger) des ´v´nements.x Par ailleurs. Elle se poursuit par e e ` le d´veloppement du contrˆleur de journalisation divis´ en deux parties.fr) Annexe D AOKell : une r´alisation r´flexive e e du mod`le Fractal e L’objectif de cette annexe est d’illustrer le d´veloppement de contrˆleur pour le canevas e o logiciel AOKell qui est une impl´mentation en Java du mod`le de composants Fractal. e Cette annexe d´bute par une pr´sentation des outils a utiliser. On y trouvera une version pr´compil´e de AOKell 2.1 D.1 Pr´liminaires e Logiciels n´cessaires e Les logiciels suivants sont n´cessaires pour mettre en œuvre cet atelier : e – JDK >= 1.org . e e Les pr´requis pour suivre cet atelier sont de connaˆ e ıtre le langage Java et d’avoir une connaissance basique du mod`le de composants Fractal.org/licenses/by-nc-nd/ 2.0/fr/deed. L’interface e e e et l’impl´mentation de ce contrˆleur de journalisation sont identiques a celles d´finies e o ` e dans Dream1 qui est une biblioth`que de composants Fractal d´di´e a la construction e e e ` d’intergiciels orient´s message.objectweb. Le e premier contient les fichiers pour la section D.2 e o e pr´sente le d´veloppement de ce contrˆleur pour des membranes a base d’objets. Seinturier (version du 19 janvier 2007 .org http://monolog.10:31) Licence Creative Commons (http://creativecommons. L’archive contient deux sous-r´pertoires principaux : oo et comp. Un nouveau contrˆleur o e e o sera donc d´velopp´ et enregistr´ dans la membrane des composants primitifs.3 reproduit cette d´monstration pour des membranes a base de composants.zip et d’extraire les fichiers e qu’elle contient.2 dans laquelle nous illustrons l’´criture d’un e 1 2 http://dream.0 et la librairie de joure e nalisation Monolog2 . tandis que e e o ` la section D. e ` D.

eclipse.0 a apport´ en plus le support de Spoon 4 est un compie lateur ouvert pour le langage Java qui permet de transformer les programmes avant leur compilation. comme les e e e o composants applicatifs.2 AOKell 2. Par ailleurs. Spoon est architectur´ comme un back-end du come pilateur jdt (le compilateur Java d’IBM inclus dans Eclipse). e o e e e ` Comme nous l’illustrons a la section D.3 dans laquelle nous illustrons l’´criture d’un contrˆleur pour e o des membranes a base de composants. Spoon permet de r´aliser toutes sortes de transformation sur un programme ee e e source et en particulier. Ceux-ci. ` D. AOKell rese e pecte le niveau de conforme 3. La version 2. e vous pouvez vous d´placez dans un de ces sous-r´peroires et taper : ant execute. Le composant Client invoque la m´thode print fournie e e e par l’interface s du composant Serveur. les transformations correspondant aux primitives des langages de programmation par tel que AspectJ. Julia.0 d’AOKell utilisait e o pour cela AspectJ3 .1. nous obtenons la trace e d’ex´cution suivante : e 3 4 http://www.gforge. o D.´ ´ ` 268ANNEXE D. L’application peut ˆtre d´marr´e via l’interface r du composant Client export´e e e e e e au niveau du composite. e ` e e e ` La seconde originalit´ d’AOKell est d’utiliser un syst`me de programmation par ase e pects pour int´grer les niveaux de contrˆle et applicatif. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL contrˆleur pour des membranes a base d’objets.0 AOKell est une impl´mentation Java du mod`le de composants Fractal. Deux points originaux e e e ee distinguent AOKell de Julia : le contrˆle peut ˆtre d´velopp´ a l’aide de composants et o e e e ` l’int´gration du contrˆle et de la partie m´tier des composants est r´alis´e a l’aide d’aspects.3 Test de l’installation Les sous-r´pertoires de oo/examples/ contiennent des exemples de programmes Java/e Fractal s’ex´cutant avec AOKell.3 ce qui fournit une compatibilit´ maximale avec les ape plications d´velopp´es pour l’impl´mentation de r´f´rence. les gabarits de code de e e Spoon ont ´t´ con¸us de fa¸on a ˆtre fortement typ´ ce qui permet de d´tecter les erreurs ee c c e e e de transformation au plus tˆt. Afin de tester le bon fonctionnement de votre installation.org/aspectj http://spoon.inria. AOe Kell peut ainsi ˆtre vu comme un syst`me r´flexif dans lequel des composants fournissent e e e un niveau m´ta a une application elle-mˆme d´velopp´e a base de composants.3. Spoon b´n´ficie ainsi des nombreuses e ee e e optimisations qui ont ´t´ inclues dans cet outil et analyse et transforme le code Java bien ee plus rapidement qu’avec n’importe quel autre approche d´velopp´e a l’aide d’une grame e ` maire ad hoc et d’un analyseur syntaxique g´n´rique. Pour cela. les membranes de contrˆle AOKell peuvent ` o ˆtre d´velopp´es comme des assemblages de composants de contrˆle. tandis que le sous-r´pertoire comp contient o ` e les fichiers pour la section D.fr . des m´canismes de processeurs et de gabarits (templates) de code e ont ´t´ d´finis. Spoon transforme le code apr`s que l’arbre syntaxique ait ´t´ construit par jdt. e e Nous allons illustrer cette d´monstration avec l’exemple helloworld qui met en place e l’architecture pr´sent´e figure D. La version 1. sont des composants Fractal manipulables avec la mˆme API. Cette m´thode affiche le message transmis en e param`tre. En tapant ant execute dans le sous-r´pertoire helloworld.1.1.

java:31) at aokell.ServerImpl. ->hello world Server: print done.RunnableBoundableInterface.java:33) at aokell. e e .java.ClientImpl...RunnableImplementedInterface.1 – Architecture de l’exemple helloworld. Il y a deux ` e fa¸ons de d´velopper un contrˆleur avec AOKell selon qu’il est faiblement ou fortement c e o coupl´ avec la partie m´tier du composant.generated.2 Contrˆleur de journalisation orient´ objet o e Cette section d´crit l’impl´mentation du contrˆleur de journalisation pour des meme e o branes a base d’objets. Apr`s les trois premi`res lignes contenant le message de bienvenue.print(ServerImpl.impl.main(Main. nous trouvons les e e deux lignes indiquant la cr´ation des composants Client et Serveur. CONTROLEUR DE JOURNALISATION ORIENTE OBJET 269 Figure D.Main. [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] [java] =================================================== ==== Hello World with the API ==== =================================================== CLIENT created SERVEUR created Interfaces du composant Client 0 name-controller 1 super-controller 2 component 3 r 4 binding-controller 5 lifecycle-controller 6 s Server: print method called at cs.ServiceImplementedInterface.cs.run(ClientImpl.impl.run at aokell.ˆ ´ D.java:33) Server: begin printing.java:53) at hw.run at cs. les sept interfaces du composant Client : cinq e de contrˆle et deux m´tier.2. Nous utiliserons le sous-r´pertoire oo extrait de l’archive. o D.generated.main(Main. Cette liste sera ´tendue par la suite avec une interface de o e e contrˆle de journalisation. la liste des interfaces de e contrˆle du composant Client et l’ex´cution proprement dite de l’application avec l’appel o e de la m´thode print.print at cs.java.generated.lang.Main.impl.lang. Notons en particulier.

e o e e Au final. Notons que l’ensemble du processus pr´c´dent n’est en rien impos´ par AOKell ni par e e e Fractal. Le contrˆleur de journalisation fournit un journal (instance de type Logger). le contrˆleur peut modifier le comportement de la partie m´tier e o e en y ajoutant du code ou en modifiant le code existant. Impl´mentation du contrˆleur e o 3.2. Nous choisissons de faire en sorte que cela soit le composant lui-mˆme qui e impl´mente cette interface. De mˆme. il est n´cessaire de fournir une instance de type e Loggable. Cette derni`re d´finit une seule m´thode setLogger qui e e e e fournit la r´f´rence du journal (instance impl´mentant l’interface Logger). e 2. Pour cela. en plus d’ˆtre enregistr´ e e e e aupr`s de la membrane. Elle est associ´e a une interface Java. D´finition de l’interface de contrˆle e o 2. L’interface LoggerController permet de d´terminer le niveau de s´v´rit´ des messages e e e e a journaliser.2. Il s’agit purement d’un choix de conception. o e 4. Enregistrement du contrˆleur o ´ Etape 1 : D´finition de l’interface de contrˆle e o L’interface de contrˆle est le point d’entr´e pour acc´der a tout contrˆleur. le fait d’agr´ger deux e e interfaces existantes pour d´finir l’interface de contrˆle rel`ve ´galement d’un tel choix. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL Dans le premier cas (couplage faible). e Dans le second cas (couplage fort). nous d´finissons l’interface suivante pour notre contrˆleur de journalisation : e o .2. Il est “simplement” enregistr´ aupr`s de la membrane et on y acc`de via e e e e les m´thodes d’introspection getFcInterface et getFcInterfaces de l’interface Component. Le contrˆleur de journalisation rappelle le composant via la m´thode setLogger.1 Contrˆleur objet faiblement coupl´ o e Le d´veloppement d’un contrˆleur objet faiblement coupl´ passe par les trois ´tapes e o e e suivantes : 1. C’est une o e e ` o interface (au sens Fractal) serveur et externe. Ceux-ci correspondent aux instances e e ` impl´mentant l’interface Loggable.2. Pour cela. pr´sent´ section D. Le composant peut utiliser le journal pour enregistrer des ´v´nements avec la m´thoe e e de log. il n’y a pas de modification e e du code de la partie m´tier par le contrˆleur qui se contente de fournir de nouvelles e o fonctionnalit´s.´ ´ ` 270ANNEXE D. Chaque composant souhaitant journaliser des ´v´nements s’enregistre aupr`s de son e e e contrˆleur de journalisation en utilisation la m´thode registerLogger de l’interface o e LoggerControllerRegister. il est n´cessaire d’´crire e e un aspect.1. pr´sent´ section D. Pour les e ` besoins de cet atelier nous d´finissons l’interface LoggerControllerItf en agr´geant deux e e interfaces existantes issues de Dream : LoggerController et LoggerControllerRegister. tandis que l’interface LoggerControllerRegister permet d’enregistrer ou de ` retirer des producteurs d’´v´nements a journaliser. D. le ee e e e principe de fonctionnement du contrˆleur de journalisation sera le suivant : o 1. o 3. En r´sum´.

objectweb.control.control. } Notons les deux constantes NAME et TYPE que nous ajoutons dans cette interface. final public static InterfaceType TYPE = new InterfaceTypeImpl( NAME. Il s’agit d’une pratique qui n’a aucun caract`re obligatoire mais qui permet de d´finir le nom et le e e type (au sens Fractal) associ´s a cette interface de contrˆle.logger.fractal.aokell.objectweb. Pour l’impl´mentation de l’interface LoggerControllerItf.objectweb. false. nous choisissons de r´utiliser e e le code qui est fournit dans Dream pour le contrˆleur de journalisation.dream. Notre contrˆleur de jouro o nalisation doit donc impl´menter cette interface et son interface “m´tier”. e Il est n´cessaire de compl´ter cette classe avec une impl´mentation de l’interface e e e LoggerControllerItf qui d´finit les trois m´thodes suivantes : e e – setFcCompCtrl : cette m´thode est utilis´e par AOKell pour fournir au contrˆleur la e e o r´f´rence du contrˆleur de type Component associ´ a la membrane courante. import import import import org.InterfaceTypeImpl.fr> */ public interface LoggerControllerItf extends LoggerController. org. org.logger.InterfaceType.lib. LoggerControllerRegister { final public static String NAME = "logger-controller". CONTROLEUR DE JOURNALISATION ORIENTE OBJET 271 package org. AOKell l’invoque apr`s e o e avoir invoqu´ setFcCompCtrl et apr`s avoir cr´´ tous les autres contrˆleurs.logger. LoggerControllerItf.class. e ` o ´ Etape 2 : Impl´mentation du contrˆleur e o Les contrˆleurs AOKell doivent impl´menter l’interface Controller qui est utilis´e par o e e AOKell lors de l’initialisation d’une membrane de contrˆle. Cette m´thode peut donc rester vide pour les e o e contrˆleurs sans ´tat.aokell.dream. Lors de e e ee o l’ex´cution de initFcCtrl l’identit´ du contrˆleur de type Component est donc connu e e o et tout traitement d’initialisation n´cessitant la pr´sence des autres contrˆleurs de e e o la membrane peut ˆtre entrepris.Seinturier@lifl.java du r´pertoire examples/helloworld/src/org/objectweb/fractal/ e aokell/dream/lib/control/logger reprend cette impl´mentation. Le fichier BasicLogo gerControllerImpl.type.fractal. l’ordre d’ex´cution des m´thodes lors de l’initialisation d’un contrˆleur e e e o AOKell est le suivant : . o e Pour r´sumer.2.api.type.LoggerControllerRegister.objectweb.fractal. false.control.dream. /** * @author Lionel Seinturier <Lionel. false).getName().LoggerController.ˆ ´ D. org. e – cloneFcCtrl : cette m´thode est invoqu´e par le contrˆleur de type Factory pour e e o cloner l’´tat du contrˆleur courant. c’est-`-dire e e a LoggerControllerItf.objectweb.lib. ee o e` – initFcCtrl : cette m´thode permet d’initialiser le contrˆleur.

un tableau de d´finitions de contrˆleur (i. Ce fichier est le point d’entr´e de l’exemple helloworld. ce contrˆleur se contente de sauvegarder la r´f´rence o ee du contrˆleur de type Component. soit de cr´er une nouvelle membrane pour accueillir ce contrˆleur. public void initFcCtrl() {} public void cloneFcCtrl( Component dst. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL 1. un tableau de e o ControllerDef) et un type marqueur (nous omettons pour l’instant cette notion sur laquelle nous reviendrons lors de la section D. BasicLoggerControllerImpl. e Membranes membranes = Membranes.2.compctrl = compctrl. Component. Nous ajoutons la d´finition du contrˆleur de journalisation dans la d´finition des meme o e branes primitives a l’aide des lignes de code suivantes.TYPE. Nous illustrons ` le second en ajoutant le contrˆleur de journalisation dans la d´finition des membranes o e primitives. Il s’agit maine o e tenant. soit de l’ajouter e o a une membrane existante. tout nouveau composant cr´´ avec cette membrane se verra associer en ee plus des cinq contrˆleurs habituels (liaison. o – la classe MembraneDef d´finit un type de membrane a l’aide de trois param`tres : un e ` e identifiant de membrane. un contrˆleur de journalisation. Object hints ) throws CloneCtrlException {} Comme nous pouvons le constater. ne fait aucune initialisation et est sans ´tat.getMembraneDef("primitive"). arrˆt/d´marrage. ajouter l’interface Controller dans la clause implements et ajouter les trois m´thodes suivantes : e public void setFcCompCtrl( Component compctrl ) { this. nous nous basons sur l’API d’AOKell qui fournit les ´l´ments suivants : ee – le singleton de la classe Membranes : il s’agit d’un dictionnaire des types de membranes enregistr´s dans AOKell.class ).get(). m´thode initFcCtrl e Ouvrir le fichier BasicLoggerControllerImpl. MembraneDef prim = membranes. Dans les deux cas. Il convient de placer ces lignes au ` d´but de la m´thode main du fichier Main. acc`s o e e e au super-composant).2).java localis´ dans le r´pertoire oo/examples/hele e e e loworld/src/hw/. ControllerDef cdef = new ControllerDef( LoggerControllerItf. e – la classe ControllerDef d´finit un type de contrˆleur a l’aide de deux param`tres : e o ` e le type (au sens Fractal) de l’interface de contrˆle et la classe impl´mentant le o e contrˆleur. le principe est identique.e. m´thode setFcCompCtrl e 3.java. nommage.´ ´ ` 272ANNEXE D. o Pour cela. constructeur sans argument 2. prim.registerControllerDef(cdef). o e ´ Etape 3 : Enregistrement du contrˆleur o Nous venons de cr´er une interface de contrˆle et son impl´mentation. Ainsi. . } private Component compctrl.

err."Component SERVEUR called"). Les quatre lignes suivantes d´finissent un nouveau contrˆleur a partir du type (au e o ` sens Fractal) d´fini dans l’interface LoggerControllerItf et de l’impl´mentation fournie par e e la classe BasicLoggerControllerImpl. maintenant que le composant Client est ´quip´ d’un contrˆleur de journalie e o sation. 2. ajouter le code de la m´thode setLogger correspond a l’interface Loggable dans la e ` classe ClientImpl : private Logger logger. Logger logger) { this. } 3.ˆ ´ D.log(BasicLevel. La trace d’ex´cution suivante s’affiche : e e [java] [java] [java] [java] [java] [java] [java] [java] =================================================== ==== Hello World with the API ==== =================================================== CLIENT created SERVER created Interfaces du composant Client 0 name-controller 1 super-controller . Une interface de contrˆle suppl´mentaire apparaˆ dans la liste des o e ıt interfaces impl´ment´es par le composant Client. public void setLogger(String name. lci.getFcInterface("logger-controller").java localis´ dans le e r´pertoire oo/examples/helloworld/src/cs/impl/. e Tester le contrˆleur de journalisation o Nous pouvons tester la nouvelle d´finition de la membrane primitive en relan¸ant e c l’exemple helloworld. dont la r´f´rence est stock´e dans la variable logger. la derni`re ligne enregistre ce contrˆleur e o dans la d´finition des membranes primitives.register("myLogger". Relancer l’ex´cution de l’exemple helloworld. ajouter l’interface Loggable dans la clause implements de la classe ClientImpl. } 4.this).getMessage() ). de l’utiliser. Finalement.println( nsie.2. pour enreee e gistrer des ´v´nements. La deuxi`me ligne r´cup`re la d´finition de la membrane e e e e e primitive. utiliser le journal. enregistrer le composant Client aupr`s de son contrˆleur de journalisation a l’aide e o ` du code suivant a placer en tˆte la m´thode run : ` e e try { LoggerControllerItf lci = (LoggerControllerItf) ((Component)this). CONTROLEUR DE JOURNALISATION ORIENTE OBJET 273 La premi`re ligne r´cup`re la r´f´rence du singleton correspondant au dictionnaire e e e ee de d´finitions de membrane.INFO. } catch( NoSuchInterfaceException nsie ) { System. les ´l´ments suivants : e ee 1. e e Il s’agit. enregistrer l’appel du composant e e Serveur en ajoutant la ligne suivante juste avant l’appel a la m´thode print : ` e logger.logger = logger. Nous allons par exemple. Nous allons donc ajouter au fichier ClientImpl.

ServerImpl.cs. Comme nous le constatons.print [java] at cs.java.2 Contrˆleur objet fortement coupl´ o e Nous avons vu dans la section pr´c´dente.main(Main.java:53) [java] at hw.2. chaque nouveau composant primitif cr´´ se verra ´quip´ d’un ee e e contrˆleur de journalisation. Ainsi.java u Log.lang.generated. d´finir o e e un nouveau type de membrane identifi´ par la chaˆne loggablePrimitive contenant le e ı contrˆleur de journalisation et les contrˆleurs associ´s aux membranes primitives.RunnableImplementedInterface. [java] ->hello world [java] Server: print done.lang.RunnableBoundableInterface.main(Main.ServiceImplementedInterface.run(ClientImpl.Logger log [java] INFO: Component SERVEUR called [java] Server: print method called [java] at cs.impl.util. comment d´velopper un contrˆleur faiblee e e o ment coupl´ pour des membranes a base d’objet.java:44) [java] at aokell.objectweb. Ces modifications sont r´alis´es a l’aide du code ee e e ` dit glu. Pour les besoins e e e . Cette section ´tend cette d´monstration e ` e e avec un contrˆleur fortement coupl´.run [java] at cs. o o e Exercice D. deux lignes suppl´mentaires apparaissent avec le message e qui a ´t´ journalis´.print(ServerImpl.Main.impl.run [java] at aokell.java..java:33) [java] Server: begin printing. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL [java] 2 component [java] 3 m [java] 4 binding-controller [java] 5 lifecycle-controller [java] 6 logger-controller [java] 7 s [java] 20 ao^t 2006 18:29:32 org.ClientImpl.2 Faire en sorte que les composants associ´s aux membranes loggablePrimie tive soient automatiquement enregistr´s aupr`s du contrˆleur de journalisation (indice : e e o m´thode initFcCtrl et interface cach´e /content). Ce code peut ˆtre d´velopp´ soit avec AspectJ.java:31) [java] at aokell.impl.Main. une impl´mentation pour e o e le contrˆleur associ´ puis nous avons enregistr´ ce contrˆleur dans la d´finition des memo e e o e branes primitives.generated.generated. o Exercice D.monolog. soit avec Spoon.1 Plutˆt que de modifier la d´finition de la membrane primitive. e e D.wrapper.. ee e Bilan Nous venons de d´finir un contrˆleur de journalisation pour des membranes a base e o ` d’objets. Contrairement au cas pr´c´dent. un contrˆleur forteo e e e o ment coupl´ peut modifier le code m´tier pour y ajouter de nouveaux ´l´ments ou modifier e e ee le comportement des ´l´ments existants.´ ´ ` 274ANNEXE D. Nous avons pour cela d´fini une interface de contrˆle.

Nous pla¸ons cette interface au mˆme niveau que l’interface de contrˆle c e o et son impl´mentation. e control. L’utilisation d’un ee marqueur est donc ce qui diff´rencie les contrˆleurs fortement coupl´s de ceux qui ne le e o e sont que faiblement. Le contrˆleur de cycle de vie fournit un exemple de modifications qui peuvent o ˆtre entreprises : les appels sur un composant arrˆt´ sont rejet´s en ajoutant un bloc de e ee e code avant le d´but de chacune des m´thodes m´tier du composant. dans le package org. nous lui attribuons un e o suffixe Type. Les e ` composants dont on souhaite qu’ils soient fortement coupl´s avec leurs contrˆleurs.lib. Par convention. nous utilisons Spoon et allons injecter le code du contrˆleur de e o journalisation dans le composant afin que celui-ci puisse y acc´der directement. enregistrement du contrˆleur o Les ´tapes 1. C’est le cas par e exemple de l’interface java. nous nous focalisons sur les ´tapes 3 et 4 qui sont sp´cifiques e e e e aux contrˆleurs fortement coupl´s. o e ´ Etape 3 : D´finition d’une interface marqueur e De fa¸on g´n´rale. 2 et 5 sont identiques respectivement aux ´tapes 1.io. CONTROLEUR DE JOURNALISATION ORIENTE OBJET 275 de cette d´monstration. Le code glu (les aspects e ` AspectJ ou les processeurs Spoon) se servent alors de la pr´sence de ce marqueur pour e modifier le code des composants ou y injecter des ´l´ments additionnels. d´finition de l’interface de contrˆle e o 2. 2 et 3 pr´sent´es e e e e pr´c´demment.objectweb. doivent e o impl´menter le marqueur correspondant a leur type de membrane. sans m´thode) c e e e qui qualifie les classes l’impl´mentant avec une certaine signification.dream. soit de modifier le code existant. Dans la suite. les objets pouvant ˆtre e e transmis par copie dans un flux d’entr´e/sortie.e. ´ ´ Etape 4 : Ecriture du code glu Le code glu permet. impl´mentation du contrˆleur e o 3. d´finition d’une interface marqueur e 4. soit d’injecter du code dans le composant.fractal. e Avec AOKell.2.aokell. 2. chaque type de membrane est associ´ a une interface marqueur. Les marqueurs de membranes h´ritent des marqueurs e associ´s a leur contrˆleurs. Nous nous contentons d’injecter le e o . La d´finition du marqueur pour le contrˆleur de journalisation comporte deux ´tapes : e o e 1. Nous commen¸ons par d´finir une interface vide DreamLogType comme ´tant le marc e e queur associ´ au contrˆleur de journalisation. une interface dite marqueur est une interface vide (i. Une telle modification e e e n’est pas n´cessaire pour le contrˆleur de journalisation.Serializable qui d´signe en Java. Il suffit donc d’ajouter l’interface DreamLogType dans la e ` o clause extends de l’interface PrimitiveType. Nous ´tendons le marqueur PrimitiveType associ´ aux membranes primitives avec e e la marqueur DreamLogType. ´criture du code glu e 5. e Le d´veloppement d’un contrˆleur objet fortement coupl´ passe par les cinq ´tapes e o e e suivantes : 1.logger.ˆ ´ D.

} } Figure D. spoon. spoon.logger.lib. ouvrir le fichier ClientImpl. e package org. public void process(CtClass ct) { SpoonHelper. Celui-ci ins`re les cinq e e m´thodes impl´mentant l’interface LoggerController. spoon.dream.java localis´ e dans le r´pertoire e examples/helloworld/src/ cs/impl et remplacer le bloc try/catch de la m´thode e run (ce bloc a ´t´ introduit suite aux directives de la section D. Il s’agit d’une bonne pratique issue de la programmation par aspects qui o consiste a d´coupler la logique d’int´gration (l’aspect ou dans notre cas.´ ´ ` 276ANNEXE D.1) correspondant a ee ` l’enregistrement du composant aupr`s de son contrˆleur de journalisation par : e o ((LoggerControllerItf)this). il ins`re le template LoggerControllerTemplate.DreamLogType.objectweb.control. e e e` e Tester le contrˆleur de journalisation o Afin de tester le contrˆleur de journalisation fortement coupl´. DreamLogType. org.aokell.fractal. o Comme nous pouvons le constater le code glu d´fini dans le template ne fournit pas e directement le code de contrˆle mais d´l`gue sa r´alisation a l’instance impl´mentant o ee e ` e le contrˆleur.fractal.2 – Code du processeur Spoon pour le code glu du contrˆleur de journalisation.aokell. import import import import import import org.glue.fr> */ public class LoggerControllerProcessor extends AbstractProcessor<CtClass> { final private static Template t = new LoggerControllerTemplate(). e 2.Template.processing.insert( ct.objectweb.2 et D.declaration. t ).template.class.template. les deux m´thodes impl´mentant e e e e l’interface LoggerControllerRegister et la m´thode getLoggerC.Substitution.reflect. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL code de l’interface de contrˆle LoggerControllerItf afin que le composant puisse y acc´der o e directement sans avoir a passer par l’interface de contrˆle Component.CtClass.glue.fractal. Pour e chacune d’entre elle. ouvrir le fichier glue.2.register("myLogger". /** * @author Lionel Seinturier <Lionel. il est n´cessaire de : o e e 1. . ` o Une description d´taill´e de Spoon est au del` de l’objectif de cet atelier. spoon.objectweb.SpoonHelper.xml localis´ dans le r´pertoire examples/helloworld/ et d´come e e menter les deux lignes contenant les balises templateSet et processor.Seinturier@lifl.this). le processeur et ` e e le template Spoon) de la r´alisation concr`te de la fonctionnalit´ a int´grer. Ces deux lignes permettent de prendre en compte le processeur et le template Spoon que nous venons de pr´senter.AbstractProcessor. Nous nous e e a contentons de fournir dans les figures D.aokell.3 le code du processeur et du template. Le processeur transforme toutes les classes impl´mentant l’interface DreamLogType.

register(loggerName.aokell.Template.Seinturier@lifl. import org. CONTROLEUR DE JOURNALISATION ORIENTE OBJET 277 package org. } public void setLoggerLevel(String loggerName. LoggerControllerItf { @Local public LoggerControllerTemplate() {} @Local private ComponentItf _fcComp. /** * @author Lionel Seinturier <Lionel.loggable).setBaseName(name).Loggable.fractal.getLoggerNames().logger.loggable). o . import org.control.template. import org.objectweb.fractal.objectweb.control.lib.FractalHelper.getFcInterface(_fcComp. } public String getBaseName() { return getLoggerC().ˆ ´ D.getBaseName().fractal.getLoggerLevel(loggerName). import spoon.aokell. import spoon.Local.ComponentItf.fr> */ public class LoggerControllerTemplate implements Template. } public String[] getLoggerNames() { return getLoggerC().level). } public int getLoggerLevel(String loggerName) { return getLoggerC(). LoggerControllerItf. private LoggerControllerItf getLoggerC() { return (LoggerControllerItf) FractalHelper.dream.unregister(loggerName. import org.objectweb. } // LoggerController interface implementation public void setBaseName(String name) { getLoggerC().logger.util.component.glue.3 – Code du template Spoon pour le code glu du contrˆleur de journalisation.setLoggerLevel(loggerName.2.template.fractal.objectweb.lib. } // LoggerControllerRegister interface implementation public void register(String loggerName.aokell. } } Figure D. } public void unregister(String loggerName.objectweb."logger-controller").control. Loggable loggable) { getLoggerC(). Loggable loggable) { getLoggerC(). int level) { getLoggerC().aokell.dream.lib.

etc. Nous utiliserons le sous-r´pertoire comp extrait de l’archive. les liens sont r´ifi´s au sein d’une architecture. Comme nous l’avons vu a l’´tape 2 de la sece ` e tion D. ` e Comme pour les membranes a base d’objet.2.java. r´cup`re l’interface de contrˆle correspondante aupr`s du contrˆleur Component. Le couplage fort suit les mˆmes principes e e que ceux ´nonc´s en section D. Dans le cas des contrˆleurs objet.4 et D. 4. A o vie. il est n´cessaire de modifier cette architecture e (statiquement ou dynamiquement) pour prendre en compte cette nouvelle d´pendance.2. Les o e e interactions entre contrˆleurs doivent donc suivre les liens d´finis par cette architecture. Dans e e o e o le cas des contrˆleurs composant. mais pas avec le contrˆleur de o o nommage (NC). ´ Etape 2 : Impl´mentation du contrˆleur e o L’impl´mentation d’un contrˆleur composant est identique a celle d’un composant e o ` ` titre d’exemple.3 Contrˆleur de journalisation orient´ composant o e Cette section d´crit l’impl´mentation du contrˆleur de journalisation pour des meme e o branes a base de composants. o e ` titre d’exemple.´ ´ ` 278ANNEXE D. le contrˆleur peut ˆtre faiblement ou forte` o e ment coupl´.) est identique que la membrane soit a base d’objets ou de composants.5 illustrent l’architecture d’une membrane priA mitive et sa description en Fractal ADL.1. 2. le code des contrˆleurs de base (liaison. Nous illustrerons le premier cas. e La seconde diff´rence entre contrˆleurs objet et contrˆleurs composant concerne la e o o s´mantique de l’interface Controller.2. les figures D. ` Deux diff´rences existent n´anmoins au niveau de la gestion des liens entre contrˆleurs et e e o de la s´mantique de l’interface Controller. nommage. La diff´rence se situe dans le fait que le composant peut ˆtre cast´ e e e e e vers l’interface LoggerControllerItf qui a ´t´ introduite par le code glu. Au sein de e e e . e D. avec AOKell. l’interface Controller doit ˆtre impl´ment´e par les composants. Le r´sultat de ee e cette introduction peut ˆtre consult´ en ouvrant le fichier examples/helloworld/generated/ e e glue/cs/impl/ClientImpl. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL Lancer l’ex´cution de l’exemple helloworld. Pour que cela soit possible. e La premi`re diff´rence entre contrˆleurs objet et composant concerne la gestion des liens e e o entre contrˆleurs. La trace d’ex´cution est identique a celle e e ` obtenue pr´c´demment. Le contrˆleur de liaison (BC) peut interagir avec o le contrˆleur Component (Comp) avec lequel il a une liaison. les liens sont de simples r´f´rences o o ee enregistr´es dans le contrˆleur Component : un contrˆleur devant interagir avec un de ses e o o pairs.3 Faire en sorte que le code glu injecte ´galement l’interface Loggable. cycle de objet. Exercice D. 3. e e Le d´veloppement d’un contrˆleur composant faiblement coupl´ passe par les quatre e o e ´tapes suivantes : e 1. d´finition de l’interface de contrˆle e o impl´mentation du contrˆleur e o d´finition de l’architecture de la membrane e enregistrement du contrˆleur o La d´finition de l’interface de contrˆle suit les mˆmes principes que pour les contrˆleurs e o e o objet.

de la ` e e d´finition de son impl´mentation.4 – Membrane de contrˆle pour les composants primitifs.fractal du r´pertoire e features/membrane/comp/src/org/objectweb/fractal/aokell/lib/membrane/primitive/. il s’agit du contrˆleur Component du o composant de contrˆle.5 est disponible dans le fichier Primitive. et l’ins´rons dans la membrane e primitive. ´ Etape 3 : D´finition de l’architecture de la membrane e Comme pour le contrˆleur de journalisation objet. Parmi ces contrˆleurs. nous d´finissons donc e un fichier LoggerControllerType. le type de ce param`tre soit Component. on trouve notamment un contrˆleur Component. Nous allons pour cela suivre e une bonne pratique qui consiste a s´parer la d´finition du type de composant. o En effet.fractal qui contient : . Ces deux membranes fournissent un ensemble de contrˆleurs qui g`rent le composant o e de contrˆle.3. avec AOKell. Nous choisissons la seconde solution. il est e o n´cessaire de : e 1. d´finir le composant de journalisation en Fractal ADL. CONTROLEUR DE JOURNALISATION ORIENTE COMPOSANT 279 Figure D. soit l’ins´rer dans une e o e membrane existante. Sa o o o r´f´rence est transmise au composant de contrˆle lors de l’appel de la m´thode setFcCompee o e Ctrl. la s´mantique du param`tre de la m´thode setFcCompCtrl diff`re entre les e e e e membranes objet et les membranes composant. o cette interface. Dans le r´pertoire. La descritpion Fractal ADL de la figure D. Bien que dans les deux cas. features/membrane/comp/src/ e e e org/objectweb/fractal/aokell/dream/lib/control/logger/. Nous allons y ajouter la d´finition du contrˆleur de journalisation.ˆ ´ D. tandis que dans le second. dans le premier cas il s’agit de la r´f´rence du contrˆleur e ee o Component de la membrane. nous pouvons soit cr´er une nouvelle o e membrane pour y ins´rer le contrˆleur composant de journalisation. d’une membrane. Deux types de e e membranes pour les composants de contrˆle sont d´finies dans AOKell : mPrimitive pour o e les composants de contrˆle primitif et mComposite pour les composants de contrˆle compoo o site. Ils o sont donc ´quip´s comme tous les composants Fractal. Pour cela. les contrˆleurs composants sont des composants Fractal.

logger.fractal.Export des interfaces de contr^le --> o <binding client="this.membrane. LoggerControllerItf" role="server" /> </definition> Le type du composant comprend une seule interface serveur de signature LoggerControllerItf et de nom //logger-controller. LoggerControllerType"> <interface name="//logger-controller" signature="org.logger.objectweb. ` .Primitive"> <!-.lib.objectweb.control.lib.´ ´ ` 280ANNEXE D.lib.//component" server="Comp.//component" server="Comp.fractal en h´ritant de la d´finition e e e de son type : <definition name="org.control. LoggerControllerType" > <content class="org.Liaisons entre composants de contr^le --> o <binding client="BC.control.lib.//name-controller" server="NC. LoggerController" extends="org.objectweb.aokell.//lifecycle-controller" server="LC.lib.fractal.aokell.//binding-controller"/> <binding client="this.fractal.5 – D´finition de l’architecture des membranes de contrˆle pour les composants primitifs.control.//component"/> <binding client="LC.//binding-controller" server="BC.Composants de contr^le inclus dans une membrane primitive --> o <component name="Comp" definition="ComponentController"/> <component name="NC" definition="NameController"/> <component name="LC" definition="NonCompositeLifeCycleController"/> <component name="BC" definition="PrimitiveBindingController"/> <component name="SC" definition="SuperController"/> <!-.primitive.fractal.objectweb.control.aokell.logger.fractal.objectweb.//lifecycle-controller"/> <binding client="this.//component"/> <controller desc="mComposite"/> </definition> Figure D. e o <definition name="org.logger. BasicLoggerControllerImpl" /> <controller desc="mPrimitive" /> </definition> Le composant est impl´ment´ par la classe BasicLoggerControllerImpl et est associ´ e e e a une membrane mPrimitive.lib.//component"/> <binding client="this. Nous pouvons maintenant d´finir son e impl´mentation dans le fichier LoggerController.//component" server="Comp.aokell.objectweb.binding-controller"/> <binding client="LC.logger.aokell. AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL <definition name="org.dream.aokell.//super-controller" server="SC.//binding-controller" server="//BC.//super-controller"/> <!-.fractal.//name-controller"/> <binding client="this.

o e e Bilan Nous venons de d´finir un contrˆleur de journalisation pour des membranes a base de e o ` composants. e ` Comme dans les cas pr´c´dents. il est n´cessaire d’ajouter org. Pour cela.logger.lib. exporter l’interface de contrˆle du composant de journalisation au niveau du como posite : <binding client="this. le choix de d´finir une nouvelle membrane avait ´t´ fait.3. il aurait ´t´ e ee ee n´cessaire de modifier le fichier AOKellMembranes. ce composite doit exporter toutes les interfaces de contrˆle de la o membrane. Se d´placer dans le r´pertoire output/dist/examples/helloworld/.fractal. e 2. ´ Etape 4 : Enregistrement du contrˆleur o Dans notre cas. e control.LoggerControllerType dans la clause extends du fichier Primitive. la difficult´ d’une telle o e e manipulation r´side dans le type du composite correspondant a la membrane primitive.ˆ ´ D. il est n´cessaire de : o e 1. faire en sorte que le type du composite soit ´tendu avec le type du composant de joure nalisation. e Si par contre. ins´rer la d´finition du composant de journalisation dans le composite primitif a e e ` l’aide de la d´claration suivante : e <component name="LogC" definition="org.logger.objectweb.control.lib. Donc. Tester le contrˆleur de journalisation o Afin de tester le composant contrˆleur de journalisation. e e 3.java localis´ dans le r´pertoire features/ e e e comp/membrane/src/org/objectweb/fractal/aokell/. ee e e o Au del` de cette modification statique. Il aurait donc ´t´ envisageable d’y ee ajouter une instance du contrˆleur de journalisation. la trace d’ex´cution fait apparaˆ e e e ıtre une nouvelle interface de contrˆle impl´ment´e par le composant Client.aokell.//logger-controller" /> 4. e ` Comme nous l’avons vu. Compiler et g´n´rer les exemples d’AOKell a l’aide de la commande ant examples a e e ` ` lancer dans le r´pertoire racine.aokell. ayant choisi de modifier la membrane primitive existante. CONTROLEUR DE JOURNALISATION ORIENTE COMPOSANT 281 2. Tout nouveau e composant primitif cr´´ sera ´quip´ de ce contrˆleur. Lancer l’ex´cution de l’exemple a l’aide de la commande ant execute.objectweb. La d´claration de ce nouveau contrˆleur a ´t´ faite statiquement en modifiant e o ee la description Fractal ADL du composite associ´ aux membranes primitives.//logger-controller" server="LogC. fractal. N´anmoins. ajouter une nouvelle interface de contrˆle dynamiquement revient a faire o ` . LoggerController" /> 3.fractal. cette ´tape e n’a pas lieu d’ˆtre. AOKell permet d’introspecter dynamiquement a une membrane existante pour en modifier l’architecture.

AOKELL : UNE REALISATION REFLEXIVE DU MODELE FRACTAL ` ´voluer dynamiquement le type de ce composite. la mutabilit´ des e e types de composants est un domaine encore peu ´tudi´ dans le cadre du mod`le Fractal e e e et qui n´cessite de plus amples d´veloppements tant au niveau th´orique qu’au niveau de e e e la mise en œuvre dans des canevas logiciel comme Julia ou AOKell.´ ´ ` 282ANNEXE D. . A notre connaissance.

La section 1 est un bref rappel sur les intergiciels a messages. la haute disponibilit´ e e e e et l’interop´rabilit´ avec le monde ext´rieur. A.fr) Annexe E Joram : un intergiciel de communication asynchrone Ce chapitre d´crit les principes de conception et de r´alisation de Joram (Java Open e e Reliable Asynchronous Messaging). Freyssinet (version du 19 janvier 2007 .0/fr/deed. un intergiciel de communication asynchrone qui met en œuvre la sp´cification JMS (Java Messaging Service) pour la communication par messages e entre applications Java. e La section 6 conclut sur les utilisations de Joram et ses perspectives d’´volution. e e connaissent aujourd’hui un regain d’int´rˆt dans le contexte des applications r´parties ee e sur Internet. sujets qui seront d´velopp´s dans les sections suivantes. nous pr´sentons les principales caract´ristiques des syst`mes a e e e ` messages et les motivations pour leur usage.org/licenses/by-nc-nd/ 2. e e E. La section 2 d´crit ` e les traits principaux du mod`le de programmation d´fini par JMS.Intergiciel et Construction d’Applications R´parties e c 2006 R.1. fond´s sur l’envoi de messages. La section 3 pr´sente e e e les principes directeurs de conception de l’architecture interne de Joram pour r´pondre e aux objectifs d’une mise en œuvre distribu´e et configurable. e E. on s’accorde a penser que les mod`les de communication asyn` e chrones sont mieux adapt´s que les mod`les synchrones (de type client-serveur) pour g´rer e e e les interactions entre syst`mes faiblement coupl´s.10:31) Licence Creative Commons (http://creativecommons. avant une br`ve introduction a JMS et a e ` ` Joram. Balter.1 Les intergiciels ` messages (MOM) a Les syst`mes de communication asynchrones. La section 5 pr´sente rapidement le syst`me e e e e e d’agents distribu´ qui constitue la base technologique pour la mise en œuvre de Joram. pour la r´partition de charge. La section 4 d´crit quelques e e fonctions avanc´es du syst`me Joram. En effet.1 Introduction Dans cette section. Le couplage faible r´sulte de plusieurs e e e facteurs de nature spatiale ou temporelle : l’´loignement g´ographique des entit´s commue e e .

L’´mission (on dit aussi la production) e e e e d’un message est une op´ration non bloquante. Les mod`les de communication asynchrones prennent en compte l’ind´pendance entre entit´s e e e communicantes et sont donc mieux arm´s pour traiter ces probl`mes. etc. – Le mode multipoints est g´n´ralement doubl´ d’un syst`me de d´signation associae e e e e tive dans lequel les destinataires du message sont identifi´s par une propri´t´ du e ee message. e ıte – Deux mod`les de communication sont fournis : un mod`le point a point dans lequel e e ` un message produit est consomm´ par un destinataire unique . la possibilit´ de d´connexion temporaire d’un partenaire en raison d’une panne e e ou d’une interruption de la communication (pour les usages mobiles par exemple). Aujourd’hui les e e syst`mes de communication asynchrones. e ` e e A la fin des ann´es 90. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE nicantes. la norme d´finit le mod`le de programmation et l’API correse e pondante. e e sont tr`s largement r´pandus dans la mesure o` ils constituent la base technologique pour e e u la r´alisation des classes d’applications suivantes : e – Int´gration de donn´es et int´gration d’applications (EAI. o e e Du point de vue du mod`le de communication les intergiciels a messages partagent les e ` concepts suivants : – Les entit´s communicantes sont d´coupl´es. ESB. l’´mergence de la sp´cification JMS (Java Messaging Service) dans e e e le monde Java a partiellement combl´ ce handicap. B2B. e Plus pr´cis´ment JMS d´crit l’interface de programmation pour utiliser un bus a messages e e e ` asynchrone.1.284ANNEXE E. Les intergiciels a messages sont donc rest´s proe ` e pri´taires a la fois du point de vue du mod`le de programmation et de leur impl´mentation. e Pendant de nombreuses ann´es l’essor des syst`mes de communication asynchrones a e e ´t´ retard´ par l’absence de normalisation (au contraire de ce qui s’est pass´ pour les ee e e syst`mes client-serveur avec CORBA). un mod`le multie e points dans lequel un message peut ˆtre adress´ a une communaut´ de destinataires e e` e (communication de groupe). Dans la structure d’une application JMS. Ce mode de communication est a l’origine du mod`le Publication/Abon` e nement (Publish/Subscribe) largement r´pandu aujourd’hui. Dans la mise en oeuvre du syst`me e e de messagerie on distingue le service de base qui met en œuvre les abstractions du . partiellement seulement car.2 JMS (Java Messaging Service) JMS (Java Messaging Service) est la sp´cification d’un service de messagerie en Java. e e – Surveillance et contrˆle d’´quipements en r´seau. E. on distingue les composants suivants (voir Figure 1). D’autre part ´metteur (producteur) et e e r´cepteur (consommateur) ne communiquent pas directement entre eux mais utilisent e un objet de communication interm´diaire (boˆ aux lettres). comme e nous le verrons plus loin. ni mˆme sur les m´canismes d’interop´rabilit´ comme c’est le cas dans CORBA e e e e e avec le protocole IIOP.) e e e – Syst`mes ubiquitaires et usages de la mobilit´. – Le syst`me de messagerie JMS (JMS provider ). c’est-`-dire la mani`re de programmer les ´changes entre deux composants a e e applicatifs. appel´s MOM (Message Oriented Middleware). En revanche il n’y a toujours pas de tentative de normalisation sur l’intergiciel lui-mˆme.

voir figure 3. La consommation du message est confirm´e par un accus´ de r´ception g´n´r´ e e e e ee par le syst`me ou le client.non repr´sent´ dans la figure 2) par le gestionnaire e e e e de messages. ` e Un message est adress´ a une queue par un client producteur (flot not´ 1) d’o` il est e ` e u extrait par un client consommateur. e e – Les messages JMS sont des objets qui permettent de v´hiculer des informations entre e des clients JMS. qui produisent (´mettent) et consomment (re¸oivent) des messages selon des e c protocoles sp´cifi´s par l’API JMS. Un client producteur ´met un message concernant un sujet e pr´d´termin´ (Topic) (flot not´ 2 dans la figure 3). objets Java (s´rialis´s). Un message est consomm´ par un seul client. etc. Elle permet e 1 Dans la suite ce terme « destination » sera utilis´ pour faire r´f´rence indistinctement a une queue ou e ee ` a un Topic . e La communication multipoints est fond´e sur le mod`le publication/abonnement (Pue e blish/Subscribe) . Tous les clients pr´alablement abonn´s e e e e e e a ce Topic (flots 1a et 1b) re¸oivent le message correspondant (flots 3a et 3b).1 – Application JMS mod`le de programmation JMS et une biblioth`que de fonctions li´e aux programmes e e e utilisateurs qui met en œuvre l’interface de programmation JMS. Fournisseur Plate-forme JMS API JMS Application Z Figure E. – Les clients JMS (JMS client) sont les programmes (applications). Diff´rents types de messages sont utilisables : texte structur´ (par e e exemple un fichier XML). format binaire. / Consomt .1) unifie la manipulation e e e e des deux modes de communication au niveau du client JMS en introduisant la notion de Destination1 pour repr´senter soit une queue de message. ` . ´crits en langage e Java. Le e message est stock´ dans la queue jusqu’` sa consommation ou jusqu’` l’expiration d’un e a a d´lai d’existence.1. soit un Topic .E. Cette unifie cation simplifie l’API (les primitives de production/consommation sont syntaxiquement fusionn´es) et permet une optimisation des ressources de communication. INTRODUCTION 285 Application X API JMS Client JMS Producteur / Consommateur Application Y API JMS Client JMS Producteur / Consommateur Service JMS Client JMS Product . La consommation d’un message peut ˆtre synchrone (retrait explicite e e par le consommateur – flots 2 et 3) ou asynchrone (activation d’une proc´dure de veille e pr´enregistr´e chez le consommateur . Le mod`le ` c e de consommation (implicite/explicite) est identique a celui du mode point a point. ` ` La derni`re version de la sp´cification JMS (d´not´e JMS 1. e e Deux modes de communication (Messaging Domains) sont fournis par la sp´cification e JMS : La communication point a point est fond´e sur des files de message (Queues).

Topic B C Gestion des abonnements 3a 3b 1b Application C subscribe receive Figure E.286ANNEXE E. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Application A send Gestion des messages Application B 2 3 receive 1 Message Queue 4 Application C receive 5 Figure E.2 – Mod`le de communication Point a Point e ` Application B Application A publish Gestion des messages 1a subscribe receive 2 .3 – Mod`le de communication Publish/Subscribe e .

pour la s´curit´ (int´grit´ et confidentialit´ des messages) e e e e e ` et pour certains param`tres de qualit´ de service. Joram est aujourd’hui en exploitation dans de nombreux environnements op´rationnels o` il est utilis´ de deux fa¸ons compl´mentaires : e u e c e – Comme un syst`me de messagerie Java autonome entre des applications JMS e d´velopp´es pour des environnements vari´s (de J2EE a J2ME).objectweb.4). INTRODUCTION 287 ´galement d’utiliser le mode transactionnel dans les deux mod`les de communication. A l’oppos´.1 e e e (elles-mˆmes ´tant partie int´grante de la sp´cification J2EE 1.3 Ce que JMS ne dit pas et ne fait pas JMS d´finit un protocole d’´change entre des producteurs et des consommateurs de e e messages. ee E. la sp´cification JMS est limit´e a la d´finition e e e ` e d’un certain nombre d’objets d’administration qui sont g´r´s par le service de messagerie ee et qui sont utilis´s par les clients JMS au travers de fonctions sp´cifiques de l’API JMS. e Enfin. Certaines fonctions essentielles au fonctionnee e ment d’une plate-forme JMS ne sont pas d´crites dans la sp´cification et font donc l’objet e e d’implantations propri´taires.1. ´galement e disponible sur ObjectWeb .).http ://jonas. Joram fournit ´galement cette fonction (voir 4. e e Bien entendu cela ne remet pas en cause la s´mantique propre a chacun de ces modes e ` de communication. C’est le cas en particulier pour la configuration et l’adminise tration du service de messagerie.org .4 Joram : une mise en œuvre d’un service de messagerie JMS Joram (Java Open Reliable Asynchronous Messaging) est une impl´mentation 100% e Java de la sp´cification JMS. JMS ne donne aucune indication sur la mise en œuvre du service de messagerie qui est donc une implantation propri´taire chez tous les fournisseurs de plates-formes e JMS. e e E. Par ailleurs l’interop´rabilit´ entre deux ` e e clients JMS implant´s sur des plates-formes diff´rentes n’est pas garantie car elle requiert e e l’existence d’une passerelle sp´cifique pour mettre en correspondance les m´canismes des e e deux plates-formes. En ce qui concerne l’administration. une application JMS est supe e pos´e ˆtre ind´pendante d’une plate-forme JMS. Sur ces deux points Joram n’´chappe pas a la e e e ` r`gle.objectweb.E. JMS d´finissant l’API d’acc`s au service de messagerie. e e e ` – Comme un composant de messagerie int´gr´ dans un serveur d’application J2EE.1. e e A ce titre.org . en particulier pour ce e e e qui concerne les abonnements (temporaires ou durables) et la garantie de d´livrance des e messages (propri´t´ de persistance). Cette ind´pendance r´pond a un objectif e e e e e ` de portabilit´. qui doit ˆtre prise en compte dans la programmation du client JMS. Dans la r´alit´ la portabilit´ est r´duite du fait que les fonctions d’ade e e e e ministration sont propres a chaque plate-forme. Cette fonction est disponible dans certaines offres du march´ pour e un nombre restreint de plates-formes.http ://joram. la plupart des plates-formes e e e proposent des fonctions additionnelles qui se pr´sentent comme des valeurs ajout´es aux e e offres concurrentes (par exemple les Topics hi´rarchis´s. Joram est conforme aux derni`res sp´cifications JMS 1. e La sp´cification JMS n’est pas compl`te. des fonctions de s´curit´ et des e e e e m´canismes de haute disponibilit´. la sp´cification JMS d´finit des options de qualit´ de service. Joram est un compoe e e e sant open source disponible sur la base de code ObjectWeb sous licence LGPL . Joram est une brique essentielle du serveur J2EE JOnAS. etc.3).1.

e ` Comme nous le verrons plus loin en d´taillant l’architecture de Joram.) agent MOM distribu agent Plate-forme JORAM Figure E. e connexions. HTTP. Joram est structur´ en e e deux parties : une partie «serveur Joram» qui g`re les objets JMS (Queues. le serveur Joram e peut ˆtre mis en œuvre de fa¸on centralis´e ou de fa¸on distribu´e.) et une partie « client Joram » qui est li´e a l’application cliente JMS.288ANNEXE E. La communication e c e c e entre un client Joram et un serveur Joram s’appuie sur le protocole TCP/IP. topics . dont la e e r´alisation s’appuie sur un intergiciel a messages qui exploite une technologie d’agents e ` distribu´s. Nous exposons ici uniquement les ´l´ments ee ee . La e e description d´taill´e de l’API JMS n’est pas un objectif de ce papier (` cet effet le lecteur e e a pourra se r´f´rer au tutoriel disponible en ligne). La communication entre deux serveurs Joe e ram peut utiliser diff´rents types de protocoles selon les besoins (TCP/IP. etc. La structure g´n´rale de la plate-forme Joe e e e e e ram est repr´sent´e sur la figure 4. Une variante. e e E. Client et serveurs peuvent ˆtre sur des machines phye e e siques diff´rentes . e e Client JMS Application_X API JMS Client JMS Application_Y API JMS Client JORAM producteur/ consommateur Client JORAM producteur/ consommateur Serveur JORAM (queues. pr´sent´e bri`vement en section 4. e communication s´curis´e via SSL). consiste a utiliser le protocole HTTP/SOAP pour les clients e e ` JMS d´velopp´s dans un environnement J2ME. pr´sent´e plus loin. Topics . Joram est une plate-forme JMS disponible en open source. . JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Comme toutes les autres r´alisations de plates-formes JMS. . ils peuvent partager la mˆme machine et s’ex´cuter dans des processus e e e diff´rents ou partager le mˆme processus.2 Le mod`le de programmation JMS e Cette section pr´sente les principes directeurs du mod`le de programmation JMS. SOAP.4 – La plate-forme Joram En r´sum´.

LE MODELE DE PROGRAMMATION JMS 289 n´cessaires a la compr´hension des aspects architecturaux d´velopp´s plus loin. e – Connection : une connexion active avec le syst`me de messagerie. e – Il peut alors. – Il utilise l’objet Connection pour cr´er une ou plusieurs sessions JMS. a partir d’un objet Session et des objets Destination.1 Les abstractions de JMS JMS d´finit un ensemble de concepts communs aux deux mod`les de communication e e Point-`-Point et Publish/Subscribe : a – ConnectionFactory : un objet d’administration utilis´ par le client JMS pour cr´er e e une connexion avec le syst`me de messagerie.2. e e Ces objets se d´clinent selon le mod`le de communication choisi. – Il utilise le r´pertoire pour trouver un ou plusieurs objets Destination. La destination d´signe une Queue de messages dans le mod`le e e de communication point a point et un Topic dans le mod`le de communication ` e Publish/Subscribe. comme le montre le e e tableau de la figure 5. e – MessageProducer : un objet cr´´ par une session et utilis´ pour ´mettre des messages ee e e a un objet Destination. il obtient e alors des objets Session.5 – Correspondance des interfaces Point a Point et Publish/Subscribe ` E. il obtient alors e un objet Connection. e – Destination : l’objet de communication entre deux clients JMS.` E. – Session : un contexte (mono-thread) pour ´mettre et recevoir des messages.2. Cet objet d´signe la e destination des messages pour un producteur et la source des messages attendus pour un consommateur. cr´er les objets ` e MessageProducer et MessageConsumer pour ´mettre et recevoir des messages. e ` e e e E. ` – MessageConsumer : un objet cr´´ par une session et utilis´ pour recevoir les messages ee e d´pos´s dans un objet Destination. Interface ˙ parent ¨ Destination ConnectionFactory Connection Session MessageProducer MessageConsumer Point. e .2.-point Queue QueueConnectionFactory QueueConnection QueueSession QueueSender QueueReceiver Publish/Subscribe Topic TopicConnectionFactory TopicConnection TopicSession TopicPublisher TopicSubscriber Figure E.2 Principe de fonctionnement Un client JMS ex´cute la s´quence d’op´rations suivante : e e e – Il recherche un objet ConnectionFactory dans un r´pertoire en utilisant l’API JNDI e (Java Naming and Directory Interface) – Il utilise l’objet ConnectionFactory pour cr´er une connexion JMS.

ou de proee e pri´t´s sp´cifiques a l’application ou au syst`me de messagerie.2. e e e – JMSDeliveryMode : ce champ d´finit le mode de d´livrance du message (persistant e e . le corps contient les donn´es utiles a l’application. il est fix´ par la e m´thode d’envoi de message en fonction de l’objet Destination sp´cifi´. ee e ` e – Un corps : JMS d´finit diff´rents types de corps de message afin de r´pondre a e e e ` l’h´t´rog´n´it´ des syst`mes de messagerie.290ANNEXE E. e – Des propri´t´s : en plus des champs standard de l’en-tˆte. E. des objets Java ou des donn´es XML.6 – Architecture d’une application JMS Les ´tapes et les objets caract´risant une application JMS sont r´sum´s dans la figure e e e e 6. ee e e e e En-tˆte des messages e Un en-tˆte de message JMS est compos´ des champs suivants : e e – JMSDestination : ce champs contient la destination du message. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE JNDI Destination Client JMS ConnectionFactory + Connection MessageProducer MessageConsumer + Session Figure E.3 Messages Les syst`mes de messagerie manipulent les messages comme des entit´s comportant un e e entˆte et un corps. les messages permettent ee e d’ajouter des champs optionnels sous forme de propri´t´s normalis´es. Le mod`le de message e ` e JMS r´pond aux crit`res suivants : e e – Il fournit une interface de message unique. L’en-tˆte contient l’information utile pour l’identification et le routage e e du message . – Il supporte les messages contenant du texte. e Structure des messages Un message JMS est compos´ de trois parties : e – Un en-tˆte : qui contient l’ensemble des donn´es utilis´es a la fois par le client et le e e e ` syst`me pour l’identification et l’acheminement du message.

etc.2. tandis que le mode persistant ` e correspond a une s´mantique exactement une fois : le message ne ˆtre ni perdu ni dupliqu´. JMSType.4 Objets JMS Objets d’administration JMS ne d´finit pas une syntaxe d’adressage standard. e ` E. e e e e JMSExpiration : ce champs est calcul´ comme la somme de l’heure courante (GMT) e et de la dur´e de vie d’un message (time-to-live). LE MODELE DE PROGRAMMATION JMS 291 – – – – – ou non2 ) . ` e e e . une valeur peut ˆtre : e ee e e null. JMSRedelivered. il est fix´ par la m´thode d’envoi de message en fonction des param`tres e e e sp´cifi´s. Il est fix´ par la m´thode e e e e d’envoi de message et peut-ˆtre consult´ apr`s envoi par l’´metteur. aucune notification n’est d´finie e e e e pour pr´venir de l’expiration d’un message. e e e e JMSTimeStamp : ce champs contient l’heure de prise en compte du message par le syst`me de messagerie. il est rempli et lu s´quentiellement. Propri´t´s e e Les propri´t´s permettent a un client JMS de s´lectionner les messages en fonction de ee ` e crit`res applicatifs. long. Il est fix´ par le client dans le message.` E. int. il est utilis´ par le client pour initialiser une connexion avec le syst`me e e de messagerie. float. Lorsqu’un message n’est pas e d´livr´e avant sa date d’expiration il est d´truit . 2 Le mode non persistant correspond a une s´mantique au plus une fois. e – BytesMessage : un message dont le corps est compos´ d’un flot d’octets . e JMSCorrelationId. Corps du message JMS d´finit cinq formes de corps de messages : e – StreamMessage : un message dont le corps contient un flot de valeurs de types primitifs Java . En lieu et place. e – MapMessage : un message dont le corps est compos´ d’un ensemble de couples nomse valeurs. ıne e – ObjectMessage : un message dont le corps contient un objet Java s´rialisable. short. il d´finit l’objet e e Destination qui encapsule les diff´rents formats d’adresses des syst`mes de messagerie. Un nom de propri´t´ doit ˆtre de type String . byte. il est fix´ par la m´thode d’envoi de message. ce type de e message permet de coder un message conform´ment a une application existante. JMSPriority. Un client peut ainsi d´finir des filtres en r´ception dans l’objet MessageConsumer a l’aide d’une chaˆ e e ` ıne de caract`re dont la syntaxe est bas´e sur un sous-ensemble de la syntaxe d’expression de e e conditions du langage SQL. e e JMSMessageId : ce champs contient un identificateur qui identifie de mani`re unique e chaque message envoy´ par un syst`me de messagerie. – TextMessage : un message dont le corps est une chaˆ de caract`re (String).2. e e e JMSReplyTo : ce champs contient la Destination a laquelle le client peut ` ´ventuellement ´mettre une r´ponse. double et String. e e L’objet ConnectionFactory encapsule l’ensemble des param`tres de configuration d´finit e e par l’administrateur. boolean.

JMS propose deux mod`les de consommation (synchrone et synchrone) pour e les messages. Rollback). Du fait qu’une session n´cessite l’allocation de ressources dans le e e syst`me de messagerie. – Il cr´e les objets Destination et Message. Objet Session Un objet JMS Session est un contexte mono-thread pour produire et consommer des messages. c’est-`-dire qu’il fournit plusieurs voies de commue a nication logiques entre le client et le serveur. e Dans le mode asynchrone il enregistre au pr´alable un objet qui impl´mente la classe e e MessageListener dans l’objet MessageConsumer . e – Il r´alise l’ordonnancement des messages re¸us et envoy´s. il est recommand´ de la fermer lorsqu’elle n’est plus utilis´e. e e e e apr`s son arrˆt. Pour accroˆ e ıtre le parall´lisme un client JMS peut cr´er plusieurs sese e sions. e Bien qu’une session permette la cr´ation de multiples objets MessageProducer et e MessageConsumer. Lors de sa cr´ation. les messages sont alors d´livr´s lors de e e leur arriv´e par appel de la m´thode onMessage sur cet objet (mode de consommation e e Push). Lors de sa e cr´ation une connexion est dans l’´tat stopp´3 . chaque session ´tant ind´pendante. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Objet Connection Un objet Connection repr´sente une connexion active avec le syst`me de messagerie. ils ne doivent ˆtre utilis´s que par un flot d’ex´cution a la fois (contexte e e e ` mono-thread´). invalid´e) par la e e e e e m´thode Commit (resp. Un objet e MessageConsumer peut ˆtre cr´´ avec un s´lecteur de message pour filtrer les messages a e ee e ` consommer. 3 afin de ne pas perturber l’initialisation de l’application par l’arriv´e de messages. Il r´pond a plusieurs besoins : e ` – Il construit les objets MessageProducer et MessageConsumer. e c e – Il g`re l’acquittement des messages. Du fait qu’une connexion n´cessite e ` e l’allocation de nombreuses ressources dans le syst`me de messagerie. Dans le mod`le synchrone un client demande le prochain message en utie lisant la m´thode Receive de l’objet MessageConsumer (mode de consommation Pull). e – Il supporte les transactions et permet de grouper plusieurs op´rations de r´ception e e et d’´mission dans une unit´ atomique qui peut ˆtre valid´e (resp. Elle doit ˆtre explicitement d´marr´e pour e e e e e e recevoir des messages. si deux sessions e e s’abonnent a un mˆme sujet. il est recommand´ de e e la fermer lorsqu’elle n’est plus utile. Une connexion peut ˆtre temporairement stopp´e puis red´marr´e . Dans le mode Publish/Subscribe. e . L’objet Connection permet de cr´er une ou plusieurs sessions. il peut y avoir encore quelques messages d´livr´s . Un objet MessageConsumer est cr´´ en appelant la m´thode e ee e CreateConsumer de l’objet Session avec un objet Destination en param`tre. e e e Objet MessageConsumer Un client utilise un objet MessageConsumer pour recevoir les messages envoy´s a e ` une destination particuli`re.292ANNEXE E. arrˆter une connexion e e e e e n’affecte pas sa capacit´ a transmettre des messages. le client peut devoir e s’authentifier. e e Cet objet supporte le parall´lisme. chaque client abonn´ (TopicSubscriber) re¸oit tous les mes` e e c sages ´mis sur le Topic .

L’interface des objets QueueSession fournit les m´thodes permettant de cr´er les objets QueueReceiver.2.2. Dans les faits. Un client utilise un objet TopicPublisher pour publier des messages concernant un sujet donn´. dans certains cas une connexion peut a la fois ´mettre et e e ` e recevoir sur un sujet. ` e Un objet Topic encapsule un nom de sujet du syst`me de messagerie. il peut s’agir d’une feuille.2. e E. ` . L’attribut NoLocal sur un objet TopicSubscriber permet de ne pas recevoir les messages ´mis par sa propre connexion. JMS ne met aucune e restriction sur la s´mantique d’un objet Topic . Les objets TopicSubscriber classiques ne re¸oivent que les e e c messages publi´s pendant qu’ils sont actifs. la priorit´ et la dur´e de e e e e e vie par d´faut pour l’ensemble des messages envoy´s par un objet MessageProducer. Un client peut sp´cifier le mode de d´livrance. administrer ou d´truire e e e des queues. e 4 Pour s’abonner a une large classe de sujets par exemple. Les messages filtr´s par un s´lecteur de mese e e sage ne seront jamais d´livr´s . Si aucune destination n’est sp´cifi´e e e e un objet Destination doit ˆtre pass´ a chaque envoi de message (en param`tre de la e e ` e m´thode Send).2. L’objet QueueConnection permet au client d’ouvrir une ou plusieurs sessions (objets QueueSession) pour envoyer et recevoir des messages. Un objet TopicConnection permet de cr´er une ou plusieurs sessions e (objet TopicSession) pour produire et consommer des messages. JMS nomme ces nœuds des Topics.5 Communication en mode Point ` point a Un objet Queue encapsule un nom de file de message du syst`me de messagerie. LE MODELE DE PROGRAMMATION JMS 293 Objet MessageProducer Un client utilise un objet MessageProducer pour envoyer des messages a une destina` tion. L’interface des objets TopicSession fournit les m´thodes permettant de cr´er les objets TopicPublisher et e e TopicSubscriber. E. Il utilise un objet TopicSubscriber pour recevoir les messages e publi´s sur un sujet donn´. e E. e Rappelons que JMS ne d´finit pas de fonctions pour cr´er. Il e e peut aussi les sp´cifier pour chaque message. Un objet MessageProducer est cr´´ appelant la m´thode CreateProducer de l’objet ee e Session avec un objet Destination en param`tre.7 JMS par l’exemple Cette section pr´sente quelques exemples de s´quences de code associ´es aux principales e e e op´rations de l’API JMS. QueueSender et e e QueueBrowser. Un client utilise un objet QueueConnectionFactory ` pour cr´er une connexion active (objet QueueConnection) avec le syst`me de messagee e rie.` E. Un client utilise un objet TopicConnectionFactory e pour cr´er un objet TopicConnection qui repr´sente une connexion active avec le syst`me e e e de messagerie.6 Communication en mode Publish/Subscribe Le mod`le JMS Publish/Subscribe d´finit comment un client JMS publie vers et e e s’abonne a un nœud dans une hi´rarchie de sujets. ou d’une partie e plus importante de la hi´rarchie4 . ces fonctions sont r´alis´es par des outils d’adminsitration e e propres a chaque plate-forme JMS.

then use it to create a session. Initialisation d’une session ”Publish/Subscribe” // We need a pre-configured ConnectionFactory. // & then a TopicSubscriber. QueueReceiver receiver = session. Subscriber.setMessageListener(listener).lookup(" &").lookup(" &"). String selector = new String("(name = ’Bull’) or (name = ’IBM’))").lookup(" &").294ANNEXE E. TopicSession session = connection. Context messaging = new InitialContext().creatReceiver(queue2). // Get it by looking it up using JNDI. // Creates QueueConnection. // acknowledge on receipt // Getting a QueueSender and a QueueReceiver.createQueueSession( false. Session. // Getting a QueueReceiver with a selector message.lookup(" &"). // not transacted Session. Queue queue2 = (Queue) messaging. QueueConnection connection = connectionFactory. TopicConnection connection = connectionFactory.createTopicSession(false. TopicConnectionFactory connectionFactory = (TopicConnectionFactory) messaging.createPublisher(Topic). Queue queue1 = (Queue) messaging. then use it to create a session.createTopicConnection(). Context messaging = new InitialContext(). .CLIENT_ACKNOWLED // Getting a TopicPublisher & TopicPublisher publisher = session. // Get it by looking it up using JNDI. QueueReceiver receiver2 = session. QueueConnectionFactory connectionFactory = (QueueConnectionFactory) messaging.createSubscriber(Topic).AUTO_ACKNOWLEDGE). // Gets Destination objects using JNDI.createSender(queue1). QueueSession session = connection. Queue queue3 = (Queue) messaging.creatReceiver(queue3.createQueueConnection(). JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Initialisation d’une session ”Point-to-Point” // We need a pre-configured ConnectionFactory. QueueSender sender = session.lookup(" &"). selector). Topic Topic = (Topic) messaging. TopicSubscriber subscriber = session.lookup(" &"). // Creates TopicConnection. // Gets Destination object using JNDI.

e les paires sont positionn´es au moyen de m´thodes sur l’objet Message. ObjectMessage message = session. message. Si le client n’est e e int´ress´ que par une partie du message il doit tout de mˆme le lire enti`rement. createTextMessage. et createObjectMessage.writeString(" &").setText(data). le serveur peut envoyer un message contenant les diff´rents e e e champs en s´quence. Les e e e e champs doivent ˆtre ´crits dans l’ordre de lecture.writeLong(longValue). Le client utilise alors l’interface de cet objet pour obtenir l’information utile. doubleValue). Utilisation d’un TextMessage StringBuffer data TextMessage message = session.createStreamMessage().createObjectMessage ().setString("Name". message. message. Utilisation d’un ObjectMessage L’information peut ˆtre envoy´e sous la forme d’un objet s´rialisable contenant l’ene e e semble des informations utiles. message. " &").writeDouble(doubleValue). LE MODELE DE PROGRAMMATION JMS 295 Construction de messages Les messages sont cr´´s au moyen de primitives de l’interface Session en fonction du ee type de message d´sir´ : createBytesMessage.createTextMessage(). message. e e createStreamMessage.createByteMessage(). chacun ´crit au moyen de sa propre primitive. Utilisation d’un BytesMessage byte[] data BytesMessage message = session.setLong("Time". e e StreamMessage message = session.setDouble("Value".` E. Utilisation d’un createStreamMessage De la mˆme mani`re. il peut n’extraire que la partie utile du message et ignorer le reste . ` MapMessage message = session. longValue).writeBytes(data).createMapMessage(). l’ordre des mises e e a jour est quelconque.setObject(obj). message. message. message. Le client re¸oit la e c totalit´ du message. message. Utilisation d’un MapMessage Chaque message est constitu´ d’un ensemble de paires noms/valeur. createMapMessage.2. .

. // Receiving of all of these message types is done in the same way. StreamMessage message.getLong("Time"). length = message.readLong(). int length.getObject(). MapMessage // Note : l’ordre de lecture des champs est quelconque.getDouble("Value"). Here is how to // receive the next message in the queue.readBytes(data). // It is up to the client to process the message there. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Envoi et reception de messages Point-to-Point // Sending of all of these message types is done in the same way: sender. When the // client subscribed to the Topic.receive(). // Receiving of all of these message types is done in the same way. it registered a message listener. long time = message. Publish/Subscribe // Sending (publishing) of all of these message types is done in the same way: publisher. This listener // will be asynchronously notified whenever a message has been published to // the Topic..getString("Name"). This is done via the onMessage() method in that listener class. // Note that this call will block indefinitely until a message arrives on the queue.. } Lecture d’un message BytesMessage byte[] data. StreamMessage // Note : l’ordre de lecture des champs // doit etre identique a l’ordre d’ecriture. void onMessage(Message message) throws JMSException { // unpack and handle the messages we receive.getText(). double value = message.publish(message). long time = message. data = message. ObjectMessage obj = message. String name = message.send(message).296ANNEXE E.readDouble(). double value = message. . String name = message. message = (StreamMessage)receiver.readString(). TextMessage StringBuffer data.

Le choix de m´canismes appropri´s est ici e e e e le r´sultat d’un compromis entre le niveau de qualit´ de service souhait´ et le coˆ t de la e e e u solution correspondante. Chaque serveur g`re un nombre variable de clients JMS. e Ce choix constitue donc un premier niveau de configuration. intercone e nect´s par un bus a message. Application Client Joram Serveur JORAM Q1 Q2 Ta Q T M O M Serveur JORAM Application Client Joram TCP/IP MOM distribu Application Client Joram M O M Q3 Application Client Joram Application Client Joram MOM Queue Topic Tb Serveur JORAM Application embarque Client ˙ l ger ¨ Figure E. Session et Sender (respectivement Receiver) sont des e . e e e E. Cette descrip` tion permet de mettre en ´vidence les objets de communication et les flots de contrˆle et de e o donn´es.1 Principes directeurs et choix de conception La caract´ristique essentielle de la plate-forme Joram est son architecture distribu´e e e et configurable.3.). c’est-`-dire qu’une a plate-forme Joram est constitu´e d’un ensemble de serveurs Joram distribu´s. Un dernier niveau de configuee e e ration concerne les param`tres de qualit´ de service associ´s au bus a messages(protocole e e e ` de communication.3 Architecture de Joram Cette section approfondit quelques aspects fondamentaux de l’architecture de la plateforme Joram qui lui conf`rent des propri´t´s uniques en mati`re de flexibilit´ et de scae ee e e labilit´. ´volutivit´.7 – Architecture de la plate-forme Joram L’architecture g´n´rale d’une plate-forme Joram est illustr´e dans la figure 7. ARCHITECTURE DE JORAM 297 E.3. L’architecture de base de Joram est de type snowflake.2 Architecture logique Le principe de fonctionnement d’une communication entre deux clients JMS est illustr´ e dans la figure 8 (pour le cas particulier d’une communication point a point).3.E. persistance.). etc. Les objets Connection. e E. s´curit´. La e ` e r´partition des serveurs et la distribution des clients sur les serveurs sont de la responsabie lit´ de l’administrateur de la plate-forme Joram en fonction des besoins de l’application. Un deuxi`me niveau r´side e e dans la capacit´ de localiser les destinations (Queues et Topics ) en fonction des besoins e (nous verrons plus loin que ce choix d’implantation a des cons´quences importantes sur les e propri´t´s de l’application : performance. etc.

Cet objet persistant est cr´´ par le serveur lors de la cr´ation d’un ee e utilisateur. Une communication entre un client producteur e et un client consommateur met en œuvre les ´changes suivants (repr´sent´s par les flˆches e e e e rouges) : 1. L’interpr´tation d’une primitive Send d’un client JMS producteur se traduit par e l’envoi d’un message sur la connexion entre le client Joram et l’objet Proxy (not´ ici e Proxy-P) associ´ au client dans le serveur Joram. Notons que nous ne d´crivons pas ici les ´changes au e e niveau MOM. e e Cette suite d’´changes est repr´sent´e par les fl`ches pleines 4. Le message applicatif correspondant u est extrait de la queue de messages et est envoy´ vers l’objet Proxy-C. e 2. l’op´ration e e e Send est termin´e. Il remplit deux fonctions essentielles : – La gestion des communications entre le client et le serveur. Sur le serveur. Cette interaction est repr´sent´e e e e par la fl`che pleine 1. les objets Proxy et Queue peuvent ˆtre implant´s e e sur un ensemble de serveurs coop´rants). chaque client est repr´sent´ e e par un objet Proxy. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE objets temporaires JMS cr´´s par le client Joram lors de l’´tablissement d’une connexion ee e logique entre le client et le serveur Joram. L’objet Proxy-P encapsule le message JMS dans un message destin´ a ˆtre v´hicul´ e`e e e par le bus (not´ ici Message MOM). Un accus´ de r´ception est envoy´ vers le site de la localisation de l’objet Queue e e e afin de retirer le message de la queue et de lib´rer les ressources correspondantes e (fl`ches pointill´es). Cette interaction est repr´sent´e par la fl`che e e e e pleine 3. Du point de vue du client JMS. En cas de probl`me pendant l’´tape N e e e e l’objet Proxy permet de r´-ex´cuter cette ´tape jusqu’` son aboutissement. e Dans l’´tape N◦ 2 le message MOM est sauvegard´ avant d’ˆtre envoy´ vers le site e e e e ◦ 3. Sur le site o` se trouve la queue de messages. Mod`le de communication point a point e ` A ce stade de la pr´sentation. permet d’assurer la garantie de d´livrance des e e e messages au niveau du serveur JMS. la distribution n’est pas repr´sent´e. la sauvegarde r´alis´e par de l’objet Queue . L’accus´ de r´ception peut ˆtre g´n´r´ par le client JMS ou par e e e e e e ee le syst`me. Celui-ci extrait e le message JMS de son enveloppe v´hicul´e par le MOM et l’envoie au client JMS. e 5. Le message construit par l’objet Proxy est v´hicul´ par le MOM vers le site de e e r´sidence de la queue de messages. Un accus´ de r´ception est envoy´ au client Joram qui le remonte e e e ensuite au client JMS (fl`che pointill´e 2). . – L’acheminement des messages vers / depuis la destination (ici une queue de messages). Cette fonction. L’interpr´tation d’une primitive Receive par le client consommateur g´n`re un mese e e sage de contrˆle vers l’objet Proxy associ´ (not´ ici Proxy-C) qui le fait suivre au site o e e o` se trouve la file de message (objet Queue ). Ce message est sauvegard´ dans un support e e persistant local. La requˆte Receive e e e e e du client consommateur est termin´e.e. Il s’agit d’un sch´ma e e e e purement fonctionnel (i. e e e a commun´ment appel´e Store and Forward. dans les faits.298ANNEXE E. e 3. 4. le message est enregistr´ sur u e un support persistant local.

e ` e ` 2. on ´tudie comment ce sch´ma d’architecture logique est mis en œuvre e e dans le cadre d’une configuration centralis´e (serveur Joram unique) dans un premier e temps.8 – Communication Point a Point ` Mod`le de communication Publish/Subscribe e La figure 9 d´crit les objets et flots de contrˆle pour un mode de communication de e o type Publish/Subscribe.3 Architecture centralis´e e Cette option correspond a une configuration simple dans laquelle tous les objets ` Destination sont centralis´s sur un seul serveur auquel sont connect´s des clients par e e l’interm´diaire de l’objet Proxy correspondant. non pas comme une destination finale. ` Il n’y a pas de dialogue entre les objets Proxy et le Topic . Par rapport au sch´ma pr´c´dent on notera que e e e e e le protocole de consommation se limite a un dialogue entre le client et l’objet Proxy. Cette configuration est illustr´e dans la e e figure 10. ARCHITECTURE DE JORAM 299 Client Message JMS Producteur Client Consommateur Message JMS Send Client Joram Client Joram Sender Flot de donn es (mission — rception) Accus de r ception Receive Receiver Session Session Connection Connection 4 5 Message MOM 1 2 Proxy-P Store & Forward Message MOM Message MOM 4 5 Proxy-C 3 Queue Serveur JORAM Figure E. e e E. L’accus´ de r´ception est ensuite envoy´ vers e e e e l’objet Proxy-C (fl`che pointill´e 5). 3. le message construit par le Proxy du producteur est achemin´ direce e tement vers l’ensemble des objets Proxy des consommateurs o` ils sont enregistr´s. puis dans une configuration distribu´e (serveurs coop´rants). u e Notons ici une diff´rence essentielle avec le sch´ma pr´c´dent dans la mesure ou l’obe e e e jet Topic est utilis´. Les ´tapes 1 et 2 sont similaires a celles du mod`le de communication point a point.3.3. . Dans la suite. Dans l’´tape 3.E. L’op´ration de consommation du message se traduit par un ´change entre le client e e et l’objet Proxy-C (fl`ches pleines 4). 1. mais plutˆt comme un e o aiguillage vers un ensemble de destinations finales repr´sent´es par les objets Proxy e e des consommateurs.

300ANNEXE E.10 – Architecture centralis´e e .9 – Mod`le de communication Publish/Subscribe e Client Producteur Message JMS Client Consommateur Client Joram Client Joram Px-P Message MOM Message MOM Message JMS T T Q Px-C Message MOM Serveur Joram Serveur Joram Serveur Joram MOM Scalagent Figure E. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Client Message Producteur JMS Client Consommateur Message JMS Send Client Joram Client Joram Publisher Receive Subscriber Session Session Connection Connection 1 2 4 Proxy-P Message MOM 5 Proxy-C 3 Message MOM Message MOM Topic 3 Serveur JORAM Figure E.

cr´ation des utilisateurs. e e ` Le message JMS. Le rˆle de l’architecte dans la d´finition d’une plate-forme est eso e ` sentiel. Le message MOM qui encapsule le e message JMS est g´n´r´. coˆ ts de d´veloppement e e e e e e e u e et d’exploitation. des destinations. La e ` Figure 11d´crit la structure des ´changes pour une architecture r´partie sur trois sites e e e g´ographiques compos´s chacun d’un serveur et d’un client. etc.3. puis est ensuite consomm´ par le client JMS Client a partir du serveur local S1. Un autre ´l´ment de simplicit´ est ee e li´ aux op´rations d’administration (i. ´mis par le client JMS Client a destination de la queue de messages e ` Q3 est envoy´ vers le proxy Px1 sur le serveur S1.5 Joram : une plate-forme JMS configurable La construction d’une plate-forme JMS adapt´e a un contexte applicatif donn´ est un e ` e exercice difficile dans la mesure o` l’architecture de la plate-forme est le r´sultat de comprou e mis d´licats entre de nombreux crit`res souvent antinomiques. De fa¸on identique un message produit par le client JMS Client-2 a destination de c ` la queue de messages Q1 est transmis via l’objet Px2 du serveur S2.E. La fonction Store and Forward sauve le message localement e ee avant de l’envoyer vers le serveur S3. Ce travail n’est possible que si le service de messagerie fournit des capacit´s de e e configuration suffisantes pour traduire les options d’architecture retenues. Le message stock´ u e e dans la queue Q3 peut ˆtre consomm´ par la suite par un client JMS connect´ au serveur e e e S3. Dans cette configuration la simplicit´ des ´changes est une cons´quence directe de la e e e co-localisation de l’objet Queue et des objets Proxy. e e E. Une d´faillance du serveur e e e e signifie un arrˆt du syst`me global. C’est le cas de 5 Cette configuration particuli`re est prise a titre d’exemple. les flots li´s a l’op´ration de production sont repr´sent´s par des e ` e e e fl`ches pleines. scalabilit´. dise e ponibilit´. o` se trouve localis´e la queue Q3. A partir d’un cahier des charges il doit prendre en compte l’ensemble des crit`res e d’´valuation et leur fixer un poids dans la perspective de d´finir l’architecture « la mieux e e adapt´e ». Les flots de l’op´ration de consommation sont repr´sent´s par des fl`ches e e e e e pointill´es.3. On ne repr´sente pas les flots li´s aux accus´s de r´ception. Le sch´ma repr´sent´ utilise e e e e e l’exemple d’une communication point a point dans lequel chaque serveur est responsable ` de la queue de messages destin´s aux clients JMS connect´s a ce serveur 5 . plusieurs serveurs Joram coop`rent pour assurer e e la communication des messages entre des clients connect´s a ces divers serveurs. tels que performance.) e e e qui sont regroup´es sur un site unique. e ` La communication entre les serveurs est mise en œuvre par le bus a messages sous` jacent qui garantit l’acheminement des messages quelles que soit les pannes de sites et de r´seau.3. Dans le cas d’une e e e e e communication de type Publish/Subscribe le dialogue est r´alis´ directement entre les deux e e objets Proxy. ARCHITECTURE DE JORAM 301 Dans cette figure. L’inconv´nient majeur de cette solution est son e e manque de disponibilit´ et une capacit´ d’extension r´duite. e E.e. s´curit´. etc.4 Architecture distribu´e e Dans une architecture distribu´e. Dans la r´alit´ la configuration des Queues e ` e e et Topics sur les serveurs est laiss´e a l’initiative de l’administrateur. flexibilit´ et capacit´ d’´volution. Par ailleurs le nombre de requˆtes et d’objets g´r´s e e e ee par le serveur est limit´ par sa capacit´ de calcul et de stockage. e ` .

Cette propri´t´ fait r´f´rence a la capae ` e ee ee ` cit´ de faire ´voluer le syst`me pour r´pondre aux ´volutions de l’application. a plusieurs niveaux. – Niveau de disponibilit´ grˆce a la clust´risation et a la r´plication (voir plus loin en e a ` e ` e section 4). SOAP. Le die e e e mensionnement des serveurs (calcul. ce qui donne a l’architecte du syst`me une grande libert´ pour d´cider ` e e e de l’emplacement des serveurs et de la r´partition des clients sur les serveurs pour e r´pondre aux besoins de l’application (par exemple pour servir un ensemble de clients e g´ographiquement proches dans une approche de type serveur de proximit´. stockage) est ´galement un point cl´ e e e pour la performance et la disponibilit´ de l’ensemble du syst`me. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Client-1 Message JMS Client-2 Message JMS Client-3 Message JMS Client Joram Client Joram Client Joram Px1 Message MOM Message MOM Px2 Message MOM Px3 Q3 Q1 Serveur Joram Q2 Serveur Joram Message MOM Serveur Joram MOM Scalagent Figure E. . C’est pourquoi Joram donne la possibilit´ e e u e de retenir ou non ces options selon les besoins. e e – Placement des objets de communications (Queues et Topics ). HTTP.serveur et pour les connexions entre serveurs : TCP/IP. SSL. ou bien e e pour respecter certaines contraintes de s´curit´). – Param`tres de qualit´ de service (persistance. Sauf dans des cas tr`s e particuliers.302ANNEXE E. de d´finir les choix de conception ` e appropri´s : e – Organisation des serveurs et clients JMS. m´moire.11 – Architecture distribu´e e la plate-forme Joram qui permet. Plusieurs protocoles de transport sont disponibles pour la connexion client . et placement des objets JMS. La fiabilit´ et la mise en e e e e e s´curit´ des communications a un coˆ t. Joram e e e e e fournit ainsi des fonctions d’administration qui permettent d’ajouter et/ou de retirer un serveur depuis un point central d’administration. La structure de la plate-forme Joram est de type e snowflake. Cette strat´gie a un impact positif sur les performances e et la disponibilit´ des clients. s´curit´). e – Evolution du syst`me et passage a l’´chelle. etc. – Protocoles de communication. on peut noter qu’il est souhaitable de rapprocher les objets Destination des clients consommateurs. Multiplier le nombre de serveurs e e pour une meilleure couverture g´ographique des clients distribu´s a un coˆ t d’exe e u ploitation (en terme de machines) qui doit ˆtre mis en balance avec la performance e et la fiabilit´ des communications pour des clients tr`s ´loign´s d’un serveur. Comme cela est illustr´ dans la figure 7.

4 Joram : fonctions avanc´es e Cette section d´crit quelques fonctions avanc´es de Joram (au sens o` elles ne sont e e u pas d´finies dans la sp´cification JMS 1.´ E. e e E. Le principe de fonctionnement du Topic a e e clust´ris´ est illustr´ dans la figure 12.1).12 – Topic ”clust´ris´” e e . Notons que cette forme de e e e e r´plication s’applique aussi bien a des serveurs fortement coupl´s (grappe de machines) e ` e qu’` des serveurs g´ographiquement distribu´s. e e e Sub Sub Sub 2b Sub Message 2c Message 3a N_3 Message Message Sub 2a Message T T 2 3 Message Message 3b N_2 T Message 1b Sub Message N_1 1 1a Pub Message Sub Figure E.4.4. e ` Le niveau de flexibilit´ de Joram est de ce point de vue un atout incontestable par rapport e aux produits concurrents. La r´partition de charge s’applique de fa¸on diff´rente aux Topics et aux files e c e de messages (Queues). E. Topic r´pliqu´ e e Un « Topic clust´ris´ » est r´pliqu´ sur plusieurs serveurs.1 R´partition de charge e L’architecture distribu´e de Joram est exploit´e pour mettre en oeuvre des m´canismes e e e de r´partition de charge avec le double objectif suivant : accroˆ e ıtre la disponibilit´ grˆce e a a la r´plication des objets de communication . optimiser le flux des messages entre les ` e serveurs. JORAM : FONCTIONS AVANCEES 303 Peu de syst`mes aujourd’hui permettent d’agir simultan´ment sur ces divers param`tres e e e et de construire ainsi la plate-forme de messagerie adapt´e a un environnement particulier.

Il est important de noter que la s´mantique des e e e e queues de message n’est pas modifi´e. nombre de requˆtes de lecture en attente. d´lai d’attente e e d´pass´ pour une requˆte en lecture. Par ailleurs. a savoir qu’un message donn´ n’est consomm´ que e ` e e par un seul client JMS). e une panne d’un serveur n’affecte que les clients connect´s a ce serveur. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE Dans cet exemple un Topic (not´ T) est r´pliqu´ sur trois serveurs N 1 . Chaque e ` e e serveur est responsable de la gestion des abonnements r´alis´s par ses propres clients. L’utilisation d’un Topic clust´ris´ est transparent du point ` e e de vue du programmeur d’application mais requiert beaucoup d’attention de la part de l’administrateur du syst`me pour ˆtre efficace. Le reste de l’applie ` cation continue a fonctionner. N2 et N3 . Plusieurs e e e exemplaires du mˆme objet Queue sont localis´s sur des serveurs ind´pendants.13 – Clustered Queue Comme dans le cas des Topic .304ANNEXE E. Serveur JORAM Clustered_Q_1 Message JMS Q Q Producteurs Serveur JORAM Message JMS Consommateurs Q Q Clustered_Q_2 Figure E. etc. Si e la charge sur une copie d´passe un certain seuil. Le e e ee seuil est un param`tre configurable qui peut prendre en compte divers crit`res tels que : e e nombre de messages en attente. chacun d’entre eux diffuse le message re¸u a ses clients locaux (flots 2i et 3j). les messages re¸us ensuite sur cette copie e c sont redirig´s vers un autre exemplaire de la mˆme queue g´r´ par un autre serveur. le concept de queue clust´ris´e permet d’am´liorer les e e e performances et le niveau de disponibilit´ sans impact sur la programmation de l’applicae tion. Chacune e e e de ces copies est accessible uniquement aux clients connect´s au serveur correspondant. e e Queue r´pliqu´e e e Le principe des « queues clust´ris´es » est un peu diff´rent (voir figure 13). . Des e e e clients JMS connect´s a ces serveurs sont supposes s’ˆtre abonn´s au Topic T. c ` La mutualisation des messages entre les nœuds permet de r´duire le trafic. Une e e application cliente sur le nœud N1 publie un message correspondant au Topic T (flot not´ e 1 dans la figure 12). Par la suite. Le nœud N1 diffuse le message a ses abonn´s locaux (flots 1a et 1b) ` e et fait suivre le message aux nœuds N 2 et N3 (flots 2 et 3).

e E.Esclave.14 – Serveur Joram HA Queues et Topics sont r´pliqu´s sur des serveurs Joram s’ex´cutant sur une grappe e e e de machine.2 Fiabilit´ et haute disponibilit´ e e Le terme fiabilit´ fait r´f´rence ici a la capacit´ de transporter un message de bout en e ee ` e bout entre un client producteur et un client consommateur malgr´ les incidents pouvant e affecter de fa¸on temporaire le r´seau et les serveurs. La fiabilit´ dans Joram est la c e e r´sultante de plusieurs m´canismes compl´mentaires : e e e – Un accus´ de r´ception entre un client JMS et son repr´sentant dans le serveur (objet e e e proxy) permet de fiabiliser la communication entre client et serveur (s´mantique « e au moins une fois »).´ E. Le sch´ma de principe du serveur Joram e ıtre e HA est repr´sent´ sur la figure 14.3 Connectivit´ ´largie ee Cette section d´crit plusieurs fonctions qui permettent d’enrichir la connectivit´ entre e e une plate-forme Joram et le monde ext´rieur. La version actuelle du serveur Joram HA utilise les m´canismes de JGroups.4. e – Enfin le bus a messages assure des ´changes fiabilis´s entre serveurs (voir 5. Le serveur maˆ ıtre ex´cute les requˆtes des clients et propage les op´rations e e e vers le serveur esclave qui r´plique le traitement localement. ` e e Pour r´pondre aux besoins de haute disponibilit´ une version sp´cifique du serveur e e e Joram (not´e Joram HA pour High Availability) a ´t´ con¸ue en suivant une approche e ee c de r´plication active en mode Maˆ . – La fonction Store and Forward r´alis´e par le proxy permet de fiabiliser les ´changes e e e entre le proxy et la destination (s´mantique « exactement une fois »). JORAM : FONCTIONS AVANCEES 305 E. les clients ´tablissent une nouvelle connexion vers le serveur esclave et continuent e leur travail sans interruption. Ce fonctionnement permet un haut niveau de continuit´ de e service au prix d’une redondance du serveur Joram. e – Passerelle JMS pour l’interop´rabilit´ avec d’autres plates-formes JMS. e e – Utilisation du protocole SOAP – Support de l’architecture de connectivit´ JCA 1. e e Serveur JORAM Matre Q1 Q Queue T Serveur JORAM HA Ta Connexion primaire Application Client Joram Topic Q1 Esclave Ta Connexion apr s reprise Serveur JORAM Figure E.2).4. En cas de panne du serveur e maˆ ıtre.5 e .4.

306ANNEXE E. Utilisation du protocole SOAP L’utilisation du protocole HTTP-SOAP fournit un moyen normalis´ pour acc´der a e e ` des services distants en ´changeant des messages XML sur des connexions HTTP.15 – Passerelle JMS Le lien entre une plate-forme Joram et une plate-forme xMQ est r´alis´ par le biais e e d’un objet destination Joram sp´cifique. L’objet « destination e passerelle » joue deux rˆles compl´mentaires : o e – En tant que destination g´r´e par Joram. – En tant que repr´sentant d’un objet destination externe. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE – Passerelles vers les protocoles SMTP et FTP Passerelle JMS La passerelle JMS permet a une application JMS g´r´e par Joram de communiquer ` ee avec une destination g´r´e par une autre plate-forme JMS (appel´e xMQ dans la figure ee e 15) de fa¸on transparente du point de vue du programmeur d’application. en particulier pour r´pondre aux besoins e suivants : – Contraintes de s´curit´ impos´es par la gestion de pare-feux. appel´ destination passerelle (qui peut ˆtre une e e e Queue ou un Topic ). e Dans certains cas il peut ˆtre utile d’utiliser ce protocole pour acc´der depuis un e e client aux services d’un serveur Joram. il re¸oit les messages produits par les ee c clients producteurs et les requˆtes des clients consommateurs g´r´s par la platee ee forme Joram. il se comporte comme un e client JMS g´r´ par la plate-forme xMQ pour propager les messages et requˆtes vers ee e la destination finale. qui est le repr´sentant de la destination finale. e e e – Prise en compte de clients s’ex´cutant dans un environnement J2ME pour lequel e l’API JMS compl`te ne peut pas ˆtre fournie (par exemple J2ME ne fournit pas de e e . c Application JORAM JMS MessageProducer MessageConsumer Client Joram Application xMQ JMS MessageProducer MessageConsumer Client xMQ Serveur JORAM Serveur xMQ Client XMQ MessageProducer JMS MessageConsumer Destination Passerelle Destination xMQ Figure E.

fournit un acc`s a e ` des clients SOAP. un objet proxy particulier.4. les t´l´phones et de fa¸on plus g´n´rale e ee c e e tous les terminaux Java). qui d´crit la mani`re d’int´grer des ressources externes dans un serveur e e e d’application J2EE. ee e e Client API JMS Client JORAM Java Object TCP Protocol Client ˙ l ger ¨ kJoram Messages Soap/XML Protocole HTTP KXML / KSoap Client API JMS Client JORAM Messages Soap/XML Protocole HTTP Apache Soap TCP-Proxy T o m cc a t Tom at Soap-Proxy T Q Serveur JORAM Serveur JORAM Serveur JORAM Figure E.org/soap ). construit comme un service SOAP.16 – Utilisation de SOAP et KJoram La disponibilit´ de KJoram ´tend les usages de la plate-forme Joram a de nouveaux e e ` domaines d’application. Sur le sere veur. Les applications J2ME s’ex´cutant sur ces ´quipements sont e e maintenant capables de coop´rer avec des applications JMS s’ex´cutant sur des serveurs e e d’applications.5 Joram est conforme aux sp´cifications de l’architecture JCA 1. d´marrage. arrˆt. Du cˆt´ client. Dans cette approche un serveur Joram est encapsul´ dans un conteneur Tomcat et agit comme une passerelle entre Tomcat et les e autres services de Joram. a e e e ´t´ adapt´e pour prendre en compte les restrictions impos´es par J2ME. appel´e KJoram. JCA 1. e L’usage du protocole SOAP dans Joram est illustr´ dans la figure 16. Le service SOAP utilis´ par Joram est la version d´velopp´e par la e e e fondation Apache (http ://ws. marqu´s en particulier par l’utilisation d’´quipements disposant e e de ressources limit´es (par exemple les PDA.apache.5 (J2EE Connector e Architecture). e e e – Gestion des connexions avec les composants EJB . Dans les e environnements J2ME.´ E. Les fonctions suivantes sont disponibles : – Gestion du cycle de vie de la ressource : cr´ation. une biblioth`que sp´cifique met en œuvre une oe e e connexion bas´e sur le protocole HTTP et des messages au format XML/SOAP. une version particuli`re de cette biblioth`que. JORAM : FONCTIONS AVANCEES 307 fonction de s´rialisation des objets).

2 a montr´ comment SOAP peut ˆtre utilis´ pour s´curiser la liaison e e e e entre clients et serveurs. C’est en particulier la voie d’int´gration clase e sique avec le serveur JOnAS (http ://jonas.3. et e e d’autre part de limiter la bande passante en ne v´hiculant que l’information pertinente. e e – Passerelle FTP : cette fonction est identique a la pr´c´dente pour le protocole FTP. Cette technologie et l’usage qui en est fait dans Joram e sont bri`vement pr´sent´s dans cette section.org). Connecteurs Joram Les connecteurs Joram offrent des passerelles pour r´aliser l’interop´rabilit´ avec des e e e applications externes en utilisant des protocols de transport normalis´s.4. La fonction est mise en oeuvre par le biais d’objets Queues et Topics sp´cialis´s pour r´aliser cette interop´rabilit´.5 Joram : bases technologiques Les propri´t´s de Joram sont une cons´quence directe de la technologie utilis´e pour ee e e la r´alisation de la plate-forme. E. E.serveur que pour les communications entre serveurs. Deux connecteurs e sont disponibles aujourd’hui : – Passerelle mail : cette fonction permet d’´mettre et recevoir des messages JMS en e utilisant le protocole SMTP. des connexions SSL afin d’authentifier les acteurs et de chiffrer ` les messages. La gestion des pare-feux pose des probl`mes particuliers. Rapprocher les traitements des sources de donn´es permet. Les serveurs Joram disposent ´galement d’un module de come munication fond´ sur HTTP pour permettre les communications entre serveurs traversant e un pare-feu. La strat´gie ree e command´e consiste a configurer les pare-feux pour autoriser l’usage des ports requis par e ` Joram.objectweb. e e e E. d’une part e e de r´partir la charge de travail sur les ressources de calcul disponibles sur le r´seau.1 Les agents distribu´s e L’exp´rience de nombreuses ann´es d’´tude des architectures r´parties nous a conduit e e e e a adopter une approche de type « intelligence distribu´e » pour la conception des appli` e cations r´parties.5. des protocoles couramment accept´s par les pare-feux (HTTP et e SOAP). ` L’utilisation de l’API JCA permet d’int´grer Joram avec tout serveur d’application e J2EE qui met en oeuvre cette sp´cification. Joram e e utilise. Cette solution s’applique autant pour les communications client . e . Ces objets sont e e e e e configur´s et install´s comme les destinations normales. Une solution alternative consiste a utiliser.308ANNEXE E. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE – Gestion transactionnelle conforme a l’interface XA. a la demande. La section 4.4 S´curit´ e e Pour s´curiser les ´changes (entre serveurs et entre un serveur et ses clients). ` e e C’est un dispositif utile lorsque les messages JMS a transporter sont de tr`s grande ` e taille. dans ` la plate-forme Joram.

e e e e – Mod`le de programmation a base d’agents communicants.5. e – Le canal est charg´ de distribuer les messages en provenance du moteur d’ex´cution e e vers les composants r´seau et vice-versa. Les bus locaux des diff´rents serveurs coop`rent pour fournir une mise en œuvre e e distribu´e d’un bus a message distribu´. dont l’organisation est repr´sent´e e e e sur la figure 17.e. e – Les composants r´seau sont responsables de l’´mission de messages provenant du e e canal a destination des serveurs distants. Le serveur comporte ´galement des flots e e d’ex´cution associ´s a la gestion des communications au sein d’un sous-syst`me appel´ le e e ` e e bus local.). provoquer la production d’´v´nements auxquels un ou e ` e e plusieurs agents vont r´agir. etc. Le contenu d’un agent est d´fini par une e e classe Java h´ritant d’une classe pr´-d´finie « agent » qui d´finit le comportement e e e e g´n´rique d’un objet agent. e e e e propri´t´ du ”tout ou rien”) et l’´tat d’un agent est persistant. et des outils de d´veloppement pr´sent´s dans la suite. strat´gie du « tout e e e e e . HTTP. ordonnancement causal. e o e Ce flot est unique et prend la forme d’une boucle qui consiste. en particulier l’atomicit´ des r´actions (i. Il existe diff´rents composants r´seau cor` e e respondant a diff´rents protocoles de communication (par exemple TCP/IP. a son tour. pour chaque notification.E. e e La structure d’accueil est configurable et fournit diff´rentes politiques de fonctionnee ment des agents h´berg´s.). Le flot ex´cute aussi le e e e ` e e code des modules de persistance et d’atomicit´. Par d´faut l’ex´cution d’une r´action est atomique (i. Ce bus a messages global permet la communication e ` e ` entre les diff´rents agents. JORAM : BASES TECHNOLOGIQUES 309 La mise en œuvre de ce principe fondateur s’appuie sur un mod`le de programmation. ee e – Environnement d’ex´cution : serveurs d’agents. Par ailleurs. Les agents se conforment a un mod`le de programmation e e ` e de type « ´v´nement-r´action ». Un ´v´nement correspond a la notification d’un e e e e e ` message typ´ qui va se traduire par l’ex´cution d’une m´thode de l’objet. a ` ex´cuter la m´thode associ´e a la r´action de l’agent destinataire.e. ` e SOAP. qu’ils soient h´berg´s par le mˆme serveur ou non. Les agents sont des objets e ` Java distribu´s communiquant par messages. Un bus local e e e e est constitu´ de deux types de composants : un « canal » et un ensemble de « composants e r´seau ». Cette e e e ex´cution peut. un e environnement d’ex´cution. etc. Serveur d agents Moteur d excution Agent Serveur d agents Moteur d excution Agent Agent SendTo SendTo React Agent React Channel TCP-IP HTTP SSL MOM distribu Channel TCP-IP HTTP SSL Figure E. il est possible d’ajouter a un composant r´seau des mo` e dules logiciels pour la mise en œuvre de propri´t´s compl´mentaires (par exemple ee e s´curit´. Les agents s’ex´cutent au sein d’une e e structure d’accueil nomm´e « serveur d’agents ».17 – Structure d’un serveur d’agents Le cœur du serveur est un moteur d’ex´cution qui contrˆle le flot d’ex´cution des agents.

changement de param`tres de s´curit´. Un e e ` serveur Joram. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE ou rien »).1. HTTP. Il est donc possible d’utiliser Joram comme environnement d’ex´cution de toute application distribu´e qui suit l’interface de programmation e e d´finie par JMS. Les services d’administration permettent. un changement d’´tat correspond e e a la compl´tion d’une r´action) Un ensemble d’op´rations d’administrations ´l´mentaires ` e e e ee permettent de cr´er et de configurer des serveurs d’agents dans un environnement Internet.). e 6 La sp´cification JMS est un ´l´ment de la sp´cification J2EE. c’est-`-dire la partie de la plate-forme Joram qui implante les objets JMS a est un serveur d’agents structur´ de la fa¸on suivante : e c – Queues et Topics sont repr´sent´s par des agents persistants. de faire ´voluer ces param`tres e e de configuration pour adapter la structure d’un syst`me Joram a de nouveaux besoins e ` (implantation d’un nouveau serveur. e e e E. e e e e – Un choix d’implantation des serveurs Joram pour d´finir une configuration dise tribu´e de type « snowflake » qui r´ponde aux besoins de l’application cible. La flexibilit´ de la plate-forme Joram b´n´ficie directement de la capacit´ de configuration e e e e des serveurs d’agents. Rappelons e ` qu’une de ses fonctions essentielles est de mettre en oeuvre la fonction Store and Forward. Notons que cette propri´t´ est « d´brayable e ee e » si elle n’est pas requise par l’application. etc. e e – Sur chaque serveur un agent ConnectionManager g`re les connexions avec les clients e JMS g´r´s par ce serveur.e.6 Conclusion Joram est un syst`me de messagerie caract´ris´ par deux propri´t´s majeures : e e e ee – Il est conforme a la sp´cification JMS1. etc. migration des Queues et des Topics . e e – Un choix d’implantation des objets (agents) Destination et des objets (agents) Proxy. en particulier pour ce qui concerne les ´l´ments suivants : ee – Le choix des protocoles de communication (TCP/IP.2 Joram : une plate-forme JMS ` base d’agents a La technologie a base d’agents distribu´s d´crite ci-dessus a ´t´ largement utilis´e pour ` e e ee e construire des syst`mes r´partis dans des domaines d’application tr`s vari´s. Cette conformit´ a ´t´ d´montr´e dans le ` e e ee e e cadre de la campagne de certification J2EE 1. e ee e .4 r´alis´e en liaison avec le serveur e e d’application JOnAS6 . SOAP. et la persistance de l’´tat des agents (i. La persistance des abonnements et des messages est mise en œuvre directement par la persistance de l’´tat des agents correspondants. par la suite.). ee – Un agent Proxy persistant est cr´´ pour chaque utilisateur reconnu par le syst`me. cet agent a la charge de g´rer la communication pour le compte des e clients JMS (producteur ou consommateur) associ´s a cet utilisateur.310ANNEXE E. e E.5. etc.) et des param`tres de QoS (persistance et garantie de d´livrance. s´curit´. La plate-forme e e e e Joram est un syst`me distribu´ particulier mis en œuvre a l’aide de cette technologie. ce qui se traduit par un gain de performance. ee e Par la suite.

– Composant de messagerie asynchrone int´gr´ dans un serveur d’application J2EE. e La figure 18 synth´tise les divers usages de Joram pour la mise en œuvre d’applications e distribu´es.org ) est la plus ace complie (administration globale unique). ´quipements industriels. – Syst`me de communication asynchrone fiable entre applications JMS s’ex´cutant e e dans des environnements Java vari´s (J2EE.). J2SE. e e e . e e L’int´gration dans le serveur JOnAS (http ://jonas. etc. Joram est ´galement utilis´ en liaison avec e e d’autres serveurs J2EE.E. e Composant de Messagerie asynchrone intgr dans un serveur J2EE Interoprabilit avec applications patrimoniales Connexion de clients lgers Coop ration entre serveurs dapplication Connexion de Client lourds Communication entre applications JMS Figure E. – La combinaison des deux usages pr´c´dents permet d’´largir le champ d’action des e e e serveurs d’application a des clients s’ex´cutant sur des dispositifs a faibles ressources ` e ` (t´l´phones mobiles. L’utilisation de Joram permet ainsi e de r´aliser des versions distribu´es du serveur d’application JOnAS. logistique.objectweb. banque. e e La plate-forme Joram est aujourd’hui en exploitation op´rationnelle dans le monde e entier pour des contextes applicatifs tr`s vari´s : sant´. e – Coop´ration entre serveurs d’application J2EE. en particulier JBoss.6. ee e – Interop´rabilit´ avec des applications patrimoniales (legacy applications). En cons´quence Joram peut ˆtre utilis´ comme base de mise en œuvre e e e d’une telle plate-forme d’int´gration.18 – Les usages de Joram Ces usages sont les suivants. Cette propri´t´ e ee permet de concevoir une plate-forme d’ex´cution adapt´e aux besoins d’une applie e cation donn´e. y compris la possibilit´ e e d’´tablir une passerelle vers des applications s’ex´cutant sur des plates-formes JMS e e externes. J2ME). transport. JMS est e e aujourd’hui le canal de communication privil´gi´ pour l’int´gration d’application e e e dans les plates-formes EAI (Enterprise Application Integration) et ESB (Enterprise Service Bus). CONCLUSION 311 – L’architecture de Joram est distribu´e et hautement configurable.

La performance est un param`tre difficile a maˆ e e ` ıtriser car il d´pend de crit`res multiples. Notons que l’ensemble de c’est l’ensemble du produit « agents + Joram » qui est est disponible en logiciel libre. peu d´taill´s. Cette nouvelle structure permettrait ´galement e de mettre en œuvre. L’objectif est d’enrichir Joram avec des fonctions de transformation de donn´es (fond´es sur une repr´sentation e e e XML) et de routage par le contenu pour r´pondre aux besoins des utilisateurs en mati`re e e d’int´gration d’applications. L’optimisation d’une plate-forme Joram rel`ve a e ` la fois de l’´volution de certains m´canismes internes (gestion de la concurrence. e e e Les travaux en cours sur Joram visent deux objectifs compl´mentaires : e – Etendre son champ d’application. en particulier dans le domaine des syst`mes eme barqu´s. ` – Am´liorer les performances et les fonctions d’administration de la plate-forme Joe ram. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE t´l´communications. Parmi les usages connus 7 on peut citer l’EDI. l’usage e d’un syst`me de gestion de base de donn´es pour g´rer la persistance des messages e e e est envisag´. consiste a d´porter une fonction store e ` e and forward dans la librairie client. etc. parmi d’autres. en r`gle g´n´rale. etc. l’int´gration de ee e donn´es. nombre de connexions. En d’autres termes on peut ` e e consid´rer que Joram constitue une personnalit´ d’un syst`me r´parti a agents qui met e e e e ` en œuvre l’API JMS. l’administration de syst`mes et d’applications r´partis. etc. ` e Un axe de travail compl´mentaire concerne l’utilisation de Joram comme moteur d’un e bus de services d’entreprise (ou ESB pour Enterprise Service Bus). sous certaines conditions. des liaisons pair a pair (peer to peer ) ` entre clients Joram sans avoir recours a un serveur tiers.312ANNEXE E. de la e e m´moire et de la persistance pour ne citer que ceux l`). ou plus simplement e ` a des changements de configuration (connexion / d´connexion d’un serveur). Une approche. e e le placement des objets de communication. etc (en e ` o particulier pour ce qui concerne la m´moire RAM et la m´moire persistante de type e e m´moire flash) . L’int´rˆt pour les composants est une r´alit´ aujourd’hui comme ee e e 7 Comme la plupart des produits diffus´s en logiciel libre. e Pour conclure. tels que volume et taille des messages. les retours connus sur les usages de Joram e sont peu nombreux et. Une piste a plus long terme concerne l’usage de m´canismes autoe ` e adaptatifs pour permettre a une plate-forme Joram de recueillir des informations ` sur son comportement afin de s’adapter « spontan´ment » a des d´faillances (autoe ` e r´paration). nombre de e e clients. et du bon dimensionnement e a de la plate-forme pour un usage d´termin´ (par exemple les ressources des serveurs. e Sur la mˆme base technologique. e e e e e . a des baisses de performance (auto-optimisation). Joram a ´t´ r´alis´ en s’appuyant sur ee e ee e e la technologie a base d’agents d´velopp´e par ScalAgent. contrˆleur industriel. e Comme cela a ´t´ expos´ dans la section 5. Cet objectif requiert de pouvoir r´aliser une version « l´g`re » du sere e e e veur Joram pour r´pondre aux contraintes de ressources de nombreuses classes e d’´quipements tels que carte a puce. Ces deux aspects sont pr´sent´s globalement dans la mesure o` ils pr´sentent e e u e des d´pendances fortes. notons que Joram est une brique d’une plate-forme technologique plus large qui vise a fournir les fondations techniques pour la construction et le d´ploiement de ` e solutions d’int´gration dans le monde Internet/Java (voir figure 19).). ScalAgent a d´velopp´ des briques d’int´gration e e e e compl´mentaires qui s’appuient sur deux technologies ´mergentes : les composants et les e e architectures logicielles. lecteur RFID. Parmi les pistes explor´es. comme indiqu´ dans la figure 19.

19 – Joram et la m´diation e Cette approche a ´t´ suivie par ScalAgent pour d´velopper une infrastructure ee e d’int´gration de donn´es d’entreprise (d´sign´e globalement sous le terme « infrastruce e e e ture de m´diation »).6. Par ailleurs les com` posants constituent des unit´s de programmation a gros grain qui facilitent la r´utilisation e ` e et la construction d’applications par assemblage (i. A e e e e l’ex´cution.NET. Cette offre regroupe les couches hautes de la figure 19 et comprend e les ´l´ments suivants : ee – un ensemble de composants de m´diation pour la collecte. le traitement et la ree mont´e d’informations d’usage produites par des ´quipements. la surveillance et la reconfiguration de l’application. Transfert vers applications (en cours) JORAM Queues. J2SE. J2ME. sans recours a un langage de pro` grammation). Cette cae e e pacit´ de construction d’applications par assemblage de composants est exploit´e par les e e approches fond´es sur les architectures logicielles. atomicit MOM calagent communication asynchrone fiable Java Virtual Machine : J2EE. Ces composants peuvent ˆtre personnalis´s et assembl´s pour e e e e e d´crire des flots de donn´es entre des ´quipements et des applications m´tiers. qui vise a simplifier et raccourcir le cycle de d´veloppement des ` e applications. La d´finition des composants. JavaCard Figure E. gestion d agents . persistance . e e La compilation d’une description ADL fournit une repr´sentation logique de l’application e distribu´e. services ou applie e cations d´localis´s.. CONCLUSION 313 le montre l’usage croissant des architectures a base d’EJB ou .e.E. d´ployer et administrer des solue RFID . Ce r´f´rentiel est ensuite exploit´ dans toutes les ´tapes du cycle de vie de e ee e e l’application pour automatiser et contrˆler les op´rations d’administration telles que le o e d´ploiement.NET. ape e e pel´ ADL (pour Architecture Description Language) qui prend la forme d’un IDL ´tendu. n’est pas encore int´gr´ dans les mod`les tels que EJB et . les composants sont mis en œuvre par des agents ex´cut´s sous le contrˆle e e e o d’un ensemble de serveurs d’agents. e B timent intelligent Telecoms Energie Solutions d intgration Moteur d ESB Transformation de donn es Routage par le contenu Applications J2EE/JMS API JMS Canevas de Mdiation Collecte de donnes. Topics API Agent Services de creation. Cet aspect. pr-traitement . de leurs e e interfaces et des leurs d´pendances fonctionnelles est d´crite dans un langage d´claratif.. – Un ensemble d’outils graphiques pour construire.

Lausanne (Switzerland). L. Luc Belissard and Vivien Qu´ma. Andr´ Freyssinet and Serge e e e Lacourte. In Proceedings of the IFIP International Conference on Distributed Systems Platforms and Open Distributed Processing (Middleware’98). Freyssinet. A. David F´liot. Documentation relative a JMS ` . e e` e E. L. France. Roland Balter.Y.org/joram/ Publications concernant les bases technologiques de Joram Vivien Qu´ma. Bellissard. May 15-17. Vion-Dury. M. Riveill and J. September 7th-10th 1998. L. Cette infrastructure de m´diation est utilis´e pour d´velopper ensuite des e e e e solutions verticales adapt´es a un usage donn´. Luc Bellissard. ACM European SIGOPS Workshop. October 20th-22th.7 R´f´rences ee Documentation en ligne sur Joram – Page d’accueil : http ://joram. F. par exemple : la facturation tel´com. 1999.objectweb. Asynchronous. Grenoble.objectweb. R. An Agent Platform for Reliable Asynchronous Distributed Programming. may 2004 Roland Balter. The Lake District (England). Lacourte. September 16th. Herrmann and S. ou encore la tracabilit´ a partir de donn´es RFID. Application-Driven Customizae tion of Message-Oriented Middleware for Consumer Devices. In the 4th ACM/IFIP/USENIX International Middleware Conference (Middleware). JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE tions d’int´gration par personnalisation et assemblage de ces composants.html – Wiki Joram : https ://wiki. Administration and Deployment Tools in a Message-Oriented Middleware. N. A Scalable and Flexible Operation e Support System for Networked Smart Objects. In Proceedings of the 2nd International Working Conference on Component Deployment (CD’2004). Symposium on Reliable Distributed Systems (SRDS’99). Joram est ´galement utilis´ comme vecteur de commue o e e nication avec les applications patrimoniales et avec un serveur d’application J2EE o` est u implant´e la logique de traitement des donn´es collect´es et remont´es par l’infrastructure e e e e de m´diation. Dynamic Reconfiguration of Agent-Based Applications.objectweb. M. Edinburgh. Riveill. la e ` e e gestion intelligente d’´nergie. September 15th-18th. 2003 Vivien Qu´ma. Architecturing and Configuring Distributed Applications with Olan. Bellissard.org – Manuel de l’utilisateur : http ://joram. David F´liot.314ANNEXE E. In Proceedings of the Workshop on Software Infrastructures for Component-Based Applications on Consumer Devices. N. De Palma. In Proceedings of the 2nd Smart Objects Conference (SOC).org/doc/index. Sintra (Portugal). Vivien Qu´ma. Ces outils e s’appuient sur une repr´sentation de type ADL. Luc Bellissard. Hierarchical and Scalable Deployment of Component-Based Applications. e Cet environnement utilise la mˆme base technologique que Joram pour g´rer la distrie e bution des donn´es et du contrˆle. 2003. Brazil. Poster session. Andr´ Freyssinet and Serge e e e Lacourte. in association with EDOC’02. Balter. Roland Balter. June 16-20. Lausanne (Suisse). Bellissard. Rio de Janeiro. Boyer. Scotland. de Palma and M. e – un service de d´ploiement pour automatiser le processus de d´ploiement d’une solue e tion d’int´gration sur un ensemble de sites. 2002. Luc Bellissard and Philippe Laumay. 1998.

7.sun.com/products/jms/ Tutorial JMS : http ://java.1 simplifies messaging with unified domains” – Les architectures applicatives JMS (dans TheServerSide) : ”JMS Application Architectures” . REFERENCES 315 – – – – – Page d’accueil JMS : http ://java.sun.html Forum JMS : http ://forum.sun.1 (dans IBM developerwork) : ”JMS 1.com/forum.jsp ?forum=29 Introduction a JMS (dans IBM developerwork) : ”Enterprise messaging with JMS” ` Nommage et administration (dans IBM developerwork) : ”Implementing vendorindependent JMS solutions” – JMS 1.com/products/jms/tutorial/index.java.´ ´ E.

316ANNEXE E. JORAM : UN INTERGICIEL DE COMMUNICATION ASYNCHRONE .

1 Introduction Cette annexe d´crit le fonctionnement et l’utilisation de Speedo. P´r´nniser les informations manipul´es par une applicaee e tion par del` son ex´cution ou les probl`mes de pannes aff´rents a son environnement a e e e ` d’ex´cution mat´riel et logiciel est une propri´t´ essentielle. Cette description s’appuie sur le mod`le de persise tance propos´ dans le cadre des sp´cifications JDO (Java Data Objects) [JSR-000012 2004. Castor 1999]. Chassande-Barrioz (version du 19 janvier 2007 . S. Le sujet de la persistance est au cœur des applications informatiques pratiquement depuis l’origine de la discipline. que ce soit des syst`mes de e fichiers ou des syst`mes de gestion de bases de donn´es.org/licenses/by-nc-nd/ 2. Dans le seul contexte du e e e langage Java. e e JSR-000243 2006].1.fr) Annexe F Speedo : un syst`me de gestion de e la persistance F. un syst`me de gese e tion de la persistance d’objets Java. JSR-000012 2004. Le e e e couplage entre l’espace m´moire li´ a l’environnement d’ex´cution d’un langage et l’espace e e` e m´moire p´renne est central dans le probl`me de la persistance. avec des abstractions loe e gicielles de plus ou moins haut niveau pour les manipuler. Les disques durs repr´sentent e e ee e le support le plus courant pour g´rer les informations p´rennes. Bersihand. plusieurs propositions ont ´t´ faites pour proposer des solutions le plus transee parente possible du point de vue du programmeur. que ce soit au travers de sp´cifications e standard [Sun JSR-000153 2003. Hibernate 2002. F. Il est utilis´ pour implanter les deux standards pr´pond´rants sur le sujet dans le cadre e e e . Enhydra 2002. e e Il se trouve que les formats des donn´es manipul´es dans les langages de programmae e tion et leur repr´sentation dans le support p´renne sont dans tous les cas diff´rents.0/fr/deed. JSR-000220 2006. mises en œuvre par Speedo. D´chamboux. Y. Le e produit Speedo [Chassande-Barrioz 2003] propos´ dans le cadre du consortium Objectweb e [ObjectWeb 1999] se situe dans cette mouvance.Intergiciel et Construction d’Applications R´parties e c 2006 P.10:31) e Licence Creative Commons (http://creativecommons. JSR-000243 2006] ou de produits sp´cifiques [Oracle 1994.1 Qu’est-ce que Speedo ? Speedo est un canevas de gestion de la persistance dans le contexte du langage Java.

la e ee e e derni`re mouture de ces sp´cifications propose un cadre de gestion de la persistance e e Java valide aussi bien pour Java de base [J2SE 2005] que pour Java pour l’entreprise [J2EE 2005]. sachant qu’` chaque changement e e a de version. e e Fonctionnellement. de gestion de remplacement des objets dans le cache. Deux versions 1 [JSR-000012 2004] et 2 [JSR-000243 2006] de la sp´cification se sont succ´d´es. Outre le support des standard JDO2 et EJB3. sachant que les ´volutions e e e e concernent soit des ajouts fonctionnels. Speedo a fait le choix d’implanter des stane dards car ils sont garants de p´rennit´ pour l’utilisateur et par l` de stabilit´ pour les soe e a e lutions fournies. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE de Java : JDO2 [JSR-000243 2006] et EJB3 [JSR-000220 2006]. l’architecture de Speedo et d’autres canevas de l’´cosyst`me technique e e s’appuie sur Fractal [Team 2003] ce qui permet d’expliciter l’architecture logicielle de l’ensemble. Il permet notamment de supporter les r´f´rences entre objets ee et la navigation a travers ces r´f´rences pour ce qui concerne le d´clenchement d’E/S. Ce standard reste fortement li´ aux bases de donn´es relationnelles. Il permet de ` e e s’adapter a diff´rents moteurs d’ex´cution de requˆtes. soit des diff´rences dans la sp´cification des e e informations de projection vers les bases de donn´es relationnelles. nous pouvons citer le gestionnaire e de concurrence. F. au nombre desquels on retrouve : – Perseus [Chassande-Barrioz and Dechamboux 2003] : c’est un canevas qui identifie diff´rents composants concourants a la mise en œuvre de syst`mes d’´change e ` e e de donn´es entre un support de stockage et une m´moire d’ex´cution d’applicae e e tion.2 Principales fonctions de Speedo Au niveau des mod`les programmatiques. Elles incluent un support de la persistance a travers les entity beans. ` Ces sp´cifications ont eu trois ´volutions majeures. et notamment amener de nouvelles politiques de gestion de la concurrence. le mod`le de programmation a ´t´ compl`tement chang´. e – MEDOR [Team 2000] : c’est un canevas qui permet de manipuler des requˆtes ene semblistes a travers des arbres combinant des op´rations alg´briques. Le mod`le de e e programmation n’est notamment pas remis en cause entre ces deux versions. Parmi ces composants.1. Il s’appuie sur un certain nombre d’autres canevas comme le montre la figure F. Speedo s’apparente aux clients lourds des bases de donn´es a objets e ` puisqu’il met en œuvre des techniques de gestion de cache ´volu´es ou encore de gestion e e de concurrence. Par ailleurs. Speedo offre des sp´cifit´s e e . L’int´rˆt est qu’il est alors possible d’adapter l’environnement Speedo pour chanee ger certains comportement. comme par exemple un mo` e e e teur SQL.1. ` ee e Par ailleurs. Ces standards ont eu des ´volutions diff´rentes : e e – JDO : l’objectif de JDO est de fournir un standard de persistance ind´pendant e des supports de stockage (c’est a dire non li´ aux seules bases de donn´es rela` e e tionnelles). et qui s’applique aussi bien dans le cadre de Java de base [J2SE 2005] que de Java pour l’entreprise [J2EE 2005]. Il d´finit aussi les liens qui r´gissent les interactions entre e e e ces diff´rents composants. etc. – EJB : les sp´cifications EJB font partie de l’environnement Java pour l’entreprise e [J2EE 2005]. prenant en compte des comportements transactionnels ou encore des contextes d’ex´cution concurrents.318 ANNEXE F. – JORM [Team 1998] : ce canevas offre un moyen de projeter des objets vers diff´rentes e structures de stockage. le syst`me de journalisation ou encore le gestionnaire d’E/S.

Speedo supporte la gestion de la concurrence directement e en m´moire au niveau des objets Java. Chargement d’objet anticip´ e Dans bien des cas. avec gestion des situations de e dead locks. notamment lorsqu’il s’agit de collection d’objets. L` aussi diff´rentes politiques sont e a e propos´es comme des politiques pessimiste ou optimiste. INTRODUCTION 319 Figure F. S’il n’y e e ` e ea est pas. il peut ˆtre int´ressant de ramener les objets qui vont ˆtre instanci´s e e e e en m´moire. Cela a l’avantage de permettre a e e ` d’autres applications n’utilisant pas Speedo d’acc´der a la base de donn´es en coh´rence e ` e e avec les applications Speedo. Si cette contrainte est lev´e.1. traverser une e collection d’objets implique de ramener en m´moire des objets r´pr´sentant une collection e e e . on v´rifie qu’il n’y est pas d´j`. e Pour la gestion de l’encombrement m´moire par le cache global. Speedo supporte e diff´rentes politiques de remplacement telles que LRU (Least Recently Used). ce qui permet d’´viter nombre d’acc`s inutiles a e e e ` la base de donn´es pour effectuer des prises de verrou. Lorsqu’un e nouvel objet doit ˆtre attach´ a un tel contexte.F. Par ailleurs.1 – D´composition fonctionnelle de Speedo e qui ne mettent pas en cause la portabilit´ des applications et qui sont autant d’atouts e vis-`-vis d’autres solutions ou produits de persistance ´quivalents. a e Gestion des caches Speedo propose deux niveaux de gestion de cache. e Gestion de la concurrence Les solutioons de persistance actuelles d´l`guent la gestion de la concurrence d’acc`s ee e au syst`me de gestion de base de donn´es sous-jacent. En. e il est possible d’implanter de nouvelles politiques si n´cessaire. Le fait de recycler les objets d’un contexte e e a un autre permet d’all´ger la charge d’ex´cution li´e a la cr´ation/destruction d’objets ` e e e ` e (all´gement de la charge du ramasse-miettes). C’est un cache global qui contient e les objets Java persistants pr´sents en m´moire. Il g`re dans un premier temps e l’ensemble des objets actifs dans le contexte d’ex´cution d’une transaction. un deuxi`me niveau de cache est mis en œuvre. effet.

un SGBDR. Face aux e retours des utilisateurs et aux ´volutions de la sp´cification EJB (2. persist anywhere (coder une fois. peut recevoir une interface JDO.1. F. puis e e e d’instancier chaque objet de cette collection. e Plusieurs solutions commerciales ou open source sont apparues tr`s rapidement.x puis la prochaine e e 3. Ambitieux. persister n’ime porte o` ). R´ciproquement.2 – Position de JDO dans l’architecture d’application JDO est une sp´cification qui d´finit un mod`le de programmation transparent pour la e e e persistance d’objets Java vers un syst`me de stockage potentiellement transactionnel. l’objectif e de cette sp´cification est write once. Dans le e ` e mˆme temps. ou la collection r´sultant d’une requˆte ensembliste. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE (cas de relations multi-valu´es).4 Restrictions actuelles Organisation du cours Speedo Ce cours d´crit la mise en œuvre de Speedo a travers sa personnalit´ JDO. Figure F. e e Speedo permet de remonter les objets de la collection en mˆme temps. a travaill´ sur l’´volution de la e e e sp´cification JDO. un groupe d’experts travaillant sur la probl´matique de persistance des obe jets Java a d´cid´ d’apporter l’ensemble de ses travaux a SUN. Les e produits JDO sont donc des outils intergiciels de projection d’objets langage vers diverses structures de stockage. de simples fichiers. dans le cadre du JSR 12 e e ` ([JSR-000012 2004]) : sp´cifications dites Java Data Objects (JDO). Les avantages de JDO sont les suivants : .2 Gestion d’objets persistants avec JDO : les principes En 1999. Cela n´cessite n + 1 requˆtes vers la base.0 apporte son lot de nouvelles fonctions et de e standardisation.0). dans le cadre du JSR 243. il couvre aussi une description du standard JDO lui-mˆme. n’importe quel support de stockage. une application d´velopp´e dans un cadre JDO peut pere e e sister sans aucune modification sur tout support de persistance dot´ d’une interface JDO. L’impact de cette approche sur les e performances est donc majeur. le mˆme groupe d’experts. un SGBDO.3 F. en particulier la projection objet/relationnel (O/R dans la suite). Cette nouvelle version 2.1. Ce standard con¸u a l’origine par des ´diteurs de bases de donn´es a objets u c ` e e ` se transforme en une solution de persistance universelle pour Java. ce qui ne n´cessite e e plus qu’une requˆte vers la base au lieu des n + 1.320 ANNEXE F. En effet. e e F.

d’assurer la persistance aussi bien dans un SGBDR que dans un e SGBDO. Il le fait soit explicitement grˆce a la fonction makePersistent a ` de l’API JDO. java. une solution JDO est un canevas logiciel qui prend en charge la persistance des objets applicatifs n´cessitant cette propri´t´.Byte. byte[] et char[]. Pratiquement toutes les classes java e peuvent ˆtre trait´es afin que leurs instances puissent persister. java. – R´duction des temps de d´veloppement : en effet tout le code d´di´ a la gestion de e e e e` la structure de stockage. En effet.2. short. Nous pouvons les ree e grouper suivant diff´rentes cat´gories : e e – Types primitifs : il s’agit de boolean. le principe de JDO est d’ajouter le code n´cessaire au support de la persistance dans la classe en question (cette phase e est aussi appel´e phase d’enhancement en anglais). java. java.1 Classes et objets persistants Les objets persistants sont des objets Java comme les autres. des collections.lang. Cet identifiant permet donc e de faire le lien entre l’objet Java pr´sent en m´moire sa projection dans la structure de e e stockage sous-jacente. e e – Persistance universelle : JDBC est limit´e au SGBDR.Character.Boolean. e ee F. double.lang.lang. etc. etc). au e d´ploiement.lang.lang. N´anmoins. e e L’unit´ de persistance est donc l’objet d’une classe persistante. L’identifiant peut ˆtre bas´ sur des champs de la classe ou calcul´ e e e par ailleurs (par la solution JDO. int. java. – Persistance transparente : permet d’avoir des objets m´tiers compl`tement e e ind´pendants de la structure de stockage (par exemple. byte. L’instant de synchronisation d´pend e e du contexte d’ex´cution : par exemple. – Types ”objet” simples : il s’agit des classes Java java. composant ainsi l’´tat de cet objet persistant. java.String. qui repr´sente un effort non n´gligeable (´valu´e a 40% de e e e e ` l’effort de d´veloppement par certaines ´tudes).Short.lang.2. long.math.Integer.lang. e Comme le montre la figure F. e – JDO est disponible sur toutes versions de Java : J2SE.BigDecimal. Rendre un objet persistant signifie que l’ensemble des variables ou des champs d´sign´s e e comme persistants.lang.Number. en architecture client/serveur ou multi ´tages. JDO est capable. J2ME et J2EE. par le support de stockage. java.Float. float. e e e ` JDO d´finit les types de champs qui peuvent ˆtre persistants. java. GESTION D’OBJETS PERSISTANTS AVEC JDO : LES PRINCIPES 321 – Mod´lisation objet sans contraintes : supporte de l’h´ritage. Simplement.lang. soit implicitement par rattachement a un objet d´j` persistant. .lang. les modifications effectu´es dans un contexte trane e sactionnel sont g´n´ralement propag´es a la validation de la transaction. est prise en charge par JDO.Double. ` ea Une instance persistante est toujours identifi´e de mani`re unique par un identifiant e e permettant de d´signer l’objet dans la structure de stockage. char.F. la persise e tance d’un tel objet n’est pas li´ a sa classe. est enregistr´ sur le e e support de stockage. des fichiers plats ou au format XML. le programmeur doit indiquer les classes de son application qui peuvent produire des objets persistants : nous les appelons classes persistantes. D`s lors qu’une de ces variables est modifi´e en m´moire. java.Long.2. un syst`me de type CICS. java. C’est le programmeur qui d´cide du moment o` e` e u un objet devient persistant. cette moe e e dification est propag´e vers le support de stockage. pas de d´pendance vers e e les APIs JDBC). des e e interfaces.

util.HashSet.util. Stearns 2000b].util. java.Vector.sql.TreeMap.util. java. Typiquement.Collection.util. java. java.util. java. Cela signifie que ces objets e e sont soumis aux mˆmes contraintes de r´entrance que n’importe quel objet Java.Properties.util.sql.util. Speedo met en œuvre le patron ´tat (en anglais state pattern) e [Gamma et al. java.2 D´clinaison Speedo des principes JDO e L’implantation JDO de Speedo garantit le niveau de transparence le plus ´lev´ mˆme si e e e cela n’est pas requis par la sp´cification.HashMap. e F.util. – Types ”objet” persistants : les r´f´rences vers des objets persistants peuvent aussi ee ˆtre persistantes. B.3 – D´couplage objet persistant/´tat e e Les diff´rents modes possibles de synchronisation avec le support de stockage (les e modes transactionnels n´cessitent de g´rer l’isolation de contextes) font qu’il est n´cessaire e e e dans certains cas de pouvoir g´rer en m´moire plusieurs r´plicas de l’´tat d’un objet e e e e persistant. la transparence propos´e par JDO est telle qu’il n’est pas n´cessaire d’utiliser e e des m´thodes d’acc`s du type getXxxx/setXxxx permettant de manipuler le champ xxxx e e (mˆme patron que celui propos´ par les JavaBeans [B. java. Speedo garantit qu’il y a une seul objet e Java repr´sentant un objet persistant en m´moire. Elles sont d´finies par les champs dont les types sont soit des classes e e persistantes. e e Enfin. dans un environnement e e multi-programm´ (plusieurs contexte d’ex´cution ou threads se d´roulant en parall`le).BigInteger.util.sql.322 ANNEXE F.HashTable et java. e e e e tous ces contextes d’ex´cution partagent les mˆmes objets.LinkedList. java. java.2.Map.util.List. java.Date. Stearns 2000a.math. e e ces classes ou ces interfaces sont sp´cifi´es par le programmeur. En effet. java. Pour cela. e e Ce type de patron est en effet impos´ dans d’autres solutions comme EJB2 ou Hibernate. e e Figure F.Time et java. Comme nous l’avons pr´cis´ auparavant. java. 1994].util.util. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE java. java.Date.Locales.util. les champs d’un objet persistant ´tant alors g´r´s en m´moire dans e ee e .ArrayList.Set.Timestamp – Types ”objet” multivalu´s : il s’agit des classes ou interfaces Java e java. soit des interfaces persistantes. java.

jdo). Apr`s cette op´ration les classes ainsi transform´es peuvent ˆtre utilis´es e e e e e dans une application JDO ou dans une application n’utilisant pas JDO. La premi`re ´tape est la compilation des sources e e en byte code Java (g´n´ration des . sachant que cette approche de mise en œuvre de JDO n’est pas e impos´e par la sp´cification. La deuxi`me ´tape est l’enhancement.class e e subit des transformations d´pendant de sa persistance d´crite dans un descripteur JDO e e (fichier .3.4 repr´sente les diff´rents ´l´ments de la chaine de production de proe e ee grammes. Evidemment. Elle d´taille aussi les diff´rentes ´tapes du processus de production de programme e e e Speedo. e ee Celui-ci s’utilise via une tˆche Ant (cf. et plus particuli`rement la solution e Speedo.java) et les ee descripteurs de persistance JDO (. Les ´l´ments initiaux de cette chaine sont les fichiers sources (. il e ` est important de comprendre le processus d’enhancement propos´ par Speedo et d’autres e impl´mentation JDO.org/).3. e e Principe de l’enhancement JDO permet d’utiliser des classes Java et de rendre leurs instances persistantes. Speedo a son propre enhancer. sauf dans la phase de mise au point de programme o` le programmeur a acc`s aux champs persistant indirectement u e dans l’objet qu’il a d´fini : il lui faut les chercher dans l’objet state r´f´renc´ par son objet e ee e persistant. certaines politiques de concurrence sont incompatibles avec le processus de mise au point (pas de r´f´rence vers l’objet ´tat) : c’est le cas de la politique optimiste ee e g´r´e en m´moire par Speedo. http ://ant.apache. le fichier . CHAINE DE PRODUCTION DE PROGRAMME 323 un autre objet repr´sentant cet ´tat comme le montre la figure F. Enfin.jdo). Cependant l’ajout de la propri´t´ de persistance a une classe n´cessite de lui appliquer un ee ` e traitement post compilation appel´e enhancement. Toute compilation (initiale ou recompilation suite a une modification des sources) ` des classes a rendre persistantes n´cessite de lancer l’enhancer (programme modifiant ` e les classes pour prendre en compte la persistance). F.F.1 Phases de la production de programme Avant de s’int´resser a la chaine de production de programme dans son ensemble.3. ces choix d’architecture sont globalement transparents pour le programmeur. Cette e e e e .class). a El´ments de la chaine de production de programmes e La figure F. Afin d’obtenir de meilleures performances e ` et offrir un mod`le de programmation plus int´r´ssant. L’´tape d’enhancement peut ˆtre stane e dard ou particuli`re a une implantation JDO. Cette d´marche pere e e met a Speedo de mettre en œuvre des politiques de concurrence en m´moire ind´pendantes ` e e de celles fournies par le support de stockage sous-jacent.3 Chaine de production de programme Cette section a pour objectif de montrer quels sont les ´l´ments qui interviennent dans ee la chaine de production de programmes utilisant JDO. Lors de cette ´tape. ee e F.

class Enhancement . La g´n´ration e ` e e e de code est assur´e par deux techniques : la g´n´ration de source Java via Velocity (cf.java . 2002].org/velocity/index. Durant cette ´tape. La g´n´ration de byte code Java directe se prˆte e e e difficilement a la g´n´ration de classes longues et complexes. il faut d’abord la d´finir avant de l’utiliser.class .324 ANNEXE F.3. La d´finition d’une tˆche a e e a Ant se fait en utilisant la tˆche taskdef.apache. e e e http ://jakarta. Ci dessous. Ce choix est motiv´ par l’objectif de performance.2 Utilisation de Ant Speedo fournit une tˆche Ant pour le le lancement de l’enhancement.html) et la g´n´ration de byte code Java direce e tement via ASM [Bruneton et al.jdo Figure F. Comme pour a toute tˆche Ant. e e ee e Compilation . les classes persistantes e e e e sont modif´es et de nouvelles classes sont g´n´r´es par Speedo afin de g´rer la persistance.4 – Chaine de production de programmes Speedo La strat´gie de Speedo est de g´n´rer au moment de la compilation tout le code e e e n´cessaire a la persistance. un exemple de target d’initalisation a d´finissant les tˆches Speedo : e a . ` e e F. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE ´tape est r´alis´e par l’enhancer de Speedo.

java"/> </javac> <!-.jar"/> </fileset> </path> <taskdef resource="speedo-jdo.Repertoire de la distribution Speedo --> <property name="speedoDist" value="${basedir}/.tasks" classpathref="classpath"/> </target> . La sortie produite par l’enhancer Speedo est g´n´ralement de la forme suivante : e e .3.repertoire contenant les sources des classes persistantes --> <property name="src" value="${basedir}/src"/> <!-.repertoire ou sont mis les classes compil´es ou enhanc´es --> e e <property name="build" value="${basedir}/build"/> <!-./speedo"/> <!-.enhancement --> <speedo-jdo src="${src}" output="${build}" /> </target> .F.jar"/> <include name="lib/log/log4j..compilation --> <javac srcdir="${src}" destdir="${build}" debug="on"> <classpath refid="classpath"/> <include name="**/*.definition d’un classpath --> <path id="classpath"> <pathelement location="${build}"/> <pathelement location="${speedoDist}/etc"/> <fileset dir="${speedoDist}"> <include name="speedo-jdo. Le lancement de l’enhancer est fait imm´diatement apr`s la compilation en appelant e e la tˆche speedo-jdo : a <target="compile" depends="init"> <mkdir dir="${build}"/> <!-. CHAINE DE PRODUCTION DE PROGRAMME 325 <target="init"> <!-.

. F.1 Ex´cuter un programme utilisant Speedo e Avant de commencer a programmer des objets Java persistant. il peut ˆtre n´cessaire de e e e e gonfler la m´moire allou´e au processus Ant l’ex´cutant (probl`me de Out of memory a e e e e ` l’enhancement).. [speedo-jdo] [INFO] Generating Jorm files. [speedo-jdo] [INFO] Enhancing Persistent aware classes. Pour cela. e la m´moire mise a disposition de la tˆche Ant est de 130 Mo.. [speedo-jdo] [INFO] Auto O/R Mapping. Dans ce cas.4.326 ANNEXE F.....objectweb.. [speedo-jdo] [INFO] Building Jorm Meta Information.org. On peut augmenter ce chiffre e ` a suivant le besoin.4 Programmation d’objets Java persistants Cette section fait le tour des fonctions qui permettent de g´rer des objets Java pere sistants grˆce a JDO. e F. ee Ensuite. e ` Installation de Speedo Pour pouvoir utiliser Speedo. [speedo-jdo] [INFO] Completing the meta data. la premi`re ´tape est de r´cup´rer le logiciel. il faut d´finir ou modifier la variable d’environnement ANT OPTS e pour qu’elle contienne les param`tres suivant : -Xms130m -Xmx130m -Xss256k... ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE {prompt} ant compile init: compile: [mkdir] Created dir: /usr/local/home/developper/workspace/speedo/output/test /jdo [javac] Compiling 94 source files to /usr/local/home/developper/workspace/sp eedo/output/test/jdo [speedo-jdo] [INFO] Computing classes requiring enhancement . [speedo-jdo] [INFO] Generating Speedo files. [speedo-jdo] [INFO] Compiling Java files. nous montrons comment ` installer Speedo et ex´cuter un programme JDO a l’aide de Speedo. Pour e e e e t´l´charger le logiciel...... il faut aller sur le site Web de Speedo : http ://speedo. [speedo-jdo] [INFO] Enhancing Persistent classes... Elle s’attache notamment a voir de quelle mani`re le mod`le de a ` ` e e programmation Java est impact´ lorsqu’on ajoute le support de la persistance.. Le proe e cessus d’enhancement Speedo ´tant gourmand en m´moire. [speedo-jdo] [INFO] All Done in 8s 282ms BUILD SUCCESSFUL Total time: 34 seconds {prompt} Cette trace montre notamment les diff´rentes ´tapes de l’enhancer Speedo. [speedo-jdo] [INFO] Serializing Meta Info... il faut naviguer par le lien download du menu Project Links pr´sent sur la gauche e .

e Il faut ensuite d´compresser le fichier t´l´charg´ dans un r´pertoire d’installation (nous e ee e e l’appelerons /root). on peut ` ee choisir la livraison binaire Speedo-jdo 1. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 327 de la page du site.5 – Distribution Speedo pour JDO A partir de cette arborescence.F. Cliquer ensuite sur la livraison a t´l´charger. Le pr´-requis est que ant (cf. Figure F. En se pla¸ant dans ce r´pertoire. Attention.4.4.org) soit install´ : e e .apache. Par exemple.5 avec la structure pr´sent´ dans la figure F.5 bin. nous lan¸ons la construction de c e c ces librairies. Nous obtenons un r´pertoire nomm´ e ` ` e e e e e /root/Speedo-jdo 1. http ://ant.5.zip de la personalit´ JDO de Speedo. on va pouvoir construire la librairie compl`te permete tant d’utiliser Speedo.4. nous utilisons le format de nommage Unix pour d´signer e des chemins d’acc`s a des fichiers ou a des r´pertoires.

5/speedo-jdo_fo r_jonas_ra.jar] Building zip: /root/Speedo-jdo_1.jar est n´cessaire.5.jar archives-speedo-jdo_client. plusieurs int´grations de Speedo sont possibles. le e e .jar] Building zip: /root/Speedo-jdo_1.5/speedo-jdo_ra.4. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE {prompt} cd /root/Speedo-jdo_1. Il est possible e de modifier le fichier correspondant dans l’arborescence de la figure F.jar: [speedo-jdo. section F.rar archives-weblogic: [speedo-jdo_for_weblogic_ra.4.rar] Building jar: /root/Speedo-jdo_1.5/etc. Elle contient un fichier de configuration par d´faut e e qui est probablement non op´rationnel pour l’utilisateur de Speedo. Les librairies g´n´r´es se e e ` e e ee retrouvent dans le r´pertoire /root/Speedo-jdo 1. Dans tous les cas.jar] Building zip: /root/Speedo-jdo_1.4.rar] Building jar: /root/Speedo-jdo_1.5/speedo-jdo_fo r_jonas_ra.jar [speedo-jdo_for_jonas_ra.4.xml archives: archives-speedo-jdo.5/speedo-jdo.jar: [speedo-jdo.rar] Building zip: /root/Speedo-jdo_1. Il s’agit du fichier speedo-jdo. seule la librairie speedo-jdo.5.4.jar archives-speedo-jdo_light.rar BUILD SUCCESSFUL Total time: 36 seconds {prompt} Cela permet de construire les libariries permettant d’utiliser Speedo. e Librairies n´cessaires a l’ex´cution d’une application Speedo e ` e Suivant l’environnement d’ex´cution dans lequel Speedo est utilis´.rar] Building jar: /root/Speedo-jdo_1.4. diff´rentes librairies e e e sont propos´es.4.4.4.4.1).5 {prompt} ant Buildfile: build.rar: [speedo_ra. e – L’environnement Java pour entreprise (J2EE) : dans cet environnement.5/speedo-jdo _for_weblogic_ra.jar: [speedo_client. principalement deux environnements sont consid´r´s : e ee – L’environnement Java de base (J2SE) : dans cet environnement.properties du r´pertoire /root/Speedo-jdo 1.5/speedo-jdo_client. il s’agit d’int´gration sous la e e forme de connecteur JCA. En fait.5/speedo-jdo_light.4.jar archives-speedo-jdo_ra. Ces librairies contienent des fichiers de configuration correspondant a des configurations par d´faut ` e d´di´es a l’environnement d’ex´cution cible (cf.328 ANNEXE F.rar archives-jonas: [speedo-jdo_for_jonas_ra. La mani`re standard est d’int´grer tout le code Speedo.

il est possible e de lancer une application.4.F. les fichiers de confie e a guration peuvent ˆtre modifi´s dans l’arborescence avant cr´ation des librairies. ainsi que l’URL de connexion. et qui a une repr´sentation dans un support de stockage. ` e e ` Le fichier est dument comment´ et les valeurs propos´es par d´faut permettent a Speedo e e e ` de fonctionner tout a fait correctement sans autres modifications. C’est g´n´ralement un acc`s a travers JDBC. Il est utilis´ dans les deux contextes d’ex´cution d´crits pr´c´demment.AppCla ss Cette commande permet d’activer l’application Java dont le point d’entr´e est d´fini e e par la classe com. ` Dans le cas d’un contexte d’ex´cution Java standard. Il permettent principalement de d´finir le nom JNDI e sous lequel le connecteur Speedo est enregistr´ dans le serveur correspondant.AppClass.4.1. On suppose que le code de cette application est accessible par le chemin d´fini par app path.xml dans le r´pertoire e /root/Speedo-jdo 1. Il e e e s’agit respectivement des fichiers jonas-ra. Lancer une application Une fois les librairies disponibles et les fichiers de configuration d´finis. F.properties.4. le nom et le mot de e passe de l’utilisateur permettant d’acc´der a la base. ` e Etant donn´ qu’il est difficile d’utiliser l’adresse de l’objet Java en m´moire pour d´signer e e e son r´pr´sentant de l’espace de stockage.org. C’est ce que propose le fichier speedo-jdo ra. ainsi que tous les fichiers de configuration dans une archive .org. {prompt} java -cp app_path:/root/Speedo-jdo_1. e e Les autres modes d’int´gration ne sont pas d´crits ici.4. Il peut s’agir d’un r´pertoire ou d’une autre archive e e Java.jar com. il est n´cessaire de configurer e e l’acc`s a la base de donn´es.5/speedo-jdo. L` encore. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 329 code du connecteur JCA Speedo.rar. e Le fichier de configuration de Speedo Le fichier de configuration de Speedo pour JDO s’appelle speedo-jdo. Les deux principales diff´rences e e e . qui requi`rt e ` e e e e ` e de sp´cifier la classe du pilote JDBC.5/etc. Deux fie chiers sp´cifiques sont propos´s : un pour Jonas et l’autre pour Weblogic de BEA. la notion d’identifiant est introduite pour d´signer e e e de mani`re unique le repr´sentant de l’espace de stockage. Ce fichier contient notamment un fichier de configuration sp´cifique au serveur d’application. il s’agit a la fois d’options standard propos´es par JDO et d’options sp´cifiques a Speedo. mˆme si toutes les e e e e e e informations de configuration ne sont pas communes.2 Utiliser le syst`me de persistance JDO e Comme pr´sent´ dans la section F.rar. Pour les informations communes. un objet persistant est un objet Java appare e tenant a une classe persistante.2. e ` Il est bien sˆ r possible de g´rer le fichier de configuration a l’ext´rieur de la librairie. u e ` e Il suffit que le fichier soit accessible avant celui de la librairie au niveau du classpath de l’application.xml et weblogic-ra.

un r´pertoire de stockage de fichiers xml. il s’agit de programmation Java standard. C’est le PM qui permet d’efee e ` fectuer l’essentiel des actions sur les instances de classes persistantes (par exemple. r´cup´rer. Elle est fournie par l’impl´mentation JDO. Les PMs sont g´r´s par et attach´s a une PMF. R´cup´ration d’une PMF e e La fa¸on de r´cup´rer une PMF d´pend du cadre d’utilisation du pilote JDO. la sp´cification JDO d´finit deux concepts ` e e importants : – La PersistenceManagerFactory (PMF dans la suite) : elle repr´sente l’espace e de stockage dans lequel les objets Java persistants sont projet´s (par exemple e une base de donn´es relationnelle. Dans c e e e un serveur d’application J2EE et si le driver JDO est install´ comme un resource adapter e (cf. effacer ou d´tacher des instances).jdo.7. il est e n´cessaire qu’un PM soit ouvert. e Pour la connexion a l’espace de stockage. En effet pour le manipuler. e e etc). ce qui permet au thread dans lequel le PM a e ´t´ ouvert de s’ex´cuter dans un contexte de persistance. e e e – Le PersistenceManager (PM dans la suite) : il repr´sente une connexion avec le e syst`me de persistance. sp´cification JCA) alors la PMF est r´cup´r´e par l’application en utilisant le service e e ee JNDI.jdo. e Lorsqu’on veut transf´rer des donn´es d’un espace de stockage vers un autre il faut e e r´cup´rer une PMF diff´rente pour chacun d’eux. les deux e e interfaces des PMFs et des PMs correspondent aux principales APIs que doit commaitre et maitriser le programmeur. il faut se r´f´rer au chapitre F. Cette connexion permet au syst`me de e e persistance (le pilote JDO.330 ANNEXE F.PersistenceManager. Pour le reste. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE entre une instance persistante et une instance non persistante sont la possession d’un identifiant et la connectivit´ a la solution JDO.PersistenceManagerFactory. L’obe e e jet Java est alors dit connect´ au syst`me de stockage. fournie par l’impl´mentation e JDO. Ainsi pour manipuler des instances persistantes. en l’occurence Speedo) de fournir des donn´es a jour. au niveau du mod`le de programmation de la persistance. Une PMF est une instance d’un objet Java impl´mentant l’interface e javax. Un PM est une instance ee e implantant l’interface javax. e` L’identifiant permet de construire la liaison entre l’objet Java persistant et son repr´sentant. autorisant ainsi les ´changes de donn´es (E/S) entre les deux espaces. e e e Pour r´sumer. Pour plus de d´tails sur l’int´gration J2EE / JDO. e e ee Dans une application Java standard. de g´rer e ` e la concurrence d’acc`s et de synchroniser les modifications avec le support de stockage. la classe JDOHelper (incluse dans les APIs JDO) doit ˆtre utilis´e comme dans l’exemple suivant : e e . une e e connexion vers le syst`me de persistance est requise. rendre persistant. pratiquement sans contrainte.

.load(is). Le principe de r´cup´ration d’une PMF consiste a demander au JDOHelper une PMF e e ` correspondant a des caract´ristiques pr´cises d´finies par un ensemble de propri´t´s. le PM mobilise g´n´ralement des ressources physiques ou des ressources crie e tiques qui. e e e ..getPersistenceManager()..isClosed()) { pm. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 331 import javax.PersistenceManagerFactory. ClassLoader cl = getClass().) { . if (is == null) { throw MyException("fichier de configuration introuvable").close().F. } p.getPersistenceManagerFactory(p). try { .getResourceAsStream("myJdoConf. InputStream is = cl. Cependant. } catch (.. } } . Properties p = new Properties(). PersistenceManagerFactory pmf = JDOHelper...).JDOHelper.4.PersistenceManager. Il est donc important que les PMs soient lib´r´s. les propri´t´s sont d´finies dans un fichier de configuration ee e myJdoConf. La fermeture d’un PM se fait en ee appelant la m´thode close. Cela implique que plusieurs appels au JDOHelper avec le mˆme ene semble de propri´t´s retournent la mˆme PMF.jdo.. u Cycle de vie des PM Un PM est r´cup´r´ de mani`re tr`s simple en utilisant une usine PMF : e ee e e import javax. En effet.properties qui est charg´ via le classpath. Tout PM r´cup´r´ doit absolument ˆtre ferm´ apr`s utilisation et ceci quels que soient e ee e e e les ´v´nements survenus au cours de l’ex´cution (exceptions. e . de fa¸on a miniee ` e c ` miser la mise en œuvre de ce processus coˆ teux.properties"). si elles ne sont pas lib´r´es.getClassLoader(). en utilisant du classloader courant. annulation de transaction.. L’exemple pr´c´dent illustre le type de s´quence de code e e e e permettant de lib´rer les ressources dans tous les cas.jdo.. e Le JDOHelper maintient les associations entre les propri´t´s d´finies et la r´f´rence vers la ee e ee PMF correspondante. sont une source d’ennuis majeurs pour la suite de ee l’ex´cution de l’application (c’est une des sources majeure de probl`me lorsqu’on utilise e e JDO). il est conseill´ au d´veloppeur ee e e e de conserver dans son application la r´f´rence a la ou les PMFs utilis´es. PersistenceManager pm = pmf. import javax.jdo. } finally { if (pm != null && !pm. . ` e e e ee Dans l’exemple ci-dessus. .. ..

est la classe identifiant associ´e a la classe persistante Client. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE F. public String prenom. la classe ClientId. Chacun des champs persistants utilis´s dans l’identifiant doit par ailleurs ˆtre marqu´ comme primary-key : e e e <class name="Client" identity-type="application" objectid-class="ClientId"> <field name="nom" primary-key="true"/> <field name="prenom" primary-key="true"/> </class> . Elle doit ˆtre e e e e compos´e du mˆme ou des mˆmes champs de la classe persistante composant l’identifiant. il n’est pas n´cessaire de sp´cifier la classe d’idena e e tifiant associ´e a la classe persistante car elle est d´duite par le type du champ marqu´ e ` e e unique comme primary-key : . les champs doivent ˆtre d´clar´s public. a La cat´gorie est choisie dans le descripteur de persistance JDO qui sp´cifie pour chaque e e classe persistante la cat´gorie d’identifiant choisie. Dans ce cas l`.. Les formats e e d’identifiant support´s par JDO sont divis´s en deux grandes cat´gories : e e e – Identifiant applicatif : Cette premi`re cat´gorie contient tous les formats d’identie e fiant dont les valeurs sont fournies par l’application elle-mˆme. Ces identifiant sont e donc compos´s de donn´es persistantes de l’objet dont les valeurs sont effectivement e e d´finies par l’application. Lorsque l’identifiant d’une classe persistante est compos´ d’un seul champ applicatif. e JDO propose une simplification au d´veloppeur en fournissant des classes pr´ ´crites pour e ee certains types de champ. Collection<Compte> comptes. String prenom. . e e Dans l’exemple suivant. } class ClientId { public String nom. e – Identifiant syst`me : Cette deuxi`me cat´gorie contient tous les formats d’identie e e fiants dont les valeurs sont ind´pendantes des donn´es applicatives. e Identifiant applicatif Pour un identifiant applicatif. } . Il est clair qu’on retrouve e ` les mˆmes champs dans les deux classes associ´es.4. String adresse. Les champs composant e e e l’identifiant peuvent ˆtre automatiquement calcul´s (cf.4. section F.. Elles sont donc e e d´finies soit par l’impl´mentation JDO soit par le support de stockage. le nom de la classe d’identifiant associ´e est sp´cifi´ par e e e l’attribut objectid-class au niveau de la balise de la classe. e e e Dans la classe identifiant. Agence agence.3).332 ANNEXE F. contenant les champs public nom et prenom. une classe sp´cifique doit ˆtre d´finie. e e class Client { String nom.3 Identifiants d’objet persistant L’identifiant d’un objet persistant permet de le d´signer de mani`re unique. Dans le descripteur JDO. de mani`re e e e transparente vis-`-vis du code de l’application.

long ou e tout type objet. – Si la classe A est abstraite.F. e Les classes d´finies par le d´veloppeur et servant d’identifiant pour une classe persise e tante sont soumises a un certain nombre de contraintes : ` – Un constructeur public sans argument est obligatoire. B et C telles que B et C sont des sous classes de A et AId est la classe d’identifiant de A : – Si A est concr`te alors B et C doivent utiliser AId comme classe d’identifiant.jdo. Dans la classe d’identifiant ces champs doivent ˆtre public.jdo. ` – Les m´thodes equals et hascode doivent ˆtre impl´ment´es en utilisant les champs e e e e de l’identifiant. e – Pour les classes persistantes avec h´ritage. public StringIdentity(Class pcClass. Le r´sultat de cette m´thode e e e toString doit pouvoir ˆtre donn´ au constructeur avec le param`tre String d´crit e e e e pr´c´demment. Cepene dant. certaines impl´mentations conseillent d’utiliser des classes BId et CId pour e respectivement les classes B et C o` BId et CId sont des sous classes de AId ne u contenant pas de nouveaux champs. Le type de l’unique champ peut ˆtre : byte. prenons 3 classes persistantes A. } . short.identity. c’est a dire BId ou CId. e e – Les champs composant l’identifiant doivent ˆtre d´finis de la mˆme mani`re dans e e e e la classe persistante et dans la classe d’identifiant. int. Le param`tre de type String est le r´sultat de la m´thode toString et doit permettre de e e e reconstituer un identifiant a partir de sa forme String.identity.identity.4. .jdo. e e e e Par exemple. et B et C sont concr`tes.StringIdentity car le champ unique composant l’identifiant est de type String. Dans cette exemple la classe servant d’identifiant est la classe javax. Cependant. Voici la d´finition de la classe StringIdentity a titre d’exemple : e ` package javx. Toutes les classes pouvant servir d’identifiant sont d´finies dans le package e javax. alors une sous classe de A (B e ou C) peut avoir une classe d’identifiant diff´rente de AId. – Un constructeur avec un unique argument de type String est obligatoire. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 333 <class name="Banque" identity-type="application"> <field name="nom" primary-key="true"/> </class> . pour des raisons de conception. il est tout a fait possible de ` d´finir sa propre classe contenant le champ unique. char. e ` Cette classe d’identifiant doit alors ˆtre une sous classe de AId et peut contenir de e nouveaux champs pour composer l’identifiant. toutes les classes concr`tes d’un arbre e e doivent avoir le mˆme identifiant que la classe concr`te la plus g´n´rale. String key). public class StringIdentity extends SingleFieldIdentity { public String getKey(). – La m´thode toString doit ˆtre surcharg´e afin de renvoyer une image sous la forme e e e d’un chaine de caract`res du contenu de l’identifiant.

Cet identifiant ne doit ˆtre utilis´ e e que lorsque l’application JDO est la seule a ins´rer des nouvelles donn´es en base. l’impl´mentation JDO ne calcule que la e valeur maximum qu’au d´marrage. le syst`me garantit l’immutabilit´ des identifiants de ` e e e ce type. – sequence : L’identifiant est calcul´ en utilisant une s´quence. ´vitant les probl`mes d’incoh´rence comme celui de la validit´ des r´f´rences. e e e – increment : L’identifiant est une valeur enti`re calcul´e a partir de la valeur maximum e e ` des identifiants des autres instances d’une classe. Par ailleurs. regroupent tous les idene e e tifiants dont les valeurs ne sont pas attribu´es par l’application.334 ANNEXE F. Il faut utiliser les APIs de JDO. La g´n´ration de la valeur peut suivre sept strat´gies possibles : e ee e e e – native : L’identifiant est choisi par l’impl´mentation JDO. Elle g`re cette valeur en m´moire par la suite. La valeur g´n´r´e est unique et est au format UUID. e Identifiant syst`me e Les identifiants syst`mes. ` e e En effet. e e e e ee Strat´gie de g´n´ration de valeur d’identifiant e e e Les champs persistants d’une classe d’identifiant ou les identifiants syst`me peuvent e recevoir une valeur g´n´r´e. e e e – uuid-string : L’identifiant est une chaˆ ıne de 16 caract`res g´n´r´s par e e ee l’impl´mentation JDO. pour des raisons de performance. c’est a dire un identifiant de type UUID e ` sous la forme hexad´cimale. ce qui pose de nombreux ` probl`mes. La valeur de l’identifiant e n’est pas expos´e dans un champ de la classe persistante. e e ee . Les strat´gies possibles sont d´taill´es dans la section qui e e e e suit. ` e e pas de valeurs a g´rer. comme par exemple la perte de validit´ de toutes les r´f´rences vers l’objet e e ee changeant d’identit´. Par exemple. e notamment le PM pour r´cup´rer un tel identifiant. la strat´gie est uuid-hex. d´finis par la cat´gorie datastore. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE Cette section montre bien que la manipulation d’identifiant applicatif est laborieuse. Il est clair que l’utilisation de type d’identifiant est beaucoup plus simple pour le programmeur car elle offre une transparence totale : pas de champ d’identifiant a d´clar´. La strat´gie de calcul de l’identifiant e e e se d´finit dans le descripteur JDO au moyen de la balise datastore-identity comme dans e l’exemple suivant : <class name="Compte" identity-type="datastore"> <datastore-identity strategy="uuid-hex"/> </class> . e – autoassign : L’identifiant est projet´ sur une colonne SQL auto incr´ment´e. La s´quence peut ˆtre e e e e une s´quence g´r´e par le support de stockage (par exemple une s´quence SQL) ou e ee e par le pilote JDO lui-mˆme. l’utilisation de tels identifiants reste difficile car le programmeur n’est pas a l’abri d’un changement des informations d’un identifiant. Dans cet exemple. Par ailleurs. e on peut vouloir utiliser directement l’identifiant fourni par une base de donn´es a e ` objets. e – identity : L’identifiant est choisi par le support de stockage lui-mˆme.

e L’exemple ci-dessous montre comment rendre explicitement persistant une instance : .F. le mˆme principe de transitivit´ e e que d´crit pr´c´demment s’applique.4 Rendre un objet persistant Un objet Java appartenant a une classe persistante est non persistant a sa cr´ation par ` ` e le programmeur. e e e Lorsqu’une instance devient persistante. Dans le cas d’identifiant applicatif. L’objet ainsi r´f´renc´ devient alors persistant ee e et par transitivit´ tous les objets qu’il r´f´rence lui-mˆme. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 335 – uuid-hex : L’identifiant ´pouse le mˆme principe que uuid-string mais sa longueur e e est de 32 caract`res (chaque caract`re de la chaine UUID est encod´ si=ous la forme e e e de deux caract`res hexad´cimaux). l’impl´mentation JDO calcule la valeur de l’idene e tifiant au moment o` l’objet devient persistant.4. Selon la cat´gorie d’identifiant syst`me. – Le programmeur utilise les APIs JDO pour rendre l’objet persistant. Les champs objet doivent notamment ˆtre non e e e nul. Dans le cas d’un identifiant syst`me. Deux situations diff´rentes vont amener a ce qu’il devienne effectivement e ` persistant : – Le programmeur affecte dans un objet qui est d´j` persistant une r´f´rence (ou ea ee relation) vers un objet qui ne l’est pas.4. c’est a dire ` n’appartenant pas a un identifiant. il est n´cessaire que le ou les champs composant l’identifiant aient ´t´ e ee pr´alablement affect´s par l’application. ` F. Nous parlons dans ce cas de persistance explicite. u e e ce processus peut mettre en œuvre un acc`s au support de stockage (par exemple lors de e l’utilisation d’une s´quence SQL). Elle peut se faire sur des champs persistants normaux. Dans ce cas. e e L’exemple suivant montre comment sp´cifier une strat´gie pour le calcul automatique e e de la valeur d’un champ d’identifiant : <class name="Compte" identity-type="application"> <field primary-key="true" value-strategy="uuid-hex"/> </class> . Notons que l’utilisation de ces g´n´rateurs peut se faire en dehors de la gestion de e e valeurs d’identifiant. elle obtient un identifiant. e Persistance explicite La persistance explicite la m´thode makePersistent de l’interface PersistenceManager. Nous parlons alors de e ee e persistance par attachement.

` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE import javax.makePersistent(b).begin(). Comme on e l’a dit.getPersistenceManager(). Banque b = new Banque("Banque de France"). le principe est d’affecter une instance non encore persistante a un champ d’une ins` tance d´j` persistante (cas d’une relation monovalu´e entre objets persistants). L’objet collection interm´diaire n’est pas consid´r´ comme un e ee objet persistant (l´g`re perte d’orthogonalit´ vis-`-vis du langage Java).getPersistenceManager().jdo.currentTransaction().commit(). L’interface PersistenceManager propose d’autres m´thodes pour rendre persistant des objets par pae quets : il s’agit des diff´rentes d´clinaisons de makePersistentAll.jdo. En effet.currentTransaction.add(a).currentTransaction(). pm. . // ici ’b’ est persistant de mani`re "durable" e pm. Cependant. c e l’objet r´f´ren¸ant r´f´rence d’abord un objet collection qui r´f´rence a son tour les objets ee c ee ee ` qui deviennent persistants. // ici ’b’ est persistant Agence a = new Agence("agence principale").close().currentTransaction(). dans ce cas.close(). ou par attachement n’utilise pas l’API JDO. PersistenceManager pm = pmf. pm.commit(). // ici ’a’ est devenu persistant pm. pm. Dans l’exemple. . PersistenceManager pm = pmf. avoir un identifiant et ne pas ˆtre e e ´crite sur le support de stockage.PersistenceManager..makePersistent(b). e e Persistance par attachement La persistance par transitivit´.) alors l’instance n’est plus persistante e et aucune donn´e relatif a cet objet n’existe dans le support de stockage. .. L’exemple cie ` dessus montre la forme la plus simple pour rendre persistant une instance..currentTransaction(). // ici ’b’ est devenu persistant pm.rollback(). . l’instance b est devenue persistante suite a l’appel a la m´thode ` ` e makePersistent. JDO impose seulement que toutes les actions aient ´t´ e ee propag´es sur le support au plus tard a la validation de la transaction.PersistenceManager.336 ANNEXE F. elle peut ˆtre persistante.begin(). // ici ’a’ n’est pas persistant b. // ici ’b’ n’est pas persistant : c’est un objet Java normal pm. . L’exemple suie e e a vant montre un tel cas de propagation de la persistance a travers la relation multi-valu´e ` e agences qui est une collection qui r´f´rence toutes les agences d’une banque (d´finie par ee e la classe Banque) : import javax. Cela peut ea e aussi se faire de fa¸on indirecte dans le cas de relations multi-valu´es.getAgences().. pm. Banque b = new Banque("Banque de France"). Si la transaction e ` est annul´e (pm.

Ainsi e lorsqu’une instance devient persistante.5 D´truire un objet persistant e La destruction d’objet persistant est toujours explicite dans le cadre de JDO. Le mod`le de persistance est donc relativement orthogonal par rapport au langage e Java. En effet.getAgences(). Cette approche ` e ` e permet de d´truire des ensembles d’objets persistants en une seule requˆte vers la e e base de donn´es.commit() pm. Le r´sultat d’un telle op´ration est g´n´ralement de e e e e produire autant de requˆtes de destruction vers la base de donn´es que d’objets a e e ` d´truire. PersistenceManager pm = pmf. . ee La transitivit´ de la propri´t´ de persistance est aussi valable pour les objets r´f´renc´s e ee ee e par une instance qui devient persistante de mani`re explicite ou par attachement.getPesistenceManager(). il s’agit de d´finir e e e les objets a d´truire a base d’une requˆte ensembliste associative.4.close(). .F. // ici ’b’ et ’a’ sont devenus persistants pm. Le fonctionnement est identique pour une e e r´f´rence simple..jdo. De plus. section F. il n’y a pas au niveau de l’espace de stockage de ramasse-miettes comme le g`re Java en e m´moire. e – La destruction ensembliste : Pour des raisons d’efficacit´.begin().PersistenceManager. qui le devient : import javax. e e .. // ici ni ’b’ ni ’a’ ne sont persistants pm. Banque b = new Banque("Banque de France").add(a).currentTransaction().4. e F. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 337 L’instance a est devenue persistante au moment ou elle a ´t´ ajout´e dans la collection ee e agences poss´d´e par l’instance persistante b. pm. e Une fois supprim´.currentTransaction(). la suppression e e e est concr`tement effectu´e dans le support de persistance au moment de la validation de e e la transaction ou lors de l’´viction de l’objet de la m´moire.makePersistent(b). b. c’est toute la grappe d’objets atteignables par cet objet. JDO propose aussi un e m´canisme de destruction d’objets persistants bas´ sur des requˆtes associatives. La seule entorse au mod`le est que les collections d’objets persistants ne sont pas e des objets partageables comme les autres objets Java dans le cadre de la gestion de relations multi-valu´es persistantes. e L’API JDO fournit deux moyens pour d´truire des objets persistants : e – La destruction explicite : L’API JDO fournit des m´thodes permettant de d´truire un e e objet persistant ou une collection d’objets persistant et cela en d´signant de mani`re e e explicite les objets en question. La suppression doit ˆtre r´alis´e dans une transaction. un objet persistant n’est plus connect´ au syst`me et perd son e e e identifiant.5). Agence a = new Agence("agence principale"). e e e Comme pour les requˆtes de s´lection d’objets (cf.

close(). pm. pm = pmf. Cette fonction de la sp´cification JDO 2 ` e n’est actuellement pas support´e par Speedo. pm. pm. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE La suppression en cascade.PersistenceManager.338 ANNEXE F. pm. // ici b designe un objet persistant (present dans l’espace de stockage) . pm. .currentTransaction()..commit().commit(). c’est a dire propager la destruction a travers les relations.currentTransaction().currentTransaction(). Destruction explicite La suppression explicite repose sur l’utilisation des m´thodes deletePersistent et e deletePersistentAll de l’interface javax. De plus. ` ` n’est pas couverte par la sp´cification.deletePersistant(b). Ces m´thodes prennent e en param`tre la ou les instances persistantes a supprimer.getPersistenceManager().. Mais la suppression en cascade peut ˆtre r´alis´e e e e e par l’utilisation d’un Listener ou d’un CallBack permettant sur surveiller le cycle de vie d’un objet.. pm.begin(). // ici l’objet designe par b n’a plus de representant dans l’espace de stoclage // en memoire b reference un objet Java non persistant representant une banque // avec les valeurs qu’avait l’objet persistant avant sa destruction Les m´thodes deletePersistentAll sont l’´quivalent des m´thodes makePersistentAll e e e pour la destruction et prennent en param`tre des collections d’objets persistants a d´truire.close()..jdo.getPersistenceManager(). certaines impl´mentations offrent la fonction de ’cascade delete’ au e moyen d’une extension dans le descripteur de persistance. Deux points ` doivent ˆtre bien int´gr´ par le programmeur JDO car il repr´sente un danger du point de e e e e vu de la vision de la coh´rence des donn´es.6 Relations et coh´rence e Ayant pass´ en revue le mod`le de programmation de la persistance.4.begin().currentTransaction(). Voici un exemple simple : e ` import javax.jdo. e F.makePersistent(b). e e . nous abservons e e qu’il n’y a pas une transparence totale de la persistance par rapport a Java. e ` e Destruction ensembliste La suppression a l’aide des requˆtes consiste a d´finir une requˆte JDO d´signant ` e ` e e e l’ensemble des objets persistants a supprimer. Banque b = new Banque("Banque de France"). PersistenceManager pm = pmf. pm.PersistenceManager. pm.

elle peut souvent n´cessit´ en plus de ce simple objet.4. e . les r´f´rences devenues invalides a la destruce ee ` tion de l’objet r´f´renc´ sonts transform´es en pointeurs nul. dans tout autre contexte transactionnel (notamment les subs´quents). les liens vers l’objet d´truit reste valide jusqu’` la validation de la transace a tion dans laquelle la destruction intervient. e e e ee Le graphe peut ˆtre connexe ou partiellement connexe. Deux cas se pr´sentent : e – L’objet d´truit n’est r´f´renc´ que par des objets persistants ayant une image dans e ee e le support de stockage mais n’´tant pas repr´sent´s en m´moire. Lorsque l’application requiert une e instance persistante. La sp´cification JDO 2 permet de pr´ciser ce graphe par la ` e e notion de fetch-plan. Dans ce e ee e e cas. notamment les bases de donn´es relationnelles. section F. la s´mantique reste n´anmoins e e e claire. puisqu’elle impacte e directement la portabilit´ du code JDO. Dans la premi`re version de la sp´cification JDO. les classes persistantes sont reli´es par des r´f´rences. e e Mˆme si ce comportement n’est pas en ligne avec Java. il ´tait possible de d´finir une option e e e e qui impliquait que cette coh´rence en m´moire ´tait g´r´e par la solution JDO. Il reste que ce comportement doit ˆtre bien compris par le programmeur JDO. Un fetch-plan e se d´finit par un ensemble de fetch-groups. On se retrouve alors ee e e avec les mˆmes comportement que lorsqu’un programmeur utilise une r´f´rence Java e ee nulle (par exemple. eee – L’objet d´truit est r´f´renc´ en m´moire par des objets Java persistants. e Coh´rence des relations bidirectionnelles e Lorsque des objets se r´f´rencent mutuellement dans le cadre de relations bidirectionee nelles. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 339 R´f´rencement d’objets persistants d´truits ee e Le premier point concerne les r´f´rences vers des objets d´truits. g´n´ration d’une NullPointerException lors d’une tentative de e e d´r´f´rencement).6) permettent de repr´senter les deux liens associ´es au e e travers d’un seule information. c’est au programmeur de se soucier de g´rer la coh´rence e e de celles-ci.F. Contrairement a Java. C’est bien au programe e meur de garantir cette coh´rence et il ne parait pas judicieux de s’appuyer sur une telle e possibilit´ offerte par une solution JDO si elle n’est plus standard. Il se trouve que dans le cadre de projection vers le support de stockage. afin par exemple d’optimiser le chargement des donn´es. Il est e ainsi possible de d´truire un objet persistant alors qu’il est r´f´renc´ par d’autres objets e ee e persistants. un graphe e e d’objet connexe a cet objet. Speedo e e e ee support cette possibilit´ mais elle n’est dor´navant plus standard. Lors de la prochaine e e e e activation de ces objets en m´moire.4. on retombe sur la s´mantique d´crite dans le point e e e pr´c´dent. dans un cadre Java normal.7 Fonctions avanc´es e Dans un mod`le de donn´es. ee e ` les destructions d’objets persistants sont pilot´es directement par le programmeur. e F. cette coh´rence est souvent implicite car les e e modes de projection (cf.

tandis que le fetch-group all charge tous les champs. Pays pays. String nom. } . e e e ` Deux fetch-groups existent par d´faut : all et default. La port´e de ce nom est globale. Adresse adresse. e e Voici le mod`le de donn´e utilis´ pour les exemples de fetch-group : e e e public class Personne { String nom. N Personne Adresse Pays Figure F. Il est donc important de choisir des noms de e e fetch-groups compl`tement qualifi´s.340 ANNEXE F.6 – Mod`le de donn´es pour les exemples de fetch-group e e Exemple : fetch-group de base . Set enfants. } public class Adresse { String street. Un fetch-group est e nomm´. Un fetch-group peut aussi se d´finir a partir d’un autre fetch-group. String ville. Les fetch-groups se d´finissent dans le descripteur de persistance JDO. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE Les fetch-groups Un fetch-group est toujours associ´ a une classe et d´finit l’ensemble des champs qui e` e doivent ˆtre charg´s. } public class Pays { String code. Le fetch-group default charge les e champs primitifs seulement.

) se fait en utilisant des mots cl´s : e – #element pour acc´der aux ´l´ments d’une collection. Les fetch-plans Un unique fetch-plan est associ´ a chaque PersistenceManager.4. Le chemin est d´fini par la succession de noms de e champ r´f´rence s´par´s par le caract`res ’. e ee – #key et #value pour acc´der a une Map. Les fetch-groups peuvent se composer ou plus exactement s’additionner. e ` Exemple : fetch-group avec une collection <fetch-group name="monfg"> <fetch-group name="detail"> <field name="enfants#element. Un fetch-plan peut contenir des fetch-groups de diff´rentes e classes. Les petits enfants ne seront pas pris en compte.pays..’.F. .. Ce fetch-group s’appelle monfg2. Set. Il d´signe : e` e – le champ primitif nom via le fetch-group default. Il comprend le fetch-group detail et les enfants de la personne. L’interface javax. Ce fetch-group s’appelle detail et est associ´ a la classe Personne. e ` Exemple : fetch-group avec une collection <fetch-group name="monfg2"> <fetch-group name="detail"> <field name="enfants" fetch-depth="1"/> </fetch-group name="detail"> ..nom"/> </fetch-group name="detail"> . ee Afin de traiter les cas de r´cursivit´ dans les mod`les de donn´es. e mais aussi un chemin dans le graphe..FetchPlan offre les m´thodes suivantes : e . <fetch-group name="detail"> <fetch-group name="default"> <field name="adresse"/> <field name="adresse.jdo. ` L’exemple ci-dessus montre que les clauses field peuvent d´signer un champ de classe. l’attribut fetch-depth e e e e d´finit la profondeur a laquelle le fetch-group doit s’appliquer. L’acc`s aux ´l´ments d’un champ multi-valu´ ee e e e e ee e (Collection. PROGRAMMATION D’OBJETS JAVA PERSISTANTS 341 <class name="Personne" .. Il est utilis´ pour les e ` e requˆtes. List. Le fetch-plan peut ˆtre red´fini a e e e e ` tout moment par l’application. refresh et detach.code"/> </fetch-group name="detail"> </class> . Map. – la r´f´rence vers l’adresse de la personne. les m´thodes getObjectById. ee – le champ code du pays correspondant a l’adresse (cela inclus aussi l’objet Pays). Il comprend le fetch-group detail et le champ nom des ´l´ments de l’ensemble des enfants de la personne. Ce fetch-group s’appelle monfg.> .

FETCH SIZE GREEDY e e e indique que toutes les instances d´sign´es par le fetch-plan doivent ˆtre r´cup´r´es e e e e ee imm´diatement. Deux valeurs particuli`res sont d´finies par la sp´cification. e e e e structur´es sous forme d’objets.342 ANNEXE F. DETACH LOAD FIELDS indique que les champs non encore a charg´s mais inclus dans le fetch-plan doivent ˆtre charg´s. e e e F. Dans le cas g´n´ral.5 F. L’attribut fetchsize d´finit le nombre maximal d’instances qui seront r´cup´r´es par le e e ee fetch-plan. Lorsqu’elles sont d´finies dans le code de l’application. . Set getGroups(). e e L’attribut DetachementOptions permet de d´finir le comportement du d´tachement e e vis-`-vis des champs persistants. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE FetchPlan addGroup(String fetchGroupName). Cependant. e Voici un exemple de requˆte JDO d´finie et ex´cut´e dans le code de l’application : e e e e . FetchPlan setGroups(Collection fetchGroupNames).1 Requˆtes ensemblistes e Introduction Les requˆtes JDO permettent de r´cup´rer des donn´es du support de persistance. FETCH SIZE OPTIMAL indique que l’impl´mentation est libre d’optimiser le e e chargement des instances d´sign´es. ce qui apporte une grande puissance d’expression. FetchPlan removeGroup(String fetchGroupName). il est possible de construire e dynamiquement des requˆtes. il est possible de e e e sp´cifier de nouveaux objets pour accueillir le r´sultat. FetchPlan setGroups(String[] fetchGroupNames). Ces cinq m´thodes permettent de d´finir le contenu du fetch-plan en listant les noms e e des fetch-groups qui le composent. les requˆtes renvoient des objets du e e e e mod`le de donn´es d´fini par les descripteurs de persistance.5. e e Les requˆtes sont d´finies dans le code de l’application ou dans le descripteur de persise e tance. DETACH UNLOAD FIELDS indique e e e que les champs non inclus dans le fetch-plan doivent ˆtre d´charg´s.

La valeur du ıne e e e e param`tre est "Paris".getAdresse() + " France").commit(). e e e La requˆte est a d´finir/personnaliser en utilisant les m´thodes setXXX. REQUETES ENSEMBLISTES 343 import javax. mais aussi e e e en dehors d’une transaction si la propri´t´ nonTransactionalRead est activ´e (voir la section ee e sur les transactions).setAdresse(c. Une inse e tance de Query se r´cup`re par l’interface PersistanceManager via les m´thodes newQuery..endsWith(suffix)").getPersistenceManager().println("client: " + c). Query q = pm.Query.util. q. e e Les requˆtes JDO peuvent ˆtre utilis´es classiquement dans une transaction.jdo. for (Iterator it = l. L’utilisation d’un bloc try finally permet de s’assurer de la e fermeture des it´rateurs ouverts sur la collection r´sultante. .setFilter("this.currentTransaction(). import javax. Les objets retourn´s par la requˆte sont sensibles au fetch plan e e courant afin de r´cup´rer des graphes d’objets. pm. .. q.jdo. System. pm. PersistenceManager pm = pmf.List).Iterator. c. a e ` e connection.util..jdo. La requˆte s´lectionne les instances de la classe Client (et ses sous-classes) dont e e l’adresse se termine par une chaˆ de caract`res sp´cifi´e en param`tre.begin().close().adresse.Query.out. import java.util. Les m´thodes e ` e e e execute lancent l’´valuation de la requˆte et retournent par d´faut une liste d’objet (objet e e e de type java. it. try { List l = (List) q.execute("Paris").ˆ F.hasNext(). c’est le moyen d’ine e diquer au pilote JDO qu’il peut relˆcher les ressources li´es a cette requˆte (resultSet.PersistenceManager. Les attributs d’une requˆte JDO sont les suivants : e . Une requˆte JDO est un objet qui impl´mente l’interface javax. import java.declareParameters("String suffix"). } pm.currentTransaction().closeAll().next().List..). } } finally { q.class). .iterator(). En effet.5.newQuery(Client.) { Client c = (Client) it.

Par d´faut. ` e e String d´clarant les variables utilis´es dans le filtre. Le s´parateur entre les e d´clarations est le point virgule e String d´clarant le nom complet des classes. e e Indique si les donn´es modifi´es dans le cache L1 e e doivent ˆtre prises en compte dans la requˆte. Le s´parateur d’import est le e e point-virgule. c’est aussi la classe r´sultat. long der) setIgnoreCache(boolean) setUnmodifiable() Description La classe servant de domaine initial d’interrogation. Cela e permet d’utiliser le nom court des classes pour la d´claration des variables. Le s´parateur de param`tre est la e e e virgule. e Ordonnancement des r´sultats e La projection de la requˆte. e e Les variables servent principalement a d´signer le ` e contenu d’une collection.List des r´sultats. le e r´sultat est la classe initiale. C’est un peu l’´quivalent d’une e e clause WHERE en SQL. e e e Indique si le r´sultat est compos´ d’un seul ´l´ment. des param`tres ou lors e e d’op´ration de cast. e e ee Si oui alors l’objet renvoy´ par la m´thode execute est e e directement la valeur. Par d´faut. Par d´faut e e e les sous classes sont incluses. e . Le deuxi`me ee ` e e entier indique la position du premier ´l´ment non ee s´lectionn´. String d´clarant le nom et le type des param`tres utie e lis´s dans le filtre. L’ordre de d´claration correspond exactement e a l’ordre des param`tres dans des m´thodes ’execute’.344 ANNEXE F. Si non alors la m´thode execute e retourne une java. Cette chaˆ de caract`re permet de ıne e d´finir une projection plus complexe. e Permet de limiter la cardinalit´ du r´sultat et de faire e e de la pagination. Par d´faut. Le premier entier un indique l’index du premier ´l´ment a s´lectionner. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE M´thode e setClass(Class) setFilter(String) declareParameters(String) declareVariables(String) declareImports(String) setResultClass setOrdering(String) setResult(String) setGroupBy(String) setUnique(boolean) setRange(long pre. e D´finit la clause comment les r´sultats doivent ˆtre e e e group´s pour les op´rateurs d’agr´gation. la projection e e est compos´e des instances de la classe initiale (”DISe TINCT this”). String d´finissant une expression bool´enne comme e e filtre de s´lection. La classe accueillant la projection.util. e e Permet de rendre la requˆte non modifiable.

hasNext().) { Client c = (Client) it.class. pm. e e e L’ordre des clauses d´fini par la grammaire doit ˆtre respect´. for(Iterator it = l. try { List l = (List) q.getPersistenceManager().2 Requˆtes pr´definies e e Les requˆtes peuvent ˆtre d´finies dans le descripteur de persistance sous forme d’une e e e seule chaˆ de caract`res dans une balise query.currentTransaction().endsWith(:prefix) ]] </query> </class> .ˆ F. Toute requˆte d´finie dans le descripteur ıne e e e de persistance est nomm´e afin de pouvoir ˆtre utilis´e depuis l’application.currentTransaction().close(). REQUETES ENSEMBLISTES 345 F.next().5. } pm.begin().5.newNamedQuery(Client. "maRequete1").iterator(). Query q = pm. } } finally { q. Voici un e e e exemple de d´claration : e <class name="Client" identity-type="application" objected-class="ClientId" table="T_CLIENT"> <field name="nom" primary-key="true" column="C_NOM"/> <field name="prenom" primary-key="true" column="C_PRENOM"/> <field name="adresse" column="C_ADRESSE"/> <query name="maRequete1"> [!DATA[ SELECT WHERE adresse. Tous les mots cl´s doivent ˆtre ´crits soit tout en majuscule. pm. Voici la grammaire exacte pour la chaˆ de caract`res repr´sentant une requˆte au ıne e e e format chaˆ de caract`res : ıne e SELECT [ UNIQUE ] [<r´sultat>] [ INTO <nom de classe r´sultat ] e e [ FROM <nom de classe> [exclude subclasses ] [ WHERE <filtre> ] [ VARIABLES <clause variables > ] [ PARAMTERS <clause param`tres> ] e [ IMPORTS <clause imports ] [ GROUP BY <clause group by> ] [ ORDER BY <clause order by> ] [ RANGE <index premier>.closeAll().execute("Paris").commit(). Et son utilisation dans un bout d’application via la m´thode newNamedQuery : e PersistenceManager pm = pmf. <index dernier> ] . La d´finition d’une requˆte e e e e e sous forme d’une chaˆ de caract`res est identique a la d´finition d’une requˆte en utilisant ıne e ` e e . it. . soit tout en minuscule.

). -.. /. map. Pour les champs multi-valu´s (collection.. Il est aussi possible d’appeler certaines m´thodes : e ..5. de l’interface Query. La navigation prend en compte le polymorphisme des classes... Les e e op´rateurs utilisables sont les suivants : e Comparateur Op´rateurs arithm´tiques e e Op´rateurs bool´ens e e ==. F. >= +. Cela signifie que les valeurs des diff´rentes clauses e e de la grammaire ci-dessus.346 ANNEXE F. <=. >. de l’interface Query. !=.. . % ! est le NON logique & est un ET logique (et non un ET bit a bit) ` && est un ET conditionnel | est un OU logique (et non un OU bit a bit) ` || est un OU conditionnel Les op´randes de l’expression sont des chemins dans les graphes de donn´es ou des e e param`tres de la requˆte. <. il faut utiliser une e variable afin de nommer le contenu. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE les m´thodes set. list. *. correspondent exactement aux valeurs mises par les m´thodes e set. Le langage d’expression des filtres est tr`s proche de la syntaxe Java.3 Filtre de requˆte e Le filtre de requˆte repr´sente une expression bool´enne d´finissant un filtre de s´lection e e e e e du r´sultat. Les chemins d´butent par la classe initiale ou par une variable et e e e se terminent par un champ persistant.

. il e est possible d’utiliser des expressions r´guli`res mais e e r´duites aux symboles suivants : e – ’.xyz. } .abs(numeric) Math. – containsValue(Object).hr. startsWith(String). "salary > 30000"). Voici le e mod`le de donn´es sur lequel sont bas´s ces exemples : e e e package com.execute(). endsWith(String). Collection emps = (Collection) q. indexOf(String.xyz. substring(int. ` Math. isEmpty() size() – – – – – – – – – toLowerCase(). – containsKey(Object). float salary.int). toUpperCase(). class Employee { String name.class. Collection emps. La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where salary > 30000. REQUETES ENSEMBLISTES 347 M´thode e contains(Object) – get(Object). } package com. Department dept. Employee boss. Exemple 1 : Comparaison simple de float S´lection des employ´es dont le salaire est sup´rieur a 30000 : e e e ` Query q = pm.hr. int). une s´rie d’exemples de filtre permettant de mieux comprendre.*” repr´sente une chaˆ de caract`re ind´finie e ıne e e – ” ?i” indique que la comparaison ne doit pas ˆtre e sensible a la casse. . matches(String) Description S’applique aux types Collection pour d´finir des vae riables ou des conditions d’appartenance.sqrt(numeric) Valeur absolue Racine carr´ e Ci-dessous. indexOf(String). Pour la m´thode match. substring(int).5. class Department { String name. S’applique aux types Map S’applique aux types Collection et Map afin de d´finir e une condition S’applique aux types Collection et Map afin d’acc´der e a la taille ` S’applique au String.ˆ F.newQuery (Employee.’ repr´sente un caract`re ind´fini e e e – ”.

name == :dn. Le type de la variable e est le type des ´l´ments de la collection emps. Exemple 5 : Navigation sur un champ collection S´lection des d´partements dont au moins un des employ´s a un salaire sup´rieur a e e e e ` 30000 : Query q = pm.class. "dept.newQuery (Employee. La requˆte renvoie une liste d’instance de Department sans doublon. "dept == :d").execute(new Float(30000)).salary > :sal.contains(e) && e.class. la s´mantique de contains est il existe. Collection emps = (Collection) q. "this. e e e e e ..contains(e) && e. .name == :dn"). ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE Exemple 2 : Comparaison a un param`tre de type float ` e S´lection des employ´es dont le salaire est sup´rieur a un param`tre implicite : e e e ` e Query q = pm.348 ANNEXE F.. Collection emps = (Collection) q.execute(new Float(30000)). En ` e effet. Department d = .class. c’est ee a dire Employee. On note ici l’utilisation de la fonction contains sur la collection emps afin de d´finir e la variable e.salary > :sal"). La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where dept. . La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where dept == :d. "salary > :sal"). . La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where salary > :sal.emps.newQuery (Employee. .newQuery (Employee.execute("R&D"). La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where emps. Exemple 3 : Comparaison a un param`tre de type Department ` e S´lection des employ´s appartenant a un d´partement : e e ` e Query q = pm. Cela signifie qu’un contains avec une variable e en param`tre se traduit g´n´ralement par un IN SQL avec une requˆte imbriqu´e.newQuery(Department. Collection emps = (Collection) q.execute(d). Collection emps = (Collection) q. Exemple 4 : Navigation simple S´lection des employ´es appartenant a un d´partement : e e ` e Query q = pm.class. .

4 Cardinalit´ du r´sultat e e Les requˆtes JDO peuvent renvoyer un ou plusieurs objets.newQuery (Department.newQuery (Employee.contains(name)").class. Employee e = (Employee) q.MAX VALUE. La premi`re valeur est l’index du premier ´l´ment a ree ee ` tourner. e ee ` e Ces indexes suivent exactement les principes des index des tableaux en Java. L’application s’attend a e e ` trouver un seul employ´ pour un nom donn´ mˆme si ce n’est pas l’identifiant : e e e Query q = pm. ` e e e a ` e lorsque la requˆte est marqu´e avec setUnique(true). . . Cette requˆte est en fait un raccourci syntaxique ´vitant l’´criture fastidieuse e e e d’une comparaison entre le champ name et les diff´rents ´l´ments de la collection. e e e Par cons´quent. List depts = Arrays. e e e e les APIs JDO permettent de limiter la taille du r´sultat en sp´cifiant une fenˆtre sur les e e e ´l´ments requis du r´sultat. afin de simplifier l’utilisation de l’API.5.execute("Smith"). Voici un exemple de requˆte affichant la liste des noms des employ´s par page : e e .execute(depts). "Sales". La requˆte correspondante sous la forme d’une chaˆ de caract`res est la suivante : e ıne e select where :depts. Cependant les limites minimum et maximum sont respectivement 0 et Long. e ee F. e e e Pour d´finir les limites du r´sultat il faut sp´cifier l’attribut ’range’ de la requˆte : e e e e setRange(long from. S’il y a plus e e d’une valeur alors une exception JDOUserException est g´n´r´e. "Marketing"}). Les APIs JDO permettent e a l’utilisateur de sp´cifier la cardinalit´ du r´sultat grˆce a la m´thode setUnique. Ce m´canisme permet en particulier de faire de la pagination de e r´sultats en ex´cutant la requˆte pour chaque page avec les indexes correspondants. e ee Voici un exemple s´lectionnant un employ´ par son nom.ˆ F.asList(new String [] {"R&D". Collection deps = (Collection) q. la m´thode execute renvoie direce e tement la valeur attendue ou null si la requˆte ne produit aucun r´sultat. Une requˆte JDO peut renvoyer un tr`s grand nombre de r´sultats.setUnique(true). On note ici l’utilisation de la fonction contains sur le param`tre depts de type collection e de String. q. long toExcl). Cette fenˆtre est d´finie par l’index du premier ´l´ment requis ee e e e ee et l’index du dernier.class. cela signifie qu’il y a un seul r´sultat. Pour ´viter cela. Une quantit´ de e e e e donn´es trop importante peut r´duire consid´rablement les performances. ":depts. REQUETES ENSEMBLISTES 349 Exemple 6 : Appartenance a une collection ` S´lection des d´partements dont le nom est contenu dans un param`tre de type collece e e tion.contains(name). tandis que la deuxi`me valeur est l’index du premier ´l´ment a ne pas s´lectionner.5. "name == :n"). Query q = pm. Ainsi.

premier + taillePage).iterator(). la collection retourn´e contient soit un tableau e e d’objets.hasNext(). String name = (String) os[0].350 ANNEXE F. e e L’exemple ci-dessous montre comment s´lectionner une seule valeur.class.iterator(). Il est donc e e possible de sp´cifier une clause SELECT plus ´volu´e que simplement ”DISTINCT this”.name == deptName"). q. } .. e e Quand le r´sultat de la requˆte est compos´ d’une seule colonne. .declareParameters ("String deptName"). ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE public List getNomsEmployes(int indexPage. it. } . q.newQuery (Employee.class).setResult("name.getPersistenceManager(). int taillePage) { int premier = indexPage * taillePage.next(). for(Iterator it = names. "dept.. List noms = new ArrayList((List) q. si le r´sultat est e e un n-uplet compos´ de plusieurs colonnes.) { String name = (String) it. . Query q = pm.next(). il est possible de les ´liminer en ajoutant le e e mot cl´ DISTINCT de la mani`re suivante : q. Collection names = (Collection) q. q.execute("R&D").hasNext()) { Object[] os = (Object[]) it.newQuery (Employee.execute().setResult("DISTINCT name"). boss"). La collection renvoy´e e e e e par la m´thode execute contient directement les valeurs. soit une instance de classe sp´cifi´e par la m´thode setResultClass. e e e Voici un premier exemple ne sp´cifiant pas de classe de r´sultat : e e Query q = pm.newQuery (Employee. En revanche. q. pm.0 de la sp´cification JDO.close(). Collection names = (Collection) q. e e e La m´thode setResult de l’interface Query permet de sp´cifier cette clause select. q.execute()).5. return noms.class).setRange(premier.5 R´sultat complexe e Depuis la version 2. q. while (it. ici le nom de e l’employ´. PersistenceManager pm = pmf. il est possible d’´crire des requˆtes dont e e e le r´sultat ne contient pas forc´ment des instances de classes persistantes. Iterator it = names.name"). salary. Employee boss = (Employee) os[2]. Lorsque le r´sultat contient des doublons.setResult("this.setResult("name"). Float sal = (Float) os[1].closeAll(). F. } . La requˆte renvoie donc la liste des noms des employ´s : e e e Query q = pm.

ˆ F.. On note la correspondance entre les noms des colonnes dans le r´sultat avec les noms e des champs dans la classe r´sultat.setResultClass(Info.closeAll().setResult("name. this..name == deptName").name = n . Iterator it = names. Employee boss = info.name. public Info(String n. public Employee reportsTo. e e Une variante de cette solution consiste a d´finir un constructeur dans la classe r´sultat ` e e Info et de l’utiliser dans la clause result : class Info { public String name.newQuery (Employee. e e – Il une m´thode setter correspondante. while (it.class. public Float salary. Employee e) { this. q.execute("R&D"). En r´sum´. e – Pour chaque nom de colonne du r´sultat. String name = info. salary. Dans l’exemple. this. } } . Query q = pm. boss as reportsTo").iterator().reportsTo.next().setResult("new Info(name. Collection names = (Collection) q. salary.reportsTo = e. q. REQUETES ENSEMBLISTES 351 La collection contient des tableaux d’objets.setResultClass(Info.5. q. Voici le mˆme exemple sp´cifiant la classe Info comme conteneur de r´sultat : e e e class Info public public public } { String name. q. . .class). q. une des trois sous-contraintes qui suit est e v´rifi´e : e e – Il existe un champ public de mˆme nom et de mˆme type.. les classes r´sultantes respectent l’une des deux contraintes suivantes : e e e – Il existe un constructeur dont la signature est compatible avec les types des colonnes du r´sultat. .salary = s . L’ordre dans le tableau correspond a ` l’ordre dans la clause result.class). "dept. boss)"). } q. Float s.declareParameters ("String deptName"). Employee reportsTo. Float salary. afin de garantir cette correspondance.hasNext()) { Info info = (Info) it. e l’utilisation d’un alias est n´cessaire pour la troisi`me colonne. e ..

Ces op´rateurs e e e peuvent ˆtre utilis´s dans la clause ’result’.setResult("avg(salary)"). q..class). Float avgSalary = (Float) q. dept. Il est possible d’utiliser des op´rateurs d’agr´gation dans plusieurs expressions de la e e clause result.0 de la sp´cification JDO. il est possible d’´crire des requˆtes utilie e e sant des op´rateurs d’agr´gation comme le calcul de somme ou de moyenne.setGrouping("dept. sum(salary)"). } . comme dans l’exemple suivant : Query q = pm. e Voici un tableau r´sumant la forme du r´sultat en fonction des attributs result.execute("R&D").name"). q.execute("R&D"). il est possible de grouper les r´sultats pour les calculs d’agr´gats. Object value) traitant ce champ. it. q.newQuery (Employee. .5. Float average = (Float) info[0].) { Object[] info = (Object[]) it. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE – Il existe une m´thode put(Object name. Collection results = (Collection) q. Float sum = (Float) avgSum[1]. . .newQuery(Employee. Voici un exemple renvoyant e e les moyennes des salaires par d´partement ayant plus d’un employ´ : e e . String deptName = (String) info[1]. Float average = (Float) avgSum[0].name == deptName").352 ANNEXE F. Ce dere nier cas permet d’utiliser une Map comme conteneur de r´sultat.execute().hasNext(). la m´thode execute e e e renvoie automatiquement la valeur sans passer par une liste car l’unicit´ du r´sultat est e e garantie.declareParameters ("String deptName").setResult("avg(salary). e e Ainsi voici un exemple donnant la moyenne des salaires par d´partement : e Query q = pm. Les op´rateurs possibles sont COUNT.setResult("avg(salary).name").class. MIN. Object[] avgSum = (Object[]) q. q. Dans cet exemple. l’agr´gation agissant sur tous les employ´s. e e resultClass et unique : setResult SetResultClass setUnique Forme du r´sultat e F.6 Agr´gats et group by e Depuis la version 2.iterator(). Comme dans SQL.class.next(). Iterator it = results. e e e SUM et AVG. "dept.name == deptName"). Il est possible de filtrer le r´sultat obtenu apr`s le group by. "dept.newQuery(Employee. Voici un exemple calculant la moyenne des salaires d’un d´partement : e Query q = pm.declareParameters ("String deptName"). q. q. MAX..

6 Projection vers une base de donn´es relationnelle e La projection Objet/Relationnel (en anglais O/R mapping d´finit la translation entre e les structures de donn´es m´moires repr´sent´es par des classes et leurs champs.6.setGrouping("dept. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 353 Query q = pm. il est aussi pose ` sible d’ex´cuter des requˆtes SQL natives dans le cas o` une base relationnelle est utilis´e e e u e comme support de stockage. Identifiant applicatif bas´ sur un seul champ persistant e L’identifiant est un compos´ d’un seul champ de la classe persistante.setResult("avg(salary). e java. Float average = (Float) info[0].lang.Short.next().Character.lang. dept. byte. . et les e e e e structures de donn´es sur une base relationnelle repr´sent´es par des tables et des colonnes. it.name having count(dept.. e a F. int. Collection results = (Collection)q. } . La puissance est ´quivalente a SQL mais si cela ne suffit pas.) { Object[] info = (Object[]) it. String deptName = (String) info[1]. e e Les sections suivantes pr´sentent en d´tail les diff´rents formats d’identifiant support´s e e e e par Speedo. Les valeurs possibles sont "application" ou "datastore" correspondant respectivement aux cat´gories applicative et syst`me.lang.newQuery(Employee. Il est clair que cette possibilit´ doit ˆtre utilis´e avec parcie e e monie car elle rompt une propri´t´ essentielle de l’approche middleware : l’ind´pendance ee e et la portabilit´ vis-`-vis du support de stockage. for (Iterator it = results. q. Cette section donne un aper¸u de l’´tendue des possibilit´s offertes par le langage de c e e requˆte de JDO (et les APIs programmatiques associ´es) pour effectuer des traitements e e ensemblistes. e F.Integer ou java. java. java.lang. .name"). Pour utiliser ce type d’identifiant il faut d´finir l’attribut identity-type avec la valeur "application" et indiquer le champ e qui represente l’identifiant en definissant l’attribut primary-key a "true". e e e Ce chapitre d´crit pour chacun des ´l´ments m´moires comment d´clarer sa projection dans e ee e e une base de donn´es relationnelle.. java.hasNext().execute().lang.Byte. short. Voici un exemple ` simple. d’une classe Invoice ayant pour identifiant.´ F.Long. le champ number : <class name="Invoice" identity-type="application"> <field name="number" primary-key="true"/> </class> .name) > 1").class). long. q.iterator().6.1 Projection des identifiants d’objet persistant La cat´gorie d’identifiant est choisie dans le descripteur au niveau de la balise class e par l’attribut identity-type. Ce champ doit e ˆtre de type primitif : char.

De plus amples explications sont donn´es dans la section F. public String ville. Pour utiliser e e e e ce type d’identifiant il faut : – D´finir l’attribut identity-type avec la valeur "application". idx).3. } } .substring(idx + 1).4. Ci-dessous.substring(0. Les 20 bits de poids fort e e servent a identifier la classe (soit plus d’un millon de possibilit´s).lang. tandis que les 44 bits ` e de poids faible servent a identifier l’instance dans la classe (soit plus de 8 000 millards de ` possibilit´s).ville = s. this. Afin de supporter le e e e e polymorphisme. Ces champs e doivent ˆtre de type primitif comme ceux d´finis dans la section pr´c´dente. e ` – Sp´cifier une classe d’identifiant contenant tous les champs composants l’identifiant. le code de la classe AdresseId servant d’identifiant : class AdresseId { public String rue. toutes les formes de projection de l’h´ritage ne sont pas e support´es par Speedo. Ci-dessous.354 ANNEXE F. e Dans cette classe servant d’identifiant doit se conformer aux r`gles d´finies dans la e e section F. Pour utiliser cet identifiant. this. un exemple de d´claration de l’identifiant pour la classe persistante e Adresse : <class name="Adresse" identity-type="application" identity-type="application" objectid-class="AdresseId"> <field name="rue" primary-key="true"/> <field name="ville" primary-key="true"/> </class> . il suffit de ne rien d´finir car c’est le mode par e e d´faut.Long ou long. Identifiant applicatif bas´ sur plusieurs champs persistants e L’identifiant est un compos´ de plusieurs champs de la classe persistante.rue = s. public AdresseId(String str) { int idx = s.indexOf(’$’). ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE Avec ce mode d’identifiant. ee e Les valeurs sont calcul´es par un g´n´rateur lui-mˆme persistant. Identifiant g´r´ par Speedo e e L’identifiant g´r´ par Speedo est une valeur enti`re de type java. } public String toString() { return rue + "$" + ville.6 e e concernant la projection d’un arbre d’heritage. comme dans l’exemple suivant : e . ce nombre entier est d´compos´ en deux parties. e – D´finir l’attribut primary-key a "true" pour chaque champ composant l’identifiant.6.

lang.. Comme cet identifiant est bas´ sur e e un g´n´rateur persistant. F.2 Projection de la classe Une classe persistante est de mani`re conventionnelle stock´e dans une table dont les e e colonnes correspondent aux champs persistants de la classe. e <class name="A" identity-type="application" table="A_TP"> <join table="A_TS" column="FK_ID"/> <field name="id" primary-key="true" column="ID"/> <field name="f1" column="F1"/> <field name="f2" column="F2" table="A_TS"/> <field name="f3" column="F3" table="A_TS"/> </class> . L’identifiant est le champ u e e persistant id : <class name="MyClass" identity-type="application"> <field name="id" primary-key="true" value-strategy="sequence" sequence="my_seq"/> <field name="other_field"/> </class> ..lang. Ce type d’identifiant est particuli`rement int´ressant dans le cas de l’h´ritage ou lorsque e e e le support de stockage ne supporte pas les s´quences. e e ee Identifiant bas´ sur une s´quence e e L’identifiant peut ˆtre bas´ sur une sequence de la base de donn´es. </class> . Le type de ce champ doit ˆtre long ou java. Si aucun e nom de table n’est sp´cifi´. Chaque table secondaire doit d´finir une jointure avec la table principale. e e Bien que l’identifiant soit g´r´ par Speedo. si le type du champs e est long. On ` distingue alors une table principale et des tables secondaires. c’est la valeur null qui en base de donn´es repr´sente une r´f´rence nulle. Si le type du champ est ee java. Pour e cela. c’est la valeur -1 qui represente une r´f´rence nulle.Long.´ F. Voici un exemple e e e o` la classe Myclass a un identifiant bas´ sur une s´quence. e e e – La table jf classid contient l’association entre le g´n´rateur et la classe persistante. L’attribut table de la balise class permet de d´finir la table principale de stockage des instances de la classe.Long. des structures particuli`res sont n´cessaires : e e e e – La table jf longgen contient les g´n´rateur utilis´s pour les identifiants. . Attention. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 355 <class name="A"> <field name="f1"/> <field name="f2"/> </class> . Speedo choisit par d´faut le nom de la classe : e e e <class name="Banque" identity-type="application" table="T_BANQUE"> . il est tout a fait possible de stocker une classe sur plusieurs tables.6. la valeur de l’identifiant peut ˆtre disponible ee e dans un champ de la classe.6. il suffit de d´clarer le champ comme primary-key. Cependant.

math.sql.. il faut sp´cifier le nom de la e e colonne et le nom de la table : <class . D’autres attributs peuvent ˆtre sp´cifi´s : e e e – length : la longueur de la chaˆ de caract`res ıne e – scale : la pr´cision des types num´riques e e – default-value : la valeur par d´faut de la colonne e Ces informations concernant les colonnes SQL. ne sont pas exploit´es par le runtime de e Speedo. il suffit de sp´cifier l’attribut column dans la balise field : e <class . char...). long.356 ANNEXE F. Un champ simple est projet´ sur une seule colonne d’une seule table. elles peuvent ˆtre utilis´es par des outils permettant la g´n´ration e e e e du sch´ma de la base de donn´es. En revanche. La table e secondaire A TS est li´e a la table principale par la jointure A TP.6.. Lorsqu’une classe est projet´e sur plusieurs tables.) ou un objet simple (java. il faut d´finir la jointure entre les e e tables secondaires et la table principale. e ` F. e e Pour d´finir le nom de la colonne dans une table secondaire.lang. </class> . Le mod`le de donn´es ci-dessous est utilis´ comme ee e e e e exemple pour les relations unidirectionnelles un-un : . .FK ID.ID = A TS.> <field name="f2" column="TS1_F2" table="A_TS1"/> ...Date. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE L’exemple ci-dessus d´crit une classe A ayant trois champs persistants.. java.4 Projection de relations mono-valu´es e Pour stocker une relation un-un dans une base de donn´es relationnelle... La colonne peut appartenir a la e ` table principale ou a une table secondaire.. java. Pour d´finir le nom de la colonne dans la table ` e principale..6.. </class> .BigDecimal. </class> .> <field name="f1" column="M\_F1"/> .3 Projection d’attributs simples Un champ simple est un champ dont le type est primitif (int.Boolean. Il est possible de sp´cifier plus pr´cis´ment des e e e informations sur la colonne comme dans l’exemple suivant : <class> <field name="f2"> <column="TS1_F2" table="A_TS1" sql-type="VARCHAR(32)"> </field> . La classe est e projet´e sur 2 tables A TP (A Table Principale) et A TS (A Table Secondaire).. . Si aucun nom de colonne n’est sp´cifi´e Speedo nomme automatiquement la colonne.. il faut au e moins une cl´ ´trang`re dans une table. e e F.

Relation 1-1 unidirectionnelle La cl´ ´trang`re peut ˆtre dans la table correspondant a la classe ayant la r´f´rence. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 357 class A { long aid.´ F.6.7 – Projection de relation 1-1 unidirectionnelle La d´claration de ce mapping est extrˆmement simple. Il suffit d’indiquer le nom de e e colonne dans laquelle le champ unB est projet´.8 – titre ? ? La d´claration de la projection est la suivante : e . Dans le cas o` la classe r´f´renc´e poss`de un identifiant composite (avec plusieurs u ee e e champs). //identifiant de la classe A B unB. le sch´ma de base est celui d´crit dans la figure F. e e TA IDA FK_IDB1 FK_IDB2 TB IDB1 IDB2 Figure F. // r´f´rence vers la classe B e e } class B { long bid. e <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="unB" column="FK_IDB"/> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> </class> . ee e e ` ee c’est a dire le champ unB : ` TA IDA FK_IDB TB IDB Figure F.8. //identifiant de la class B } .

Pour chacune des colonnes composant l’identifiant. //identifiant de la classe A B unB. afin de ne pas alourdir de mani`re inutile la e description. De l’autre. La d´claration de la projection est la suivante : e . //identifiant de la class B A unA. TA IDA FK_IDB TB IDB Figure F.9 – Projection d’une relation 1-1 bidirectionnelle Dans le cas d’une relation bidirectionnelle. //r´f´rence vers la classe A e e } . // r´f´rence vers la classe B e e } class B { long bid. il suffit d’indiquer a e e e ` l’aide de l’attribut mapped-by le nom du champ de la r´f´rence oppos´e (attribut inverse ee e dans le descripteur JDO). le mod`le suivant est utilis´ comme exemple : e e class A { long aid. e Relation 1-1 bidirectionnelle Pour les relations bidirectionnelles. la projection est d´clar´e d’un cot´ seulement. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="unB"> <column name="FK_IDB1" target="IDB1"/> <column name="FK_IDB2" target="IDB2"/> </field> </class> <class name="B" identity-type="application" table="TB" objectid-class="BId"> <field name="bid1" primary-key="true" column="IDB1"/> <field name="bid2" primary-key="true" column="IDB2"/> </class> .358 ANNEXE F. L’attribut name d´finit le nom de la colonne dans TA (soit e le nom de la cl´ ´trang`re) alors que l’attribut target d´finit le nom de la colonne dans la ee e e table TB (soit le nom de la cl´ primaire). il faut d´finir le nom de la colonne e correspondant dans la table TA.

F. une relation multi-valu´e correspond a un objet persistant e e ` r´f´ren¸ant un ensemble d’objets persistants g´n´ralement a travers une collection. //identifiant de la classe A Collection<B> mesB. } //identifiant de la class B . e Relation 1-n unidirectionnelle Pour ce type de relation.10). figure F. la d´claration est la suie vante : . Il y en ee c e e ` a plusieurs types dont la projection est d´crite dans les sous-sections qui suivent. le mod`le de donn´es ci-dessous est utilis´ : e e e class A { long aid. Par convention e ` e ee ce nom de colonne est dans la table de l’´l´ment r´f´renc´ (ici B. la d´claration est la suivante : e <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="mesB"> <collection element-type="B"/> <element column="FK_IDA"/> </field> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> </class> . //r´f´rence des B e e } class B { long bid.6. soit la table TB). La d´claration consiste a d´finir le nom de la colonne pour les ´l´ments. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 359 <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="unB" column="FK_IDB"/> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> <field name="unA" mapped-by="unB"/> </class> .6. ee ee e Pour une projection avec table de jointure (cf.´ F. Pour une projection sans table de jointure.5 Projection de relations multi-valu´es e Comme d´fini auparavant.

Le principe g´n´ral des relations bidirectionnelles est de ne d´finir la projection que e e e dans un seul sens de la relation.10 – Projection d’une relation 1-n unidirectionnelle <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="mesB" table="TA2B"> <collection element-type="B"/> <join column="FK_IDA"/> <element column="FK_IDA"/> </field> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> </class> . ` ee Relation 1-n bidirectionnelle Pour ce type de relation. //r´f´rence des B e e } class B { long bid. il suffit d’indiquer ee le nom du champ de la r´f´rence inverse. Pour une projection sans table de jointure. Le principe est de d´clarer une table et sa jointure vers la table principale.360 ANNEXE F. le mod`le de donn´es ci-dessous est utilis´ : e e e class A { long aid. De la mˆme mani`re que le cas sans jointure. Cette table e secondaire peut ˆtre d´clar´e au niveau de la classe ou seulement pour un champ comme e e e ici. } //identifiant de la class B //r´f´rence un A e e . Pour l’autre sens (l’autre r´f´rence). A unA. il faut d´finir le nom de la colonne e e e correspondant a l’´l´ment. //identifiant de la classe A Collection<B> mesB. la ee d´claration est la suivante : e . ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE TA IDA TA FK_IDA FK_IDB TB IDB Figure F.

PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 361 <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="mesB" mapped-by="unA"> <collection element-type="B"/> </field> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> <field name="unA" column="FK_IDA"/> </class> . Pour l’autre sens (l’autre r´f´rence). Pour une projection avec table de e ` e jointure. //identifiant de la classe A Collection<B> mesB. la d´claration est la suivante : e <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="mesB" table="TA2B"> <collection element-type="B"/> <join column="FK_IDA"/> <element column="FK_IDA"/> </field> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> <field name="unA" mapped-by="mesB"/> </class> . Ici. //r´f´rence des A e e } . Ici c’est la d´claration la plus simple qui a ´t´ choisie en d´finissant la projection de e ee e la r´f´rence mono valu´e (champ unA) et en indiquant que le champ inverse (champ mesB) ee e ´tait a d´duire de la projection du premier champ. e Relation m-n bidirectionnelle Le mod`le de donn´es ci-dessous est utilis´ comme exemple : e e e class A { long aid. Le principe g´n´ral des relations bidirectionnelles est de d´finir la projection d’un seul e e e sens de la relation.´ F. il suffit d’indiquer le nom du champ ee .6. //r´f´rence des B e e } class B { long bid. il a ´t´ choisi de d´finir la projection de la r´f´rence multi-valu´e (champ mesB) et ee e ee e d’indiquer que la projection du champ inverse (champ unA) est d´duite de celle du champ e multi-valu´. //identifiant de la class B Collection<A> mesA.

horizontale. Pour ce mod`le. Le probl`me e e e lorsqu’on doit projeter ce type de relation est le compromis a trouver entre l’efficacit´ ` e du stockage (pas de perte d’espace). } class B extends A { String f2. la dynamicit´ de la gestion du sch´ma de l’espace e e de stockage. et l’efficacit´ de l’interrogation ainsi que de la mise a jour des objets dans e ` l’arbre d’h´ritage. il y a g´n´ralement ajout de nouveaux champs dans la sous-classe. Pour pouvoir faire le bon e e compromis.6 Projection de liens d’h´ritage e Dans un arbre d’h´ritage. F. Il n’y a pas de solution id´ale dans tous les cas. un arbre d’heritage peut ˆtre projet´ selon trois strat´gies : filtr´e. e e e e verticale.11 – Projection de l’h´ritage en mode filtr´ e e . a chaque d´finition d’un nouveau lien d’h´ritage entre deux e ` e e classes. il a ´t´ choisi de d´finir la projection de la r´f´rence multi-valu´e (champ mesB) et ee e ee e d’indiquer que la projection du champ inverse (champ mesA) est d´duit de la projection du e premier champ. String f1. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE de la r´f´rence inverse. Ici. La d´claration de la projection d’une relation m-n unidirectionnelle ee e est la suivante : <class name="A" identity-type="application" table="TA"> <field name="aid" primary-key="true" column="IDA"/> <field name="mesB" table="TA2B"> <collection element-type="B"/> <join column="FK_IDA"/> <element column="FK_IDB"/> </field> </class> <class name="B" identity-type="application" table="TB"> <field name="bid" primary-key="true" column="IDB"/> <field name="mesA" mapped-by="mesB"/> </class> . } .6. voici les differentes projections possibles en fonction de la strat´gie : e e ID TA F1 F2 Figure F. Voici un exemple d’arbre d’heritage tr`s simple : e class A { String id.362 ANNEXE F.

.. e ID TB F1 F2 Figure F. En revanche. Quand l’identifiant est constitu´ de champs persistants.13 – Projection de l’h´ritage en mode vertical e – Verticale : Chaque classe a sa propre table contenant uniquement les champs de la classe courante. la classe fille et la classe m`re sont stock´es dans la e e mˆme table. Pour le discriminant trois cas sont possibles : – Le discriminant est inclus dans l’identifiant de la classe. Pour distinguer les classes des instances. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 363 – Filtr´e : Une table contient tous les champs (ceux de la classe m`re et ceux de la e e classe fille). e Le nom de la classe m`re et la strat´gie doivent ˆtre indiqu´s dans le descripteur JDO e e e e comme dans l’exemple suivant : <class name="B" persistence-capable-superclass="A"> <inheritance strategy="superclass-table"/> . En effet. incluant l’idene tifiant de la classe. L’unique table contient des instances de la classe m`re et des instance e de la classe fille. le discriminant e est l’un d’entre eux.6.12 – Projection de l’h´ritage en mode horizontal e – Horizontale : Chaque classe a sa propre table contenant tout les champs herit´s et e les champs de la classe courante. un filtre est nec´ssaire. Les sections suivantes d´crivent en d´tail les diff´rentes projections possibles. La valeur u .11. Ceci ´vite des requˆtes eventuellement e e e e complexes. </class> .13. La projection des champs e n’est faite qu’une seule fois. l’identifiant est ger´ par Speedo. Voici un exemple o` le champ id2 est le discriminant. La table est definie au niveau de la classe parente. e Ce mode de projection est illustr´ dans la figure F. e e e Projection filtr´e e Avec une projection par filtrage.12. e e ID TA F1 TB ID F2 Figure F. Cette strat´gie est la plus e performante. Cette table a en plus une jointure avec la table de la classe m`re. Cependant. Ce mode de projection est illustr´ dans la figure F.´ F. e Speedo sait supporter des filtres evolu´s. une r´f´rence vers un objet d’une classe de l’arbre d’heritage ee inclue le type exact de l’instance d´sign´e. la majorit´ des utilisateurs utilise un e e simple discriminant. Ce mode de projection est illustr´ dans la figure F. La table ne contient que des instances de la classe qui lui est associ´e.

Cette solution est moins performante. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE e "discrim A" d´signe les instances de la classe A. Voici un exemple : . Voici un exemple : <class name="A" table="TA" identity-type="application"> <inheritance strategy="new-table"> <discriminator column="ID2" stategy="value-map" value="discrim_A"/> </inheritance> <field name="id1" primary-key="true" column="ID1"/> <field name="id2" column="ID2"/> <field name="f1" column="F1"/> </class> <class name="B" persistence-capable-superclass="A"> <inheritance strategy="superclass-table"> <discriminator column="ID2" value="discrim_B"/> </inheritance> <field name="f2" column="F2"/> </class> . Cette strat´gie est int´ressante si on ne veut pas se pr´occuper de la valeur e e e du discriminant en ayant un identifiant applicatif.364 ANNEXE F. tandis que la valeur "discrim B" d´signe les instances de la classe B : e <class name="A" table="TA" identity-type="application"> <inheritance strategy="new-table"> <discriminator column="ID2" stategy="value-map" value="discrim_A"/> </inheritance> <field name="id1" primary-key="true" column="ID1"/> <field name="id2" primary-key="true" column="ID2"/> <field name="f1" column="F1"/> </class> <class name="B" persistence-capable-superclass="A"> <inheritance strategy="superclass-table"> <discriminator column="ID2" value="discrim_B"/> </inheritance> <field name="f2" column="F2"/> </class> . – Le discriminant n’est pas un champ persistant mais une colonne de la table. C’est la valeur de cette constante qui discrimine les classes des e instances. – Le discriminant n’est pas inclu dans l’identifiant de la classe. Sa valeur est constante pour ` une classe donn´e. Souvent la valeur du discriminant est le nom de la classe persistante. Cette colonne ne correspond pas a un champ persistant.

Ceci est le cas le plus performant.6. chaque classe a sa propre table contenant e tous les champs herit´s. Voici un exemple : e . Voici e un exemple : <class name="A" table="TA"> <inheritance strategy="new-table"/> <field name="id" column="ID"/> <field name="f1" column="F1"/> </class> <class name="B" persistence-capable-superclass="A" table="TB"> <inheritance strategy="new-table"/> <field name="id" column="ID"/> <field name="A. En effet. Cette table a en plus une jointure avec la table de la classe m`re. e e e e Projection verticale Avec la strat´gie de projection verticale. il faut red´finir e e la projection des champs h´rit´s. cela evite de faire des jointures avec toutes les classes filles pour d´terminer l’instance exacte.f1" column="F1"/> <field name="f2" column="F2"/> </class> . chaque classe a sa propre table contenant e uniquement les champs de la classe courante.´ F. On notera qu’afin de distinguer les champs h´rit´s des champs de la classe courante. En effet. L’identifiant g´r´ par Speedo inclut un discriminant. PROJECTION VERS UNE BASE DE DONN EES RELATIONNELLE 365 <class name="A" table="TA"> <inheritance strategy="new-table"> <discriminator column="MY_COL" stategy="class-name"/> </inheritance> <field name="id1" primary-key="true" column="ID1"/> <field name="f1" column="F1"/> </class> <class name="B" persistence-capable-superclass="A"> <inheritance strategy="superclass-table"> <discriminator column="MY_COL"/> </inheritance> <field name="f2" column="F2"/> </class> . e e les noms des champs h´rit´s sont pr´fix´s par le nom de la classe. Ils doivent ˆtre projet´s sur des structures de la table e e e e courante. Speedo supporte ce type de projection uniquement dans le cas o` u l’identifiant contient un discriminant. C’est le cas de l’identifiant ger´ par Speedo. e Projection horizontale Avec une strat´gie de projection horizontale. dans le descripteur de la classe fille. C’est le meilleur choix quand ee l’identifiant n’est pas bas´e sur des valeurs applicatives. Actuellement. Actuellement Speedo supporte uniquement le cas o` l’identifiant e u inclut un discriminant.

Ce mode d’int´gration est souvent appel´ ”int´gration JTA”.7. Le pilote JDO est instanci´ en utilisant le JDOHelper comme e expliqu´ pr´c´demment. ou par le conteneur EJB (attribut transactionnel des m´thodes des EJB). La e e ee solution JDO se raccroche automatiquement a la transaction JTA courante. Dans ce type d’int´gration. F. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE <class name="A" table="TA"> <inheritance strategy="new-table"/> <field name="id" column="ID"/> <field name="f1" column="F1"/> </class> <class name="B" persistence-capable-superclass="A" table="TB"> <inheritance strategy="new-table"> <join column="ID"/> </inheritance> <field name="f2" column="F2"/> </class> . Les transactions sont locales et doivent ˆtre d´marqu´es avec l’API JDO e e e (javax. la plupart des solutions JDO savent s’int´grer aux serveurs d’ape plications les plus courants.7 Int´gration dans J2EE e L’int´gration d’une solution JDO dans un serveur J2EE concerne l’aspect transactione nel et la mani`re dont le produit JDO est ajout´ au serveur d’application et r´cup´r´ par e e e ee l’application.jdo. la e e solution JDO doit retrouver le gestionnaire de transaction du serveur d’application. ` Le pilote JDO est instanci´ en utilisant le JDOHelper. l’int´gration est sp´cifique a chaque serveur d’ape e e e e ` plication.7. F. Ce cas est le plus simple puisqu’il correspond a une application Java ` classique. e e e Dans ce mode.UserTransaction). Cependant il peut s’av´rer n´cessaire d’indiquer le serveur e e d’application utilis´ dans le fichier de configuration (propri´t´s de la PMF) de la solution e ee JDO. Heureusement. e` F. L’API JDO de d´marcation des transactions e e (javax.Transaction) ne doit pas ˆtre utilis´e sous peine d’effectuer des transactions e e locales d´synchronis´es des contextes transactionnels g´r´s par le serveur d’application. Ce mode d’int´gration est tr`s classique pour de petites e e applications Web ayant un besoin de connectivit´ a la base. Ceci n’´tant d´crit dans aucune sp´cification. . Pour cela on distingue trois modes d’int´gration d´crits dans les sections qui e e suivent.transaction.Transaction).2 Int´gration JTA e Le produit JDO est int´gr´ au syst`me de gestion des transactions fournis par le serveur e e e d’application. la d´marcation transactionnelle de l’application est r´alis´e en utilie e e sant les APIs JTA (javax.366 ANNEXE F. Les librairies de la solution JDO peuvent ˆtre int´gr´es a l’applie e e e e e ` cation ou au serveur d’application.jdo.1 Aucune int´gration e Le produit JDO est utilis´ dans une application J2EE sans le lier au serveur e d’application.

ear) ou au niveau e ` du serveur. Il reste que c’est e e un sujet strat´gique pour bon nombre de grands ´diteurs logiciels et qu’il s’agit d’une e e sp´cification d´finie en dehors du cadre de J2EE.rar. L’int´gration sous forme d’un connecteur implique en principe l’int´gration JTA. ` F. Le produit est empaquet´ sous la forme d’une archive .xml ou xxx-ra.F. la solution JDO suit la sp´cification JCA (Java Connector e e Architecture). La sp´cification EJB3 qui ´merge ace e e e tuellement dans le cadre de J2EE est fortement inspir´e des r´sultats de JDO 2 mˆme si e e e elle reste en de¸a fonctionnellement. ou dans le fichier de propri´t´s de la solution JDO. On peut penser que ces deux sp´cifications concurrentes vont converger dans l’avenir car elles sont e bˆties sur les mˆmes principes.8. e e .xml (o` xxx est le nom du serveur d’appliu cation). Dans ce dernier cas les fichiers ee de configuration du connecteur permettent de d´finir le nom du fichier de configuration a e ` charger a partir du classpath. Il est e ensuite tr`s facile de faire la liaison entre l’application J2EE et la ressource enregistr´e e e dans JNDI. C’est tellement vrai que Speedo devrait supporter ces deux a e sp´cifications dans un avenir tr`s proche.8 Conclusion et perspectives La persistance d’objet Java a trouv´ un tr`s bon support avec JDO.7. Enfin les propri´t´s de la PMF peuvent ˆtre sp´cifi´es directement dans les fichiers de ee e e e configuration du connecteur ra. La e e PersistenceManagerFactory est instanci´e par le connecteur JCA fourni avec la solution e JDO. Ce mode d’int´gration est souvent appel´ ”int´gration JCA/JTA”. e e e Dans ce mode l’int´gration. Elle est n´anmoins appuy´e par des acteurs majeurs c e e de l’industrie logicielle ce qui lui donne une chance importante de s’imposer. La PMF est automatiquement enregistr´e dans l’annuaire JNDI du serveur. F. CONCLUSION ET PERSPECTIVES 367 Les librairies de la solution JDO peuvent ˆtre int´gr´es a l’application ou au serveur e e e ` d’application. Cet archive e peut ˆtre incluse dans l’application directement (c’est a dire dans un .3 Int´gration JCA / JTA e Le produit JDO est int´gr´ au serveur d’application comme un connecteur (ou un e e resource adapter ).

368 ANNEXE F. ` SPEEDO : UN SYSTEME DE GESTION DE LA PERSISTANCE .

.0/fr/deed.Intergiciel et Construction d’Applications R´parties e c 2006 R.fr) Annexe G Infrastructure M2M pour la gestion de l’´nergie e Annexe provisoirement indisponible.org/licenses/by-nc-nd/ 2.10:31) Licence Creative Commons (http://creativecommons. Balter (version du 19 janvier 2007 .

370 ANNEXE G. ´ INFRASTRUCTURE M2M POUR LA GESTION DE L’ ENERGIE .

destin´ a regrouper les d´finitions de termes et acronymes associ´s a e ` e e ` l’intergiciel. [Bundle] unit´ de conditionnement et de d´ploiement des applications OSGi e e [Chor´graphie] ensemble d’interactions qui peuvent ou doivent avoir lieu entre un ene semble de services (voir page 79). [SOAP] Simple Object Access Protocol (voir page 91). SCR. e [SGML] Standard Generalized Markup Language (voir page 84). e [OSGi] sp´cification ouverte d’une plate-forme de d´ploiement et d’ex´cution de services e e e Java. e [Axis] implantation de SOAP (voir page 90). [OSGi Alliance] consortium industriel ayant pour vocation la d´finition et la promotion e de la sp´cification OSGi. [Orchestration] ensemble d’interactions et d’actions internes dans lesquelles un service donn´ peut ou doit s’engager ainsi que les d´pendances entre ces actions (voir e e page 79). [JSR] Java Specifications Request. Fractal. Ce consortium sp´cifie ´galement des interfaces stane e dard d’´quipements principalement dans le domaine de la domotique.). [Beehive] implantation de SOAP (voir page 90). [SCR] (Service Component Runtime) mod`le a composants dynamiques orient´ service e ` e introduit dans la version 4 de la sp´cification OSGi. . . est encore tr`s incomplet. MBean. [POJO] (Plain Old Java Object) bon vieux objets Java n’ob´issant pas un mod`le de e e programmation particulier (JavaBean. [REST] REpresentational State Transfer (voir page 94). [RFE] Request For Extension. [UPnP] (Universal Plug and Play) pile de protocoles de d´couverte et d’utilisation e d’´quipements connect´s par un r´seau ad-hoc. [BPEL] Business Process Language (voir page 97). [XML] eXtended Markup Language (voir page 84).Glossaire Ce glossaire. e e e [UPnP Forum] consortium industriel ayant pour vocation la d´finition et la promotion e d’une pile de protocoles UPnP. e [WSDL] Web service Description Language (voir page 84). . EJB.

372 GLOSSAIRE .

Lazowska.. (2003). Goland. In Proceedings of the European Conference on Object-Oriented Programming (ECOOP’00).. Rozinat.. T. and Verbeek. F. In The MIT Press.. G.org. and Crupi.. Harvard University Press. [Almes et al. Second Edition. F. Chambers. Dumas. D. Springer Verlag. E. [Aalst et al. [Ancona et al. Casati. IEEE Transactions on Software Engineering. A. and Weerawarana. (1964). Concepts. ISBN 0-262-01092-5. D.. L... P.. Klein. (1977). 2005] Altenhofen..uk/. Liu.. Trickovic. S. (1986). [Alur et al. Kuno. Notes on the Synthesis of Form. D. D. 1977] Alexander. Leymann. Buildings. C. W. [Alexander 1964] Alexander. C. D.. France. Data and Knowledge Engineering. G. France.. [Alonso et al. BPMcenter. In Proceedings of the 24th International Conference on Software Engineering (ICSE’02).. [Altenhofen et al. Version 1. M. (2002). G. J. and Noe. S. (2003). pages 154–178. Boerger. M. ArchJava: Connecting software architecture to implementation. The Eden system: A technical review. [Andrews et al. C. 650 pp. Core J2EE Patterns: Best Practices and Design Strategies. and Lemcke. S. J. van Dongen. W. B. Smith. (1985). Black. IBM Corporation and Microsoft Corporation. Prentice Hall.apache. Advanced networked systems architecture. http://www.. Lagorio. Malks.. and Zucca.. (2000). M.. Web Services. In In Proceedings of the BPM’2005 Workshops: Workshop on Choreography and Orchestration for Business Process Managament. H. [Apache ] Apache. Schimm.. [Alexander et al.. (2005). Ouyang. Roller. and Silverstein. A. pages 187–197.. and Weijters... F. A.. Herbst. A Smooth Extension of Java with Mixins.. 2003] Alur. 2005] Aalst. Ishikawa. Y. Cambridge.. [Agha 1986] Agha. SE-11(1):43–59.co. Dholakia.. J. Construction. Curbera. J.. Actors: A Model of Concurrent Computation in Distributed Systems. Nancy.. (2003). A Pattern Language: Towns.. Thatte. D. H. (2005).org. [Aldrich et al. 2003] Aalst. Business Process Execution Language for Web Services. and Notkin.. MA. [ANSA ] ANSA. D. Sophia Antipolis and Cannes. G. K. An execution semantics for mediation patterns. 1216 pp. The Apache Foundation Software. Architectures and Applications. A... V. D. Standards proposal by BEA Systems. J. (2003). 47(2):237–267. 373 . E. 1985] Almes. ACM Press. Maruster. 2000] Ancona. BPMCenter Report BPM-05-25. Oxford University Press.. http://www. E.. J. C. I. 2003] Andrews.1.Bibliographie [Aalst et al. and Machiraju.ansa. H.. Choreography Conformance Checking: An Approach Based on BPEL and Petri Nets. Workflow Mining: A Survey of Issues and Approaches. 2003] Alonso. G. 2002] Aldrich. T.

. R. (2004).serviceinteraction. on Distributed Computing (DISC).. F. (1999).Axis. Stearns (2000b). and Vandˆme. [Barros et al. H.. Projet Web Services .sun. New York. M.-Z. D. G. (2005a)... S.objectweb. D. [Barros et al. D.. In Proceedings of the International Symposium on Distributed Objects and Applications (DOA’03). P. [Axis ] Axis.. A.Beehive. Part I. In Proceedings of the 2nd Internation Conference on Service-Oriented Computing (ICSOC). T. A critical overview of the web services choreography description language (ws-cdl). (2005b).org/bcel. R. In EDOC.. Developing Adapters for Web Services Integration. H. 2005b] Benatallah. Meysembourg. F. Freyssinet.. F... F.com/developer/onlineTraining/Beans/bean01/index. B. S. Ghezzi.. [Balter et al. Nancy. and Sturman. E. (2005a).html. [B. NY. B. 3(3). Stearns 2000b] B. M. Part II. D. 2000] Arregui. (2000).. [B.com. Duda.. . P. Pacull. Architecture and implementation of Guide. In Proceedings of the 16th International Conference on Advanced Information Systems Engineering (CAISE’04). [Benatallah et al. JavaBeans 101 Tutorial. 2003] Baude. G. Paire.Apache .sun.374 BIBLIOGRAPHIE [Arregui et al.. A Case for Message Oriented Middleware. Byte Code Engineering Library. (2004). Model-Driven Web Services Development. K. http://ws. France. C. J. pages 194–2003.. 2005a] Barros. Service interaction patterns. Makuhari..apache.html. Distributed and Parallel Database.R. http://java. A. Riveill.. 1999] Banavar. [Benatallah et al. BPTrends Newsletter. an o object-oriented distributed system. Smart monitors for composed services. Riga. Dumas. 1991] Balter. http://java. http://beehive. Casati. Roisin. In Proceedings of the 17th International Conference on Advanced Information System Engineering.org/asm/. Bernadat. (2003). pages 193–202. [Banavar et al. R. M. Springer. M. http://www. F. Projet Apache . Symp. CAiSE 2005. [Banˆtre and Banˆtre 1991] Banˆtre.. Motahari-Nezhad. and Morel. Portugal. Japan. The ObjectWeb Consortium. http://avalon.org. J. LNCS 1693. [Avalon ] Avalon. http://jakarta. Extended version available at: http://www. [BCEL ] BCEL. Heterogeneous component e coordination: The CLF approach. 4(1):31–67. C. [ASM 2002] ASM (2002).. From distributed objects to hierarchical grid components. Chandra. Scioville. and Toumani.. F. 4th International Enterprise Distributed Object Computing Conference (EDOC 2000). and Banˆtre..org/axis/.com/developer/onlineTraining/Beans/bean02/index. Strom. USA. 2004] Baresi. and Oaks. In Proceedings of the 3rd International Conference on Business Process Management.apache. pages 415–429. Casati. IEEE Computer Society.. [Ba¨ et al.. Caromel.org.. Stearns (2000a).apache. and Rivi`re. Les syst`mes disa a a a e ´ tribu´s : exp´rience du projet Gothic. Dumas.. M. 17(1).. In 13th Int. B. InterEditions. e e [Baresi et al.-P. A. Porto. L. Stearns 2000a] B. M. Decouchant. The Apache Avalon Project. M. and Sheng. Springer.. editors (1991)... (2005b). A. Dumas. D.. ASM: a Java Byte-Code Manipulation Framework. Latvia. Facilitating the Rapid Development and Scalable Orchestration of Composite Web Services.. 2005b] Barros. X. JavaBeans 101 Tutorial. Le Dot. (1991). M. Krakowiak.apache. and Hofstede. 2005a] Benatallah. 2004] Ba¨ ına ına. Computing Systems. Nguyen Van. and Guinea. Q.. [Beehive ] Beehive. Grigori. and Toumani. [Baude et al. Rousset de Pina.. A. Benatallah...

. J. http://www. N. e [Bruneton et al. [Bruneton et al. Y. N. [Bertino et al. ObjectWeb Consortium. csl. 32(7):38–45. G. D. Leymann. (1978). ´ [Bruneton 2001] Bruneton. (1990). Software–Practice and Experience. 2002] Bruneton. (1984). and Carpenter. volume 25 of SIGPLAN Notices. It’s the aspects.. G. . J. [Blakeley et al. France. Information Systems. 216 pages. (2005). 21(11):934–941. D. and Cook. E.object. [Bracha and Cook 1990] Bracha. Method overloading and overriding cause encapsulation flaw. and Rowley.. ASM: A code manipulation tool to implement adaptable systems. M. P. and Watkins. pages 303–311. 1982] Brownbridge. (2005). Goland.org. R. ACM Transactions on Computer Systems. [Bouraqadi 2005] Bouraqadi..org/current/asm-eng. and Randell. Lenglet. 2003] Bruneton. Guerrini. Languages and Applications (ECOOP/OOPSLA’90). W.. Plouzeau. In Proceedings of the Conference on Object-Oriented Programming: Systems. Implementing remote procedure calls.. 12(12):1147–1162.. (1999).. and Nelson. www. [Brinch Hansen 1978] Brinch Hansen. E. A. 2004] Bertino. A. [Birrell and Nelson 1984] Birrell. J. ACM Press.fr/FracTalk. [Burke 2003] Burke. [Bieber and Carpenter 2002] Bieber. M. O’Reilly. Peter Drayton. Pfau.. (1982). Messaging and Queueing Using the MQI: Concepts and Analysis. A.sys-con. [Birrell et al. 1999] Beugnard. In Object-Oriented Programming Languages and Systems. White paper. Habili` e tation a diriger des recherches... 1995] Birrell. Nelson.. (2002). and Lewis. J.objectweb. Coupaye. http://www. R. (2006).. Introduction to Service-Oriented Programming. H. The Newcastle Connection — or UNIXes of the World Unite! Software – Practice and Experience. ISBN: 0-596-00315-3. A matching algorithm for measuring the structural similarity between an xml document and a dtd and its applications. J´z´quel.org/fractal.pdf.openwings.. Mixin-based inheritance. 2004] Blow. A. G. Marshall. E. S. Dijon.ensm-douai. Harris. ` e [Beugnard 2006] Beugnard. Design and Development. IEEE Computer. A. Universit´ de Bretagne Sud. (2003). D. 21st ACM Symposium on Applied Computing (SAC). T. Specification v2. 25(S4):87–130. BPELJ: BPEL for Java.BIBLIOGRAPHIE 375 [Ben Albahari et al. [Blow et al. 1995] Blakeley. Un support d’ex´cution pour l’adaptation des aspects none fonctionnels des applications r´parties. T. 2(1):39–59. Kloppmann. (1995). [Brownbridge et al. Communications of the ACM. e asm. Java’s Developer’s Journal. 29(1):23–46. E. and Coupaye. G. (2004). C# Essentials.. and Brad Merrill (2002). In Journ´es Composants 2002 (JC’02). FracTalk: Fractal Components in Smalltalk. (1995). (2001). B. (2003). M. Network objects. F. Owicki. [Beugnard et al. B. and Wobber. (2002). 2002] Ben Albahari. L. B. Make e ing Components Contract Aware. J.com/story/?storyid=38104&DE=1. and Mesiti. (2004). Institut National Polytechnique de Grenoble. McGraw-Hill.. D. M. Contribution a l’´tude de l’assemblage de logiciels.. D. Technical report.-M... and Stefani. Distributed Processes: a concurrent programming concept. B. The Fractal Component Model.. F. [Beugnard 2005] Beugnard.. PhD thesis. Roller. G.. E.

36(9). Technical Report CU-CS-857-98. ObjectWeb. and Stal. Freund. 2004] Coulson... V.com/developerworks/library/ws-coor/. http://www. T. 2002b] Cabrera. L. T.objectweb. Volume 1: A System of Patterns. K.. [Cervantes 2004] Cervantes. (1998).org. (2003). N. [Carbon 2004] Carbon (2004). T. volume 16 of LNCS. John Wiley & Sons.. Web service transaction. (1974). IBM. [Chassande-Barrioz 2003] Chassande-Barrioz.objectweb. In Crnkovic. BEA. In Gelenbe. editors.. R. D. carbon.com/developerworks/library/ws-transpec/.. and Wallnau. A. N. P.. Balter. Heimbigner. (2004).. Cox. Universit´ Joseph Fourier (Grenoble 1). R. Springer Verlag. F. and Dechamboux. and Mang. The Perseus Project.. editors..org/. CBSE. ESPRIT Research Reports. B. L. R. (2004). 1995] Buschmann. A. Coulson. A. and Orchard.. Operating Systems. 2001] Clarke. pages 130–137. ws-transaction. Langworthy. M. editors (1994). R. Springer-Verlag. A. Meunier. 467 pp. Dept.. X. Hall. W. The Speedo Project. Fuggetta. S. In Proceedings of Middleware’01. Harris. [Chakrabarti et al.. PhD thesis. An efficient component model for the construction of adaptive middleware.. Klein. Y. [Campbell and Habermann 1974] Campbell. special issue on concurrent objectoriented programming. BEA.. D.. R.. and Parlavantzas. Microsoft. [Carzaniga et al. C. Blair. [Castor 1999] Castor (1999). F. F. and Rousset de Pina. G. I.. In Proceedings of the IASTED Software Engineering and Applications (SEA’04)... and Kaiser. Stafford... http://www. H. 2002] Chakrabarti. The COMANDOS Distributed Application Platform. (2004). of Computer Science. Lee. B. [Cervantes and Hall 2004] Cervantes. (1995).sourceforge. University of Colorado. Copeland. (2001). (2003). .. Cox. A. C... G. [Cahill et al. A. IBM. G. Schmidt. T. perseus. (2002a). N. e e France. and Hall. F. The castor project. Storey. Henzinger.. Rohnert. 1998] Carzaniga.. D. volume 2404 of LNCS. A.. (2002b). pages 89–102.. J. WS-Coordination. Sommerlad.. and Wolf. http://www. speedo.. 312 pp. Springer.net. J. Blair. P.ibm. ObjectWeb. S. Communications of the ACM... The Carbon Project. Web Service Coordination. H. Grace. pages 428–441. P. S.. In Proceedings of the 14th International Conference on Computer-Aided Verification (CAV). S.. M. and Uyema. Vers un mod`le a composants orient´ services pour supe ` e porter la disponibilit´ dynamique.376 BIBLIOGRAPHIE [Buschmann et al.. [CACM 1993] CACM (1993)..org..ibm. S. 2002a] Cabrera. E. de Alfaro. [Cabrera et al. H. A. A component model for building systems software. H. Jurdzinski... (2002). Pattern-Oriented Software Architecture. [Chassande-Barrioz and Dechamboux 2003] Chassande-Barrioz. an International Symposium. Interface Compatibility Checking for Software Modules.. A framework for constructing adaptive component-based applications: Concepts and experiences. Microsoft. and Habermann.. T. Springer-Verlag. J. Copeland..castor. G. H. Storey. M. and Thatte. J. Klein. [Coulson et al. G. Joolia.. K. Grenoble. 1994] Cahill. van der Hoek. A characterization framework for software deployment technologies. G. [Clarke et al. A. The specification of process synchronization by path expressions. [Cabrera et al. volume 3054 of Lecture Notes in Computer Science. Freund.

John Wiley & Sons. The design and implementation of the Clouds distributed operating system. volume 2192 of Lecture Notes in Computer Science.. clif. W. D. (2001). Vienna University of Technology. Krozak. A. S. Myhrhaug.. F. [Dowling and Cahill 2001] Dowling. Technical Report TUV-1841-2004-16. P. Springer-Verlag. Khalidi. Appelbe. and Nygaard. IEEE Computer Society. http://www. The K-Component architecture meta-model for self-adaptative software. Wien.. (2004).. Database Transactions Models for Advanced Applications. 2005] Dumas. R. F. Ananthanarayanan. R. Information Systems Institute. K. Asbury. Wiley. Cervantes. C.. Jonathan: an Open Distributed Processing Environment in Java. D. e [Donsez et al. New York. D.html. Ahamad.... F. 1989] Dasgupta. and Cahill. Mono: A Developer’s Notebook. D.org/tech/dods/index. M. and Wittkopf. In Proceedings of Reflection’01.. Morgan Kaufmann Publishers. In Davies. . In 2`me Journ´e Francophone sur D´veloppement de e e e Logiciels par Aspects (JFDLPA’05). O’Reilly. (1998). P. P. and Lalanda. and Wilkenloh. [Dillenseger 2004] Dillenseger. (2005). Raymond. (2004). K. K. J. B. [Dijkman and Dumas 2004] Dijkman. and D´sertot.. P. 304 pages. (2006). USA. editor (1990).org. 2003] Dudney. A dynamic servicee e oriented implementation for java EE servers. [Dasgupta et al.. USA. The CLIF Project. Donsez. B. Horn. Web Services Interaction Mining. (1989). S. S. Data object design studio. Norway. E. (2004). J..objectweb. 2004] Dustdar. LeBlanc. [Dumas et al.. Y. J. [Elmagarmid 1990] Elmagarmid. pages 81–88. Pearson.NET. ISBN: 0-596-00792-2. Aalst. R. J. 13(4):337–368. (1970). (2005). C. The Structure of the THE Multiprogramming System. C. [Dustdar et al. Ramachandran. J. and Hofstede. In Conf´rence Francophone sur le D´ploiement et la Reconfige e uration. and Baina. www-adele. Bernab´u-Aub´n. 3(1):11–46. In UbiMob’06: 3emes Journ´es Francophones Mobilit´ e e e et Ubiquit´. 1998] Dumant. [Edd Dumbill and M. 600 pp. (2006).. Norwegian Computing Center.BIBLIOGRAPHIE 377 [Dahl et al. M. M. D. Grenoble. Computing Systems. J2EE AntiPatterns. New York. Service-oriented design: A multiviewpoint approach.. pages 175–190.. J. 2006] D´sertot... R. [Donsez 2006] Donsez. [D´sertot et al. M.-J. Proceedings of Middleware’98: IFIP International Conference on Distributed Systems Platforms and Open Distributed Processing. and Donsez. FractNet: An implementation of the Fractal component model for . Chen.... NY.. 1970] Dahl.. J.. In 2006 IEEE International Conference on Services Computing (SCC 2006). W. Menon. France. (2003)... (2004). H. [Dumant et al. K.. W. ObjectWeb. W. 28-29 Octobre 2004. ACM Press. The SIMULA 67 common base language. [Escoffier and Donsez 2005] Escoffier. K. U. V.fr/fractnet/. A. e a Hutto. R. Oslo. (2004). Tran. M. A. R. Communications of the ACM. and Stefani..-B. O...imag. Courtage et d´ploiement dynamiques de composants pour e l’infrastructure d’´quipements UPnP. and Dumas. (1968). [Dijkstra 1968] Dijkstra. B. Process-Aware Information Systems: Bridging People and Software through Process Technology. UK. K. and Seitz. Bornstein. The Lake District. M. editors. 2004] Donsez. NY. International Journal of Cooperative Information Systems. SpringerVerlag. FROGi : D´ploiement e e de composants fractal sur OSGi. M. [Dudney et al. B. Bornstein 2004] Edd Dumbill and M. pages 147–158. 11(5):341–346. Gombotz..enhydra. Austria. N. Technical Report S-22. M. [Enhydra 2002] Enhydra (2002)..

. T. J.. Open-service-platform instrumentation: e e JMX management over OSGi. C. W. In Proceedings of the 13th International Conference on World Wide Web (WWW).. Johnson. Irvine. (2005). (1990). IEEE Internet Computing. In Proceedings of the 4th ACM/IFIP/USENIX International Conference on Distributed Systems Platforms and Open Distributed Processing (Middleware’03). New York. (2006). Gribble. (2000).. Addison-Wesley. Helm.-F.-C. E.. 1998] Fox. Analysis of interacting BPEL web services.. Paris. J. C. France. J. 416 pp. [Fassino et al. In Proceeding of Web Information Systems Engineering (WISE). In Workshop on Web Services. T. Transaction Processing: Concepts and Techniques... number 3806 in LNCS. Think : vers une architecture de syst`mes flexibles. (1998). S.. D. (2005). O. Bultan. S. [Gray and Reuter 1993] Gray. F. A Software Architecture for Open Service Gateways. and Vlissides. [Gamma et al. A. J.. [Gaaloul et al. USA. and Reverbel. PhD e ´ thesis. (2002). The JBoss extensible server. [Fauvet et al. An automaton-based approach for web service mediation. (2004). S.net. L. R. C. PhD thesis. (2001). IEEE Personal Communications. . Think: A software framework for component-based operating system kernels. A. 2006] Escoffier. Handling transactional properties in Web service composition.-P. B. NY. The SGML Handbook.. 44(2):289– 300. IBM Systems Journal. Dumas. Developing an osgi-like service platform for . 13th International Conference on Concurrent Engineering. Morgan Kaufmann. P. M. pages 621–630. The Eclipse 3.0 platform: Adopting OSGi technology.. pages 10–19. pages 344–373. Stefani. volume 2672 of Lecture Notes in Computer Science. (2003). and Godart. Y. [Gong 2001] Gong. New York City. Wrox Press. Rapicault. and Muller. 592 pp.. 2002] Fassino. M. and Benatallah.. [Goldfard 1990] Goldfard. Springer-Verlag. [Fleury and Reverbel 2003] Fleury. M. G. e e e pages 199–202. USA. (1997). and Watson. In Proceedings of the USENIX Annual Technical Conference. Ecole Nationale Sup´rieure des T´l´communications. [Fr´not and Stefan 2004] Fr´not. S. and Brewer. (2004). [Grimes 1997] Grimes. Adapting to network and client variation using infrastructural proxies: Lessons and perspectives. R. [Fu et al.. Hargrave. Architectural Styles and the Design of Network-based Software Architectures. and Hall.. New York. (2001). 2005] Gruber. D. Professional DCOM Programming.. McAffer. J. B. Duarte. M. Invited paper. Discovering Workflow Transactional Behavior from Event-Based Log. e ee [Fauvet and Ait-Bachir 2006] Fauvet. Antibes. J. A.. and Ait-Bachir.-Ph. In IEEE Consumer Communications and Networking Conference (CCNC’06) 2006. (1994). University of Califormia. 2004] Gaaloul. J. J. X. and Stefan. 2004] Fu. [Fielding 2000] Fielding. R. Design Patterns: Elements of Reusable Object Oriented Software. (2006). CoopIS. (2004). E. ACM Press. Springer 2005. pages 73–86. and ODBASE 2004. H. Chawathe. 1994] Gamma. R.378 BIBLIOGRAPHIE [Escoffier et al. NY. Lawall. R. and Reuter. Oxford Clarendon Press.-B.-C. Donsez. A. J. and Su. In Proceedings of the OTM Confederated International Conferences. USA. 6:64–70. pages 3–18. (1993).. 2005] Fauvet. DOA.... [Fassino 2001] Fassino. ISBN 3-540-30017-1. [Fox et al. D. In UbiMob’04: 1eres Journ´es Francophones Mobilit´ et Ubiquit´. [Gruber et al. Bhiri.

[Handley et al. NC (USA).org/internet-drafts/draft-ietf-sip-rfc2543bis-02. jakarta. http://www. J. Java data objects 2. Asheville.org/en/jsr/detail?id=12. S. 1988] Jul.com/products/jbossas. M.. (1993). Exception handling in workflow management systems. RSA Security and VeriSign. (1993). M. (1969).org/en/jsr/detail?id=243.. A. [Hibernate 2002] Hibernate (2002). Powell. Interposition agents: Transparently interposing user code at the system interface.0 specification. Communications of the ACM. http://www. [joram 2002] joram (2002). Standards proposal by IBM Corporation.BIBLIOGRAPHIE 379 [Gunnerson and Wienholt ] Gunnerson.jcp. [Jones 1993] Jones.hibernate. In Proceedings of the 2002 International Conference on Parallel and Distributed Processing Techniques and Applications. 568 pages. 26(10):943–958. and Alonso. IEEE Transactions on Software Engineering. [Hagen and Alonso 2000] Hagen. E. [Hagimont and De Palma 2002] Hagimont. (2004). C. JBoss Application Server. Fine-grained mobility in the Emerald system. ACM Transactions on Computer Systems. . Java 2 Standard Edition. (2000). and De Palma. http://jcp. E..com/products/j2se.1. [J2EE 2005] J2EE (2005). ISBN 1590595017. 6(1):109–133. J. G. H.. In Proceedings of the 14th ACM Symposium on Operating Systems Principles. [JDO 2002] JDO (2002). http://java. Asheville.0 . (2000). Schooler. H. N. 2000] Handley. [Hoare 1969] Hoare. [Jul et al.. C. E. (2006). and Black. A.. pages 69–79. http://jcp. (1988). (2002). G. The Hivemind Project. D. Enterprise javabeans 3. [Kaler and Nadalin ] Kaler. 1993] Hamilton. An axiomatic basis for computer programming.txt. A. and Nadalin. java. Microsoft Corporation. A Programmer’s Introduction to C# 2.org/en/jsr/detail?id=181. [JSR-000220 2006] JSR-000220. M.objectweb. http://www. and Mitchell. Schulzrinne.com/products/j2ee. [Hivemind 2004] Hivemind (2004). B. http://www. Sun Microsystems. Subcontract: A flexible base for distributed programming.sun. Removing Indirection Objects for Non-functional Properties. N..com/products/jdo/. L. JORAM.jcp. Relational persistence for java and .sun. Java Data Objects. http://www.. NC (USA). SIP: Session Initiation Protocol.net.org/.org/hivemind.ietf. S. [Hamilton et al.org/aboutJava/communityprocess/final/jsr220/index. In Proceedings of the 14th ACM Symposium on Operating Systems Principles. pages 80–93.html.0. [JSR-000243 2006] JSR-000243.org/joram/. R. [J2SE 2005] J2SE (2005). Web services security policy language (wssecuritypolicy) version 1. Web Services Metadata for the JavaT M Platform. http://www. (2006). [JSR 181 ] JSR 181.apache. http://java. and Rosenberg. 12(10):576–585. Java data objects (jdo) specification.an extension to the jdo specification.jboss. S. ObjectWeb. Levy.sun. C. [JBoss Group 2003] JBoss Group (2003). N. Java 2 Enterprise Edition. and Wienholt. G. Apress. [JSR-000012 2004] JSR-000012. Hutchinson. volume 27 of Operating Systems Review.

[Lendenmann 1996] Lendenmann. E. K. Burdett. Concurrent Programming in Java. V. LDAP: Framework. Communications of the ACM. R. 2002] Kon. F. and Campbell. V. Prentice Hall. (2002). 2nd edition. IEEE Distributed Systems Online. In Schewe. R. iContract . The case for reflective middleware. and Stefani. M. Springer-Verlag. 312 pp. MIT Press. D. and Williams.. Languages. J. (1999). G.. (2005a). A. [Leclercq et al. J. [Kon et al. and Applications (OOPSLA’98). Journal of Internet Technology. N.. E.. R. G. pages 132–140.. [Limthanmaphon and Zhang 2004] Limthanmaphon. DREAM: a component framework for the construction of resource-aware. and Pillevesse. [Lea 1999] Lea. G. Budapest. 28(4):154. Communications of the ACM (special issue. J. M. The Java Series. C. In Conference on Object Oriented Programming. 1975] Levin. and Wulf. J.The Java Design by Contract Tool. [Kiczales et al. configurable middleware. (1975). Meyer. [Liang and Bracha 1998] Liang.. Hugunin. Corwin.. Addison-Wesley. [Kramer 1998] Kramer. A framework for dynamically configurable and reconfigurable network-based multimedia adaptations. Blair. (1996).0. In Proceedings of the Technology of Object-Oriented Languages and Systems (TOOLS) Conference. (2001). The Art of the e Metaobject Protocol. G. (1998). 412 pp. (2004). Lafon. 345 pp. 8(5):66–72. Le Croisic. (1998). and Bobrow. Understanding OSF DCE 1. (2005b).. and trends.. ACM Computing Surveys. Kersten.. practices.. Hilsdale. (2005). B.1 for AIX and OS/2. 5(4):57–66. An overview of AspectJ. and Hagimont. F. COOL: System Support for Distributed Object-oriented Programming. T. In Proceedings of the Fifth ACM Symposium on Operating Systems Principles. G. and Griswold.. W3 CCandidate Recommendation. 2004] Layaida. E. Palm. (2004). Proceedings of the Fifteenth Australian Database Conference. . Qu´ma. Database Technologies 2004. des Rivi`res. C. In Proceedings of ECOOP 2001.380 BIBLIOGRAPHIE [Kavantzas et al. Policy/mechanism separation in hydra. [Kiczales et al. (1991). and Bracha. R.. Dunedin. volume 2072 of LNCS. F. Special Issue on Real Time Media Delivery over the Internet. D.. Aspect-Oriented Programming. B. G. Fletcher. [Kiczales 1996] Kiczales. W.. pages 295–307. In 4`me Conf´rence Francophone autour des Composants Logiciels (avec CFSEe e RENPAR 2005). V. pages 327–355. IEEE Internet Computing. R. [Layaida et al. Version 1.. Concurrent Object-Oriented Programming. W. Web Services Choreography Description Language. (2004). [Leclercq et al. DREAM : un canevas e logiciel a composants pour la construction d’intergiciels orient´s messages dynamiquement con` e figurables. and Barreto. (1993).. Web service composition transaction management.. Systems. [Koutsonikola and Vakali 2004] Koutsonikola... [Levin et al. S. Atallah. Pollack.. J. Y. (1996). S. Costa.. 2005a] Leclercq. editor)..-D. and Stefani.. O. 1993] Lea. 2005b] Leclercq. Dynamic class loading in the java virtual machine. New Zealand. G. H... A. Australian Computer Society. M. ADC. D. 2001] Kiczales. France. Quema. editors. and Vakali.-B.. D. M. 2005] Kavantzas. [Lea et al. 45(6):33–38. S. G. Ritzinger. 6(9). ADC 2004. J. B. 1991] Kiczales. Hungary. Y. W. and Zhang. Jacquemot. 36(9):37–47. volume 27 of CRPIT.-B. Cohen..

Open Source Middleware. IEEE Computer. Discovery and Integration version 3. A. [Meyer 1992] Meyer. Recommendation X.html.. England... [. [ObjectWeb 2004] ObjectWeb (2004). Powell. The Lake District. A. Rouvoy. B. Nelson. [ODP 1995a] ODP (1995a). IEEE Computer.html. Gibbons.0.. 231 pp.objectweb. [msmq 2002] msmq (2002). [Martens 2005] Martens. [Merle et al. P.. Universal Description. N.org. Concepts and Experiments in Computational Reflection.objectweb. P. pages 147–155.edu. 3rd edition.. T. editor.. Applying Design by Contract.org/. 23(5):44–53.. http://www. 1994] Mitchell. (1994). 7-11 Oct.. Inc. Proceedings of the 8th International Conference on Fundamental Approaches to Software Engineering (FASE 2005). and Yellin. R. kilim. Microsoft Corp. 550 pp. http://archive. (2005). [Mitchell et al. pages 138–155.org. (2002). editors (1969).objectweb. Florida. R. 25(10):40–52. L.org. [OASIS UDDI 2005] OASIS UDDI (2005). B. and Randell. Addison-Wesley. The Java Virtual Machine Specification.microsoft.com/msmq/. Moroy. pages 122–131. M. and Contreras.902 & International Standard 10746-2: “ODP Reference Model: Foundations”. Software Engineering: A Report On a Conference Sponsored by the NATO Science Committee. 31(3):300–312. Microsoft. NATO. P. J. September 15-18 1998. F. (1990).. Scientific Affairs Division. and van Staveren. Analyzing Web Service Based Business Processes. S. Communications of the ACM. 1968. P.. Y. ITU-T & ISO/IEC. In Proceedings of COMPCON. (1987). Enhydra XMLC. H. Springer. (1968). Hamilton. Garmisch... Tanenbaum. van Rossum. http://www. B... [Maes 1987] Maes. Amoeba: A distributed operating system for the 1990s.. The Kilim Project. editors. In Proceedings of the Conference on Object-Oriented Programming Systems. fractal. J. G. pages 19–33. S.odmg. Madany. S.. The Object Data Management Group. 1990] Mullender. Mass produced software components. In Cerioli. J. J. (1988). [Liskov 1988] Liskov. [Mullender et al. C.NET ] . Kougiouris. and Radia. [Monson-Haefel 2002] Monson-Haefel. B. Khalidi.dstc.microsoft. P. Kessler. [Middleware 1998] Middleware (1998). Germany.com/net.. G. [Naur and Randell 1969] Naur.org/tutorials/explorer/index..org. and Randell. O’Reilly & Associates. Enterprise JavaBeans. Software Engineering: A Report On a Conference Sponsored by the NATO Science Committee. An overview of the Spring system. 2004] Merle. Microsoft http://www. [ODMG ] ODMG. P. ObjectWeb. IFIP International Conference on Distributed Systems Platforms and Open Distributed Processing. P. M. M.objectweb. [McIlroy 1968] McIlroy. R. http://xmlc. Orlando. Languages. Y. M.uddi. Message Queuing (MSMQ). van Renesse. B.au/AU/research news/odp/ref model/standards. In Naur. R. A. [Objectweb Enhydra 2005] Objectweb Enhydra (2005). [ObjectWeb 1999] ObjectWeb (1999). (1992). http://www. 475 pp.. Fractal Explorer. (1996).BIBLIOGRAPHIE 381 [Lindholm and Yellin 1996] Lindholm. and Applications (OOPSLA’87). Distributed programming in Argus. . USA.NET. (2004). G. http://www.

.. [Plexus 2004] Plexus (2004). The Object Management Group. M. e [RM 2000] RM (2000). [Open Group ] Open Group. [Rozinat and Aalst 2005] Rozinat. (2005). S.. Proceedings of Reflection 2001. The Plexus Project. A. Technique ` et Science Informatiques. M. Microsoft Press. C. Edmond. 12(2–3):117–133. the Third International Conference on Metalevel Architectures and Separation of Crosscutting Concerns. Web services and business transactions. M. Japan. G. Recommendation X. d´cembre 2005. Scalagent : une plate-forme a composants pour applications asynchrones. R. Balter. R. [Qu´ma et al. plexus.omg. [Papazoglou 2003] Papazoglou. Netherlands. www... G. (2003). Bellissard.une approche de la construction d’infrastructures logicielles radicalement configurables.ac. and Little. Kyoto. Oracle toplink. OSGi World Congress. E.. J. 2004] Qu´ma. .903 & International Standard 10746-3: “ODP Reference Model: Architecture”. France. (2005). Paris.codehaus. BETA Working Paper Series. [Peltz 2003] Peltz. [Platt 1999] Platt. Eindhoven. W.objectweb.org. What’s in a Service? Distributed and Parallel Databases. IEEE Computer. The Apache Directory Server and the OSGi Service Platform. JAC : a flexible solution for aspect oriented programming in Java. WP 144. http://www. 12-15 October 2005. Computing Systems. gotm.lancs.opengroup. The Pattern Languages of http://www. Freyssinet.. http://www. Springer-Verlag. R.hillside. D. 7-8 April 2000. Held in conjunction with Middleware 2000. e e e S. 2001] Pawlak. http://archive. and Matsuoka. [Qu´ma 2005] Qu´ma. Inside COM. Conformance Testing: Measuring the Alignment Between Event Logs and Process Models. volume 2192 of LNCS. (1997).. V. A..dstc. Eindhoven University of Technology. [Rouvoy 2004] Rouvoy. and Aalst. http://www. Programs (PLoP) Conference Series. Web services orchestration and choreography. Technical Report 6. Microsoft Press. (2004). A. [Rogerson 1997] Rogerson. (2005). S. and ter Hofstede. 2002] O’Sullivan. D. D.net/conferences/plop..uk/computing/RM2000/.org/. The GoTM Project. Redmond. 23(2). D. C. K.org.htm. Duchien. 36(10):46–52. D.. (2001). and Lacourte. Understanding COM+. 1995] Parrington. Th`se de Doctorat de l’Institut National e Polytechnique de Grenoble.au/AU/research news/odp/ref model/standards. (2004).382 BIBLIOGRAPHIE [ODP 1995b] ODP (1995b).comp. Florin. pages 1–24. Infolab. ITU-T & ISO/IEC. [PLoP ] PLoP.. V. L. S. The design and implementation of Arjuna. e e Vers l’exogiciel . [PicoContainer 2004] PicoContainer (2004). 256 pp. F´liot. [OMG ] OMG. [Oracle 1994] Oracle (1994). Wheater.edu. L. A. 8(2):255–308. Shrivastava. ObjectWeb. (2002).. USA. S. [Pawlak et al.oracle.html.html. editors.org. (1999). The PicoContainer Project. Workshop on Reflective Middleware. In Yonezawa.org. L.com/technology/products/ias/toplink/index. and Seinturier.picocontainer.. [O’Sullivan et al. (2003). (1995). [Parrington et al. http://www. Tilburg University. [Rodriguez 2005] Rodriguez.

D. pages 198–204. [Sun JSR-000152 2003] Sun JSR-000152 (2003). Ted Neward. Java Servlet 2. T. L. JavaMail Specification.org/aboutJava/communityprocess/final/jsr127/index2. 2006] Seinturier.. Miller.sun.. Gourhant. 2(4):287–337... Y. 378 pages. Sturman. http://jcp. of the 6th International Conference on Distributed Computing Systems.. [Schmidt et al. [Sun JSR-000153 2003] Sun JSR-000153 (2003). A component model engineered with components and aspects.html. www. IEEE. Java Remote Method Invocation (RMI). B. K.. G.. [Schantz et al. J2EE Application Validation Kit. and Ward..jcp..html. SIP Servlet API. C. M. Shared Source CLI Essentials.. and Geoff Shilling (2003). JavaServer Pages 2. M. pages 250–259.com/developerworks/library/specification/ws-sca/. Stal. Rohnert. Springer. 666 pp. pages 139–153. S. and Bono.sun.. In Proceedings of the 6th International Conference on Distributed Computing Systems. M. IEEE. www-128. http://java. [Strom et al. . PatternOriented Software Architecture. G. Thomas.org/aboutJava/communityprocess/final/jsr116/index. 2000] Schmidt.4 Specification. Volume 2: Patterns for Concurrent and Networked Objects..org/aboutJava/communityprocess/final/jsr153/. [Smith 1982] Smith. Ruffin. http://www.. Mosseri.html. R.1 Specification.html. Mass. L. (1986). Pessemier.. and Valot. C. John Wiley & Sons. (2000).html. Reflection And Semantics In A Procedural Language. [Spring 2004] Spring (2004). 1986] Schantz.. http://jcp.org. M. http://jcp. Java Entreprise Bean 2. R. In Proceedings of ISSRE’98.org/aboutJava/communityprocess/maintenance/jsr904/index. Service Component Architecture Assembly Model Specification. In Proc. 1989] Shapiro. H. 1998] Strom. C.0 Specification. and Coupaye..assessment and perspectives. Cambridge. Gryphon: An Information Flow Based Approach to Message Brokering. M. N.. [Sun JSR-000154 2003] Sun JSR-000154 (2003). The Spring Framework. Habert. [Seinturier et al.ibm.BIBLIOGRAPHIE 383 [SCA 2005] SCA (2005).. SOS: An object-oriented operating system . [Sun 2005] Sun (2005). http://jcp. http://jcp. B. (1989). PhD thesis. Massachusetts Institute of Technology.com/j2ee/avk/.org/aboutJava/communityprocess/final/jsr154/index. volume 4063 of Lecture Notes in Computer Science.. ISBN 0-596-00351-x.springframework. T. (1998). Chandra. The architecture of the Cronus distributed operating system. [Shapiro et al. 2003] Stutz. R. Duchien. In Proceedings of the 9th International SIGSOFT Symposium on Component-Based Software Engineering (CBSE’06). M. (2006). (1982). Kaplan.org/aboutJava/communityprocess/final/jsr152/index.. [Sun JSR-000116 2003] Sun JSR-000116 (2003). and Buschmann. (1986).com/products/jdk/rmi/. MIT/LCS/TR-272. D. http://java. [Sun JSR-000904 2000] Sun JSR-000904 (2000). Computing Systems. (USA). [Stutz et al. Mukherjee. Banavar. Structure and encapsulation in distributed systems: The proxy principle. O’Reilly. [Sun Microsystems 2003] Sun Microsystems (2003). D. F. [Shapiro 1986] Shapiro. [Sun JSR-000127 2004] Sun JSR-000127 (2004).. JavaServer Faces Specification. L.

. incubator. http://struts. Schmid. [The Apache Software Foundation 2006] The Apache Software Foundation (2006).. [Szyperski 2002] Szyperski. Medor: a middleware framework for enabling distributed object requests. editor.. o o John Wiley & Sons. W. D. 2005] Suv´e. and Jonckers. http://medor.org/. M. Dept. 2nd ed. C. [UN/CEFACT and OASIS 1999] UN/CEFACT and OASIS (1999). (2003). . and Pfister. (2001).apache... (2003). V. K. K. volume 2072 of LNCS. ACM Transactions on Computer Systems.org/. Addison-Wesley. 2001] Tatsubori.be/Members/dsuvee/papers/splatsuvee2. A Bytecode Translator for Distributed Execution of “Legacy” Java Software. Vanderperren. 2002] V¨lter. F. July 8–12. J.html. Universal Plug and Play Forum.upnp. In ECOOP 2001 – ObjectOriented Programming.objectweb. [The Objectweb Consortium 2000] The Objectweb Consortium (2000). management. (1998). Workshop Reader of 10th Eur. Technical report. [Team 2003] Team. Springer Verlag. http://www.vub. 2003] van Renesse. 100. Sasaki. and Wolff. Report No.objectweb. A multi-level model for web service composition. 21(2). (2002). R. C. and Vossen.org/. pages 127–130. K. In Workshop Software-engineering Properties of Languages and Aspect Technologies (SPLAT) at AOSD’05..Beyond Object-Oriented Programming. 462 pp. on Object Oriented Programming ECOOP’96. Component-oriented programming: WCOP’96 workshop report.org. (1997). FuseJ: An architectural e e description language for unifying aspects and components. and Vogels. University of Muenster. Jorm: a framework for mapping typed objects to various storage systems. [Tatsubori et al. W. http://jorm. In M¨hlh¨user. http://fractal.ebxml. [V¨lter et al. T. ssel.org/projects/tuscany. The Tuscany Project. M.. [van Renesse et al. E. Heidelberg. C.