Web Service et Messages-JMS

Transcription

Web Service et Messages-JMS
Les Web Services
Daniel Hagimont
IRIT/ENSEEIHT
2 rue Charles Camichel - BP 7122
31071 TOULOUSE CEDEX 7
[email protected]
http://hagimont.perso.enseeiht.fr
1
Motivations

Motivations
 Intégration d'applications à "gros grain"
 Unité d'intégration : le "service" (interface + contrat)

Contraintes
 Applications conçues indépendamment, sans avoir prévu une
intégration future
 Applications hétérogènes (modèles, plates-formes, langages)

Conséquences
 Pas de définition d'un modèle commun
 Utilisation d'une base commune de niveau élémentaire
• Pour les protocoles d'accès aux services (messages)
• Pour la description des services (interface)
 Outil de base : XML (car adaptable)
2
Les Web Services (WS)

Apport conceptuel
 Pas de nouveaux concepts fondamentaux …
 … alors, quelle est la nouveauté ?

Apport concret
 Avant tout, solution en vue au problème de
l'hétérogénéité
 Vers un schéma d'intégration et de coordination
d'applications à grande échelle
 Forte implication des principaux acteurs du domaine
3
Forme simple de WS : RPC-XML
Description en XML d'un appel de procédure à distance
Le type des paramètres est spécifié dans le schéma XML
<methodCall>
<methodName>meteo.temperature</methodName>
<params>
<param>
<value><int>31130</int></value>
</param>
</params>
</methodCall>
Description en XML du retour des résultats
<methodResponse>
<params>
<param>
<value><int>25</int></value>
</param>
</params>
</methodResponse>
Intérêt : indépendance par rapport
aux plates-formes et par rapport
au support de communication
4
Mise en œuvre d'un WS
5
Elements des WS

Description d'un service
 WSDL : Web Services Description Language
 Notation standard pour la description de l'interface d'un
service

Accès à un service
 SOAP : Simple Object Access Protocol
 Protocole Internet permettant la communication entre
applications pour l'accès aux services Web

Annuaire des services
 UDDI : Universal Description, Discovery and Integration
 Protocole pour l'enregistrement et la découverte de
services
6
Des outils

A partir d'un programme, on générè un skeleton de WS
 Exemple : à partir d'un programme Java, on génère
• une servlet qui reçoit du SOAP sur HTTP et reproduit l'appel sur une
instance de cette classe
• Un fichier WDSL qui décrit l'interface du service


Le fichier WSDL généré peut être donné aux clients
A partir d'un fichier WSDL, on génère un stub de WS
 Exemple : à partir d'un fichier WSDL, on génère les classes Java
à utiliser pour appeler le service distant


La programmation est simplifiée
On dispose de tels outils dans différents environnements
langages
7
Exemple : programmation de
Web Services



Eclipse JEE
Apache Axis
Création d'un Web Service
 A partir d'une classe Java
 Dans le runtime Tomcat
 Génération du fichier WSDL

Création d'une application cliente
 Génération des stubs à partir du fichier WSDL
 Programmation du client
8
Create a Dynamic Web Project




Eclipse JEE
Open JEE
perspective
Create a
Dynamic Web
Project
Add your
Tomcat
runtime
9
Create a Class
A Tomcat server was
created in Eclipse
10
From source file : Web Service → create Web
Service
11
Copy the generated WSDL file in
a new Java project
A servlet was deployed
on the Tomcat server
12
From the WSDL file
Web Service → Generate Client (Develop
Client)
13
Program a client
14
Run
15
WSDL généré
<wsdl:definitions targetNamespace="http://DefaultNamespace"
xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://DefaultNamespace"
xmlns:intf="http://DefaultNamespace" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://DefaultNamespace"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="doIt">
<complexType>
<sequence>
<element name="msg" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="doItResponse">
<complexType/>
</element>
</schema>
</wsdl:types>
16
WSDL généré
<wsdl:message name="doItResponse">
<wsdl:part element="impl:doItResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="doItRequest">
<wsdl:part element="impl:doIt" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="MyService">
<wsdl:operation name="doIt">
<wsdl:input message="impl:doItRequest" name="doItRequest">
</wsdl:input>
<wsdl:output message="impl:doItResponse" name="doItResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
17
WSDL généré
<wsdl:binding name="MyServiceSoapBinding" type="impl:MyService">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="doIt">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="doItRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="doItResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MyServiceService">
<wsdl:port binding="impl:MyServiceSoapBinding" name="MyService">
<wsdlsoap:address location="http://localhost:8080/HW/services/MyService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
18
Requête SOAP (TCP/IP Monitor)
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<doIt xmlns="http://DefaultNamespace">
<msg>hello</msg>
</doIt>
</soapenv:Body>
</soapenv:Envelope>
19
Réponse SOAP
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<doItResponse xmlns="http://DefaultNamespace"/>
</soapenv:Body>
</soapenv:Envelope>
20
Conclusion



Un RPC sur HTTP
Mais entre langages hétérogènes
Bilan
 XML-RPC est plus simple, mais incomplet
 WS est plus complet et trop complexe (mais soutenu et il
y a des outils)
 UDDI est trop complexe
21
Modèle à messages
Daniel Hagimont
IRIT/ENSEEIHT
2 rue Charles Camichel - BP 7122
31071 TOULOUSE CEDEX 7
[email protected]
http://hagimont.perso.enseeiht.fr
22
Modèle à messages
Introduction

Modèle client-serveur





Appels synchrones
Bon pour des composants fortement couplés
Désignation explicite du destinataire
Connexion 1-1
Modèle à message
 Communications asynchrones
 Désignation anonyme (ex : annonce sur un newsgroup)
 Connexion 1-N
23
Modèle à messages Introduction

Exemple d’application
 Surveillance des équipements d’un réseau
 Évolution des équipements et de l’état des équipements

Solution client-serveur
 Interrogation régulière

Solution messages
 Émission de notifications des changements
 Les administrateurs s’abonnent à ces notifications
24
Intergiciels à messages
… utilisé tous les jours


Les forums
électroniques (News)
 technologie pull
 le consommateur
s ’abonne à un forum
 le producteur publie
une information dans
un forum
 le consommateur va
lire le contenu du
forum quand il le
souhaite



Le courrier électronique
 technologie push
 listes de diffusion (multicast publish/subscribe)
 le consommateur s ’abonne à
une liste de diffusion
 le producteur envoie un
message à tous les abonnées
de la liste
 le consommateur reçoit les
messages sans avoir à faire
d’action
Asynchrone
Anonyme
1-N
25
Intergiciels à messages
Principes directeurs




Message Passing (communication par messages)
Message Queuing (communication par file de
message)
Publish/Subscribe (communication par
abonnements)
Events (communication événementielle)
26
Intergiciels à messages
Message passing

Communication par message
 dans une architecture classique : sockets
 dans un environnement de programmation parallèle : PVM,
MPI
 Dans d'autres environnements : portes (ex : Mach)
27
Intergiciels à messages
Message Queuing

Queue de messages
 persistantes ⇒ asynchronisme et fiabilité
Client
Serveur
send

recv
Indépendance de l'émetteur et du destinataire
 Le destinataire n’est pas forcément actif
28
Intergiciels à messages
Publish/Subscribe

Désignation anonyme
 L’émetteur envoie un message
• Basé sur un sujet (subject-based)
• Basé sur un contenu (content-based)
 Le récepteur s’abonne (à un sujet ou un contenu)

Communication 1-N
 Plusieurs récepteurs peuvent s’abonner
consommateur
producteur
publish
subscribe



recv
29
Intergiciels à messages
Events


Concepts de base : événements, réactions (traitements associés à
l’occurrence d’un événement)
Principe d’attachement : association dynamique entre un type
d’événement et une réaction
consommateur
producteur
publish
subscribe




react
Valable pour du Message Passing, du Message Queuing, ou du
Publish/Subscribe
30
Intergiciels à messages
Implantations
client
client
client
client
client
serveur
Serveur
client
client
serveur
client
serveur
serveur
client
Serveur centralisé
Serveur réparti
(Hub & spoke)
client
serveur
(Snow flake)
client
serveur
Bus logiciel
client
serveur
31
Java Message Service

JMS : API Java d'accès uniforme aux systèmes de
messagerie
 IBM, Oracle,
 Novell, Sybase, Tibco
 Message Queue
 Publish/Subscribe
 Evénements
32
JMS : une interface
(portabilité, pas hétérogénéité)
Client
Client
Client
JMS
Provider X
JMS
Client
Client
JVM
MQ X
Provider Y
JVM
MQ X
MQ Y
MQ Y
Interopérabilité : AMQP (Advanced Message Queuing Protocol)
33
Interface JMS







ConnectionFactory : objet pour créer une connexion avec
un serveur JMS
Connection : une connexion active avec un serveur JMS
Destination : une destination ou une source
Session : un contexte mono-thread pour émettre ou
recevoir
MessageProducer : un objet pour émettre dans une session
MessageConsummer : un objet pour recevoir dans une
session
Les implantations dépendent des fournisseurs …
34
JMS - Architecture
JNDI
Destination
JMS Client
ConnectionFactory
Connection
+
+
MessageProducer
MessageConsumer
Session
35
Interfaces PTP et P/S
Point-To-Point
Publish/Subscribe
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver
TopicSubscriber
36
JMS - initialization
Emetteur
Messaging
ConnectionFactory
Destinataire
Queue || Topic
Connection
Connection
Session
Session
ConnectionFactory connectionFactory =
new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("myQueue");
Destination destination = session.createTopic("MyTopic");
37
JMS – producer / consumer
Emetteur
Messaging
ConnectionFactory
Destinataire
Queue || Topic
Connection
Connection
Session
Session
+
Producer
MessageProducer producer =
session.createProducer(destination);
+
Consumer
MessageConsumer consumer =
session.createConsumer(destination);
38
JMS - communication
Emetteur
Messaging
ConnectionFactory
Destinataire
Queue || Topic
Connection
Connection
Session
Session
+
send
Producer
TextMessage msg =
session.createTextMessage("...");
sender.send(msg);
+
receive
Consumer
TextMessage m =
(TextMessage)consumer.receive();
39
JMS - Listener
Emetteur
Messaging
ConnectionFactory
Destinataire
Queue || Topic
Connection
Connection
Session
Session
+
+
Consumer
Producer
Listener
consumer.setMessageListener(listener);
40
JMS - Listener
Emetteur
Messaging
ConnectionFactory
Destinataire
Queue || Topic
Connection
Connection
Session
Session
+
send
+
Producer
Consumer
Listener
onMessage
void onMessage(Message msg) throws JMSException {
// unpack and handle the message
}
41
JMS – les messages

TextMessage (une chaîne de caractères)
String data;
TextMessage message = session.createTextMessage();
message.setText(data);
String data;
data = message.getText();

BytesMessage (tableau de bytes)
byte[] data;
BytesMessage message = session.createByteMessage();
message.writeBytes(data);
byte[] data;
int length;
length = message.readBytes(data);
42
JMS – les messages

MapMessage (une suite de paire nom-valeur)
 une valeur est un type primitif
MapMessage message = session.createMapMessage();
message.setString("Name", "…");
message.setDouble("Value", doubleValue);
message.setLong("Time", longValue);
String name = message.getString("Name");
double value = message.getDouble("Value");
long time = message.getLong("Time");
43
JMS – les messages

StreamMessage (série de valeurs)
 une valeur est un type primitif
 La lecture doit respecter l'ordre de l'écriture
StreamMessage message = session.createStreamMessage();
message.writeString("…");
message.writeDouble(doubleValue);
message.writeLong(longValue);
String name = message.readString();
double value = message.readDouble();
long time = message.readLong();
44
JMS – les messages

ObjectMessage (objet sérialisé)
ObjectMessage message = session.createObjectMessage();
message.setObject(obj);
obj = message.getObject();
45
Conclusions

Communication par messages
 Modèle de programmation simple…
 possédant de nombreuses extensions, variantes, …
• bus logiciel à messages, modèles d’acteurs, plates-formes
à agents, systèmes multi-agents, ...
 très utilisé pour relier entre eux des « outils », existant,
indépendants, …

Attention… la simplicité ne peut être
qu’apparente
 propagation et récupération des erreurs
 outils de développement
46