RPC & Web Services. Benjamin Canou - Christian Queinnec Master 2 Informatique UPMC - Spécialité STL Cours 2 du 26/11/2012



Documents pareils
Programmation Web Avancée Introduction aux services Web

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Introduction aux «Services Web»

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

Architecture Orientée Service, JSON et API REST

Intégration d'applications à "gros grain" Unité d'intégration : le "service" (interface + contrat)

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Le modèle client-serveur

Le cadre des Web Services Partie 1 : Introduction

Messagerie asynchrone et Services Web

SOAP Concepts Application à Glassfish

RMI le langage Java XII-1 JMF

4. SERVICES WEB REST 46

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Application Web et J2EE

Architectures Web Services RESTful

Les Architectures Orientées Services (SOA)

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

IFIPS 5 / Nouvelles Architectures Logicielles Projet : Bus de web services avec «moteur» BPEL

Architectures n-tiers Intergiciels à objets et services web

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Optimisation des échanges et traitements XML

Mise en œuvre des serveurs d application

2 Chapitre 1 Introduction

Programmation Web. Madalina Croitoru IUT Montpellier

Environnements de Développement

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Glossaire. ( themanualpage.org) soumises à la licence GNU FDL.

Remote Method Invocation en Java (RMI)

Les Services Web. Jean-Pierre BORG EFORT

Cours CCNA 1. Exercices

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Conception de serveurs d'applications ouverts

BPEL Orchestration de Web Services

Intergiciel - concepts de base

Architectures web/bases de données

Software Engineering and Middleware A Roadmap

WebSSO, synchronisation et contrôle des accès via LDAP

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Urbanisation des Systèmes d'information

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Systèmes d'informations historique et mutations

Java - RMI Remote Method Invocation. Java - RMI

Programmation répartie RPC & RMI

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Introduction aux intergiciels

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Sécurité des Web Services (SOAP vs REST)

18 TCP Les protocoles de domaines d applications

Architecture applicative et Cartographie

Composants Logiciels. Le modèle de composant de CORBA. Plan

Hébergement de sites Web

Volet Synchrone pour Client Lourd

Plateforme PAYZEN. Définition de Web-services

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

Serveurs de noms Protocoles HTTP et FTP

Remote Method Invocation (RMI)

Formation en Logiciels Libres. Fiche d inscription

Projet gestion d'objets dupliqués

Classification : public 1/59

Module BD et sites WEB

GENERALITES. COURS TCP/IP Niveau 1

OS Réseaux et Programmation Système - C5

Introduction aux. services web 2 / 2

Programmer en JAVA. par Tama

Plan du cours. Autres modèles pour les applications réparties Introduction. Mode de travail. Introduction

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Internet. DNS World Wide Web. Divers. Mécanismes de base Exécution d'applications sur le web. Proxy, fire-wall

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Présentation Internet

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

L3 informatique Réseaux : Configuration d une interface réseau

Web Services : Beyond the peer-to-peer architecture

Services OSI. if G.Beuchot. Services Application Services Présentation - Session Services Transport - Réseaux - Liaison de Données - Physique

Approche Contract First

Java Naming and Directory Interface

«Clustering» et «Load balancing» avec Zope et ZEO

L3 informatique TP n o 2 : Les applications réseau

Bases de programmation. Cours 5. Structurer les données

CORBA haute performance

Technologies pour Web Services faciles : REST, JSON

Les services usuels de l Internet

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Urbanisation des SI. Des composants technologiques disponibles. Urbanisation des Systèmes d'information Henry Boccon Gibod 1

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Les nouvelles architectures des SI : Etat de l Art

L architecture des services Web

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

.NET remoting. Plan. Principes de.net Remoting

Java et les bases de données

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

La base de données XML exist. A. Belaïd

Développement des Systèmes d Information

Intégration de systèmes client - serveur Des approches client-serveur à l urbanisation Quelques transparents introductifs


L annuaire et le Service DNS

BES WEBDEVELOPER ACTIVITÉ RÔLE

Transcription:

Benjamin Canou - Christian Queinnec Master 2 Informatique UPMC - Spécialité STL Cours 2 du 26/11/2012

À l'origine : RPC Fonctionnement général Historique & Tour d'horizon

Fonctionnement général des RPC 1 / 2 À l'origine une norme (RFC 1057), aujourd'hui un terme générique Principe général : Un serveur fournit un service Appelable depuis un client Prenant éventuellement des paramètres Retournant éventuellement une valeur (fonction distante) Sont en général associés : Un annuaire des services / fournisseurs de services Une interface typée de chaque service Non liée au langage (souvent : procédural + types simples) Liée au langage (souvent : objet + types objet) Une intégration au langage : appel distant appel normal À quoi ça sert? Programmation répartie Communication inter-processus Et bien sur : Services Web 3 / 42

Fonctionnement général des RPC 2 / 2 Mécanisme très semblable à un appel de fonction local : Valeurs endroits connus Saut vers appelé Résultats endroits connus Reprise appelant Mais il y a de nombreuses difficultés techniques : Non immédiateté des transferts d'information Risque d'erreur dans la propagation Copie des données Coût des transmissions Niveau de sécurité différent Donc on repose sur des briques de base saines : Représentation des données bien définie et portable Langage de description d'interfaces (IDL) typé Génération automatique de code 4 / 42

Exemple : appel à distance d'une bibliothèque 1 / 2 code bibliothèque code bibliothèque2 serveur bibliothèque relais proxy génération? On veut rendre accessible à distance une bibliothèque Sans changer son implantation Sans changer le code du programme Donc on insère du code des deux côtés : Côtéclient, unebibliothèquequiprésentelamêmeinterfaceettransmetslesappels Côté serveur, un recepteur d'appels qui appelle la bibliothèque originale 5 / 42

Exemple : appel à distance d'une bibliothèque 2 / 2 Code original : Bibliothèque originale : 1 : z = f ( x, y ) ; 2 : function f ( x, y ) { return /* */ ; } Code serveur à écrire : 1 : function process_invocation ( ) { 2 : var fname = receive ( ), args = receive ( ) 3 : i f ( fame == " f " ) { 4 : send ( encode ( f ( decode ( args [ 0 ] ), decode ( args [ 1 ] ) ) ) ) ; 5 : } else i f /* */ 6 : } 7 : while ( true ) process_ invocation ( ) ; Nouvelle bibliothèque client à écrire : 1 : function f ( x, y ) { 2 : send ( " f " ) ; 3 : send ( [ encode ( x ), encode ( y ) ] ) ; 4 : return decode ( receive ( ) ) ; 5 : } La magie est dans : encode, decode, send et receive, et on ne veut pas écrire ce code 6 / 42

Technologies RPC Systèmes complets et briques indépendantes Critères de choix

Représentation et transmission des données 1 / 2 1982: Sun introduit NFS, "The network is the computer", avec RPC et XDR À l'ancienne : XDR (external Data Representation), sous couche de RPC Tout est transmis par mots de 4 octets L'ordre des octets est fixé Types de données C (entiers, flottants, caractères simples, répétitions, structures, tableaux) Sérialisation des langages modernes : Valeur du langage suite d'octets Gestion du partage, des cycles Chargement dynamique de code / classes / modules 8 / 42

Représentation et transmission des données 2 / 2 Pour échanger des données, on sérialise, mais : Il faut assurer la sécurité d'exécution : Que le client n'appelle que des fonctions du serveur autorisées Que le serveur vérifie les types des paramètres Que le client vérifie les types des résultats On peut alors : Générer les vérifications à partir d'un IDL Reposer sur une sérialisation sûre Utiliser la réflexion Il faut savoir traiter les pointeurs de code : Reposer sur un mécanisme d'annuaire pointeur de code = appel distant (callbacks) Transmettre du code à charger dynamiquement 9 / 42

Exemples de technologies RPC 1 / 4 Exemple d' IDL bas niveau : ASN1 (Abstract Syntax Notation One) Un langage de description de données (et de signatures de fonctions) Types de base: entier, flottant, booléen, caractère Composeurs de types: enregistrement, répétition, union Ne fixe pas le format de sérialisation (ex BER, DER) Utilisé dans les normes de sécurité et télécoms Utilisé pour les certificats X509 (navigation HTTPS) Exemple d' IDL haut niveau : Mozilla IDL Description d'objets (méthodes, champs) Hiérarchie de classes Paramètres, valeurs de retours et champs typés Paramètres d'entrée et de sortie Utilisé entre le moteur (C++) et l'interface (JavaScript) 10 / 42

Exemples de technologies RPC 2 / 4 Exemples d'intergiciels : Corba, DBUS, DCOM Fournisseur de services distants et partagés (IPC) ORB (Object Request Broker) Indépendance vis-à-vis des langages de programmation (IDL) Fonctions d'introspection et découverte fsservice(argument,) orbinvoke(fs,"service",arguments) ORB ORB orbinvoke(fs,"service",arguments) 11 / 42

Exemples de technologies RPC 3 / 4 Java et RMI RMI RPC en et pour Java IDL Interface (compatibilité Corba avec idl2java, java2idl) Service associé d'annuaire JNDI Sérialisation ayant de nombreuses propriétés supplémentaires Particularisable (par surcharge) Transmission de classes (nom et/ou code) Gestion des versions des classes Resynchronisable 12 / 42

Exemples de technologies RPC 4 / 4 XML et SOAP XML: un langage parenthésé décrivant des arbres régis par une grammaire (DTD, XML schéma, RelaxNG) Pourquoi donc ne pas échanger en XML? Transmission de l'appel en XML : 1 : <f> 2 : <x>3 14</x> 3 : <y>2</ y> 4 : </ f> Transmission du résultat en XML : 1 : < fresult > 1 0</ fresult > 1998: XMLRPC 1999: SOAP 2005: JBI (XML + pièces jointes) 13 / 42

Variantes & critères de choix Schéma récapitulatif 1 / 6 fsservice(arg) sérialisation [fs,service,args,émetteur] recherche client IDL UDDI JNDI Corba binaire (XDR, RMI) textuel (XML, SOAP) transport synchrone (HTTP, connexion) asynchrone (SMTP) serveur éventuellement retour exécution désérialisation 14 / 42

Variantes & critères de choix 2 / 6 Choix du formalisme Comment décrire les services? Interface en Java (compilateurs idl2java, java2idl) Description en IDL (compilateurs de codeur/décodeur vers langages de programmation à la Corba) Descripteur XML (WSDL) (compilation/interprétation des descripteurs) Annotations dans code Java, C# pour engendrer le précédent descripteur Utilisation des capacités réflexives pour ne même plus annoter Soucis sur certains types de données 15 / 42

Variantes & critères de choix Choix de la sérialisation 3 / 6 Comment coder/empaqueter l'information? Binaire : efficace mais difficilement déployable, couplage client/serveur, peu évolutif Textuel : verbeux mais universel, déployable (print/read), assez évolutif, relayable, vérifiable Soucis pour pointeurs, fonctions, sans oublier l'émetteur! Autres considérations: Sécurité, signature, chiffrement Intégrité (résistance aux pannes), resynchronisation, Gestion des versions client/serveur, auto-description Qualité de service, priorité, relais, 16 / 42

Variantes & critères de choix Choix de la recherche 4 / 6 Où se trouve un fournisseur de services? Ports bien connus Sites bien connus (DNS) Annuaire caché dans les ORB (Corba) Annuaire UDDI, JNDI, JINI, LDAP, UPnP, JBI Dans tous les cas, un fournisseur de services s'enregistre sous un nom dans un annuaire par lequel il pourra être retrouvé, il spécifie aussi comment on doit lui parler 17 / 42

Variantes & critères de choix Choix de couplages 5 / 6 Du côté du langage du serveur, on peut souhaiter voir: Un objet Request lié au cadre employé (Axis par ex) Un DOM (ou un SAX dégraissé) Un POJO (Plain Old Java Object) Idem côté client 18 / 42

Variantes & critères de choix Choix du transport 6 / 6 Synchrone (HTTP, FTP, connexion) ou asynchrone (SMTP, RSS) Avec retour ou pas Répétition : une fois, au plus une fois, au moins une fois 19 / 42

Application aux Web Services Description d'un service SOAP en WDSL Exemple de requête en SOAP Appels distants en Perl & Java

Usage d'un descripteur WSDL 2 client annuaire UDDI ou autre 1 WSDL fournisseur de services 3 WSDL L'initiative UDDI a été abandonnée La génération de la bibliothèque d'exécution peut être interprétée (Perl) ou compilée (wdsl2java) 21 / 42

Concepts WSDL service: une collection de points d'accès (port) port: une adresse réseau (numéro IP, URL) et un couplage couplage ou binding: un protocole (HTTP, SMTP, etc) et un format de données (SOAP, une grammaire XML, etc) pour chaque opération (et chacun de ses messages) Les opérations définissent des échanges de messages (requête seule, requête/réponse) et sont regroupées dans les porttypes Dans JBI, on a les conversations complètes chaque message définit sa signature c'est-à-dire ses données et leur type Enfin le tout est imbriqué dans des définitions 22 / 42

Exemple WSDL 1 / 5 Début du fichier (tiré de la doc W3C) : Espaces de noms classiques targetnamespace : URI de ce document WSDL 1 : <?xml version="1 0"?> 2 : < definitions 3 : name=" StockQuote " 4 : targetnamespace=" http : / / f i c t i f / stockquote wsdl " 5 : xmlns : tns=" http : / / f i c t i f / stockquote wsdl " 6 : xmlns : xsd1=" http : / / f i c t i f / stockquote xsd " 7 : xmlns : soap=" http : / / schemas xmlsoap org / wsdl / soap / " 8 : xmlns=" http : / / schemas xmlsoap org / wsdl / "> 23 / 42

Exemple WSDL 2 / 5 Types de données, ici décrits en XMLSchema : 1 : <types> 2 : <schema targetnamespace=" http : / / f i c t i f / stockquote xsd " 3 : xmlns=" http : / /www w3 org /2000/10/XMLSchema" > 4 : <element name=" TradePriceRequest " > 5 : <complextype> 6 : < a l l ><element name=" tickersymbol " 7 : type=" s t r i n g " /></ a l l > 8 : </ complextype> 9 : </ element> 10 : <element name=" TradePrice " > 11 : <complextype> 12 : < a l l ><element name=" p r i c e " 13 : type=" f l o a t " /></ a l l > 14 : </ complextype> 15 : </ element> 16 : </schema> 17 : </ types> 24 / 42

Exemple WSDL 3 / 5 Messages correspondant à l'appel et au retour : 1 : <message name=" GetLastTradePriceInput " > 2 : <part name=" body " element=" xsd1 : TradePriceRequest " / > 3 : </message> 4 : <message name=" GetLastTradePriceOutput " > 5 : <part name=" body " element=" xsd1 : TradePrice " / > 6 : </message> Combinaison de l'appel et du retour dans une opération : 1 : <porttype name=" StockQuotePortType " > 2 : <operation name=" GetLastTradePrice " > 3 : <input message=" tns : GetLastTradePriceInput " / > 4 : <output message=" tns : GetLastTradePriceOutput " / > 5 : </ operation> 6 : </ porttype> 25 / 42

Exemple WSDL Liaison transport SOAP sur HTTP : Adresse (URL puisque HTTP) Encodage des contenus, ici le XML verbatim (literal) 1 : <binding name=" StockQuoteSoapBinding " 2 : type=" tns : StockQuotePortType " > 3 : <soap : binding style =" document " 4 : transport=" http : / / schemas xmlsoap org / soap / http " /> 5 : <operation name=" GetLastTradePrice " > 6 : <soap : operation 7 : soapaction=" http : / / f i c t i f / GetLastTradePrice " /> 8 : <input> 9 : <soap : body use=" l i t e r a l " /> 10 : </ input> 11 : <output> 12 : <soap : body use=" l i t e r a l " /> 13 : </ output> 14 : </ operation> 15 : </ binding> 4 / 5 26 / 42

Exemple WSDL 5 / 5 Finalement, la définition du service : 1 : <service name=" StockQuoteService " > 2 : <documentation>my f i r s t s e r v i c e </ documentation> 3 : <port name=" StockQuotePort " 4 : binding=" tns : StockQuoteSoapBinding " > 5 : <soap : address 6 : location =" http : / / f i c t i f / stockquote " /> 7 : </ port> 8 : </ service > 9 : </ definitions > On a vu un exemple très simple, il est bien sûr possible : De multiplier les messages, opérations, etc De les combiner de sifférentes façons 27 / 42

Exemple requête SOAP 1 : <SOAP ENV: Envelope 2 : xmlns : SOAP ENV= " http : / / schemas xmlsoap org / soap / envelope / " 3 : SOAP ENV: encodingstyle=" http : / / schemas xmlsoap org / soap / enco 4 : <SOAP ENV: Body> 5 : <m: getlasttradeprice 6 : xmlns :m=" http : / / f i c t i f / stockquote xsd "> 7 : <tickersymbol>ibm</ tickersymbol> 8 : </m: getlasttradeprice> 9 : </SOAP ENV: Body> 10 : </SOAP ENV: Envelope> 28 / 42

Exemple réponse correcte SOAP 1 : <SOAP ENV: Envelope 2 : xmlns : SOAP ENV= " http : / / schemas xmlsoap org / soap / envelope / " 3 : SOAP ENV: encodingstyle=" http : / / schemas xmlsoap org / soap / enco 4 : <SOAP ENV: Body> 5 : <m: getlasttradepriceresponse 6 : xmlns :m=" http : / / f i c t i f / stockquote xsd "> 7 : <price >42</ price > 8 : </m: getlasttradepriceresponse> 9 : </SOAP ENV: Body> 10 : </SOAP ENV: Envelope> 29 / 42

Exemple réponse erronée SOAP 1 : <SOAP ENV: Envelope 2 : xmlns : SOAP ENV= " http : / / schemas xmlsoap org / soap / envelope / " 3 : SOAP ENV: encodingstyle=" http : / / schemas xmlsoap org / soap / enco 4 : <SOAP ENV: Body> 5 : <SOAP ENV: Fault> 6 : <faultcode>soap ENV : C l i e n t </ faultcode> 7 : < faultstring > </ faultstring > 8 : </SOAP ENV: Fault> 9 : </SOAP ENV: Body> 10 : </SOAP ENV: Envelope> 30 / 42

Appel depuis Perl 1 / 3 On ne s'intéresse qu'au côté client Lignée XMLRPC: Nécessité d'un analyseur XML (expat natif ou XML::Parser en Perl) RPC::XML XML::RPC (merci les gars) Lignée SOAP: SOAP::Lite 31 / 42

Appel depuis Perl 2 / 3 Exemple d'appel du service SOAP précédent : 1 : use SOAP : : L i t e ; 2 : print SOAP : : L i t e 3 : >s e r v i c e ( ' http : / / f i c t i f / StockQuote wsdl ' ) 4 : >getlasttradeprice ( ' MSFT ' ) ; Un exemple sans passer par un descripteur : 1 : use SOAP : : L i t e ; 2 : print SOAP : : L i t e 3 : >u r i ( ' http : / /www s o a p l i t e com/ Temperatures ' ) 4 : >proxy ( ' http : / / s e r v i c e s s o a p l i t e com/ temper c g i ' ) 5 : >f2c (32) # Farenheit > C e l s i u s 6 : >r e s u l t ; 32 / 42

Appel depuis Perl 3 / 3 Exemple RPC::XML : 1 : require RPC : : XML; 2 : require RPC : : XML : : C l i e n t ; 3 : $request = RPC : : XML : : Client >new( 4 : ' http : / /www l o c a l h o s t net /RPCSERV ' ) ; 5 : $response = $request >send_request ( ' some method ', 6 : @arguments ) ; 7 : print ref $response 8 :? j o i n ( ', ', @{ $response >value } ) 9 : : " E r r o r : $response " ; Exemple XML::RPC : 1 : use XML : : RPC ; 2 : my $xmlrpc = XML : : RPC >new( 3 : ' http : / / betty userland com/rpc2 ' ) ; 4 : my $result = $xmlrpc >c a l l ( 5 : ' examples g e t S t a t e S t r u c t ', 6 : { state1 => 12, state2 => 28 } ) ; 33 / 42

Appel depuis Java avec Axis 1 / 8 On ne s'intéresse qu'au côté client! invocation dynamiquement construite, interaction avec les DOM émis et reçus usage de classes de confort engendrées grâce à WSDL, méthodes bien nommées 34 / 42

Appel depuis Java avec Axis Axis Object Model 2 / 8 1 : import org apache axiom om * ; 2 : import org apache axis2 ****** ; 3 : 4 : public class AXIOMClient { 5 : 6 : private s t a t i c EndpointReference targetepr = 7 : new EndpointReference ( " http : / / l o c a l h o s t :8080 " 8 : + " / a x i s 2 / s e r v i c e s / StockQuoteService " ) ; 35 / 42

Appel depuis Java avec Axis Axis Object Model 3 / 8 1 : public s t a t i c OMElement 2 : getpricepayload ( String symbol ) { 3 : OMFactory fac = OMAbstractFactory getomfactory ( ) ; 4 : OMNamespace omns = fac createomnamespace ( 5 : " http : / / axiom s e r v i c e q u i c k s t a r t samples / xsd ", 6 : " tns " ) ; 7 : OMElement method = fac createomelement ( 8 : " g e t P r i c e ", omns) ; 9 : OMElement value = fac createomelement ( 10 : " symbol ", omns) ; 11 : value addchild ( fac createomtext ( value, symbol ) ) ; 12 : method addchild ( value ) ; 13 : return method ; 14 : } 36 / 42

Appel depuis Java avec Axis Axis Object Model 1 : public s t a t i c OMElement 2 : updatepayload ( S t r i ng symbol, double price ) { 3 : OMFactory fac = OMAbstractFactory getomfactory ( ) ; 4 : OMNamespace omns = fac createomnamespace ( 5 : " http : / / axiom s e r v i c e q u i c k s t a r t samples / xsd ", 6 : " tns " ) ; 7 : OMElement method = fac createomelement ( 8 : " update ", omns) ; 9 : OMElement value1 = fac createomelement ( 10 : " symbol ", omns) ; 11 : value1 addchild ( fac createomtext ( value1, symbol ) ) ; 12 : method addchild ( value1 ) ; 13 : OMElement value2 = fac createomelement ( 14 : " p r i c e ", omns) ; 15 : value2 addchild ( fac createomtext ( 16 : value2, Double tostring ( price ) ) ) ; 17 : method addchild ( value2 ) ; 18 : return method ; 19 : } 4 / 8 37 / 42

Appel depuis Java avec Axis Axis Object Model 1 : public s t a t i c void main ( String [ ] args ) throws Throwable { 2 : OMElement getpricepayload = getpricepayload ( "WSO" ) ; 3 : OMElement updatepayload = 4 : updatepayload ( "WSO", 123 42 ) ; 5 : Options options = new Options ( ) ; 6 : options setto ( targetepr ) ; 7 : options settransportinprotocol ( 8 : Constants TRANSPORT_HTTP) ; 9 : S e r v i c e C l i e n t sender = new S e r v i c e C l i e n t ( ) ; 10 : sender setoptions ( options ) ; 11 : sender fireandforget ( updatepayload ) ; 12 : System err p r i n t l n ( " p r i c e updated " ) ; 13 : OMElement r e s u l t = 14 : sender sendreceive ( getpricepayload ) ; 15 : String response = 16 : r e s u l t getfirstelement ( ) gettext ( ) ; 17 : System err p r i n t l n ( " Current p r i c e : " + response ) ; 18 : } 5 / 8 38 / 42

Appel depuis Java avec Axis Axis Data Binding 6 / 8 Après génération de StockQuoteServiceStub: 1 : import adb StockQuoteServiceStub ; 2 : 3 : public class ADBClient { 4 : public s t a t i c void main ( String args [ ] ) throws Throwable { 5 : StockQuoteServiceStub stub = 6 : new StockQuoteServiceStub ( 7 : " http : / / f i c t i f / StockQuoteService " ) ; 8 : 9 : getprice ( stub ) ; 10 : update ( stub ) ; 11 : getprice ( stub ) ; 12 : } 39 / 42

Appel depuis Java avec Axis Axis Data Binding 7 / 8 Utilisation en fire and forget : 1 : public s t a t i c void update ( StockQuoteServiceStub stub ) throws T 2 : StockQuoteServiceStub Update req = 3 : new StockQuoteServiceStub Update ( ) ; 4 : req setsymbol ( "ABC" ) ; 5 : req setprice ( 42 35 ) ; 6 : stub update ( req ) ; 7 : System err p r i n t l n ( " p r i c e updated " ) ; 8 : } 40 / 42

Appel depuis Java avec Axis Axis Data Binding 8 / 8 Utilisation en two way call/receive : 1 : public s t a t i c void getprice ( StockQuoteServiceStub stub ) throws 2 : StockQuoteServiceStub GetPrice req = 3 : new StockQuoteServiceStub GetPrice ( ) ; 4 : req setsymbol ( "ABC" ) ; 5 : StockQuoteServiceStub GetPriceResponse res = 6 : stub getprice ( req ) ; 7 : System err p r i n t l n ( res get_return ( ) ) ; 8 : } 41 / 42

Conclusion C'était : l'approche services Rien de révolutionnaire, fruit d'une longue maturation Meilleure maîtrise de l'hétérogénéité par couplage faible Simplification du déploiement La semaine prochaine : l'approche ressources