Vous êtes sur la page 1sur 62

JMS 1re partie

Annick Fron
ESSI
Printemps 2004

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Plan
Introduction la communication par messages
Communication point point
Communication publish/subscribe
Filtrage de messages
Conclusion

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Introduction la communication par


messages

ESSI Printemps 2004

JMS 1re partie - Annick Fron

RMI, Corba ... : RPC


A

C
D

B
E

ESSI - Printemps 2004

RPC : point point


Connaissance mutuelle
1 seul metteur
1 seul rcepteur
Message reu ou perdu
Dfinition d'une interface

JMS 1re partie - Annick Fron

Communication par messages :


''destination''
Emetteur
Emetteur
Emetteur

Cf mail
listes de diffusion

Rcepteur
Rcepteur
Rcepteur
Message

Destination 1
Destination 2

= intermdiaire

Persistance
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Communication par messages


Traitement en ''diffr''
Graphe mtier ; synchronisation

Ventes

Livraison
commandes
Facturation
Comptabilit

ESSI - Printemps 2004

factures

JMS 1re partie - Annick Fron

Communication par vnements


Cours > 6

Courtier en bourse
Courtier en bourse
Courtier en bourse

cf. ''Listener'' en java swing

ESSI - Printemps 2004

Courtier en bourse

JMS 1re partie - Annick Fron

Mode push / pull


Mode push : sirne d'alarme, publicit, spam ...
le serveur diffuse une information

Mode pull : consultation mto,


requte base de donnes ...
Le client sollicite une rponse

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Communication par messages


L'metteur (resp. rcepteur) ne connat que la ''destination''
Il peut y avoir plusieurs metteurs / rcepteurs sur la mme
destination
Le message envoy peut tre persistant (et non reu ou
perdu)
Slection possible des destinataires par ''proprits'' et non
nommage direct (message type=bleu)
Le format du message est libre (pas d'interface
respecter) comme sur une socket => souvent couplage avec
XML

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Rles du message
Message = contenu + contrle
Echange d'information (contenu)
Synchronisation/ coordination

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

10

Structure d'un message


Messages
Entte :
Information permettant l'identification et l'acheminement
du message
Proprits :
Couples (nom, valeur) utilisables par le systme ou
l'application pour slectionner les messages ou les
destinataires
Donnes :
Dfinies par l'application : plusieurs types (texte,
binaire, ..)
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

11

Proprits du bus de messages


Proprits du bus
Priorit, ordre des messages
Dure de vie des messages
Filtrage des messages
metteur, type de message, priorit
attributs
contenu
Notification des erreurs
Qualit de service de la file de messages
''best effort'', fiable, persistant, transactionnel
Authentification, Scurit, Protection
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

12

Synchrone/asynchrone
Synchrone

ESSI - Printemps 2004

Asynchrone

JMS 1re partie - Annick Fron

13

Srialisation temporelle des messages

1. dcroche

1. raccroche

2. raccroche
2. dcroche
Serveur
$$$$ ???

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

14

Smantique one only

Serveur
Retrait 200$

!Conn. timeout
Retrait 200$

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

15

Utilisation des systmes messages


Transferts point point asynchrones (ex : swift)
Couplage lche entre grosses applications (message en
format libre l'inverse de RMI) : ERP, SAP
Notification (ex: Tibco trackers de bourse)
Diffusion une liste, un groupe d 'intrt

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

16

JMS : Java Messaging Service

ESSI Printemps 2004

JMS 1re partie - Annick Fron

17

Java Message Service


JMS : API Java d'accs uniforme aux systmes de
messagerie
IBM Websphere MQSeries
Novell, Oracle, Sybase
Tibco, Sonic MQ, SwiftMQ
2 modles de communication
Point-to-Point (queues)
Publish/Subscribe (topics)

Package javax.jms (depuis JDK 1.4)


Maintenant dans EJB avec les Message-Driven Beans

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

18

Architecture JMS
Client JMS
Connection

Client JMS
Connection

Session

Session

Producer

Consumer

Message Server
message

ESSI - Printemps 2004

Destination

message

JMS 1re partie - Annick Fron

19

Architecture JMS
Emboitement d'abstractions : une session existe l'intrieur
d'une connexion
La connexion est lie au serveur de message
Il peut y avoir plusieurs sessions par connexion
La session assure la qualit de service (gestion des erreurs,
transactions ...) : gre le processus global de transmission de
bout en bout, srialise les messages selon priorit
Le consumer/producer n'existe qu' l'intrieur d'une session
et connait la destination
Le message n'existe qu' l'intrieur d'une session
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

20

JMS - causalit
JNDI

Destination

JMS Client
ConnectionFactory

MessageProducer

Connection

MessageConsummer

Session
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

21

Point de dpart
2 points de dpart :
1) La ConnectionFactory -> Connection -> Session
2) La Destination

Le Producer/Consumer requiert : session + destination


Le Message n'existe qu' l'intrieur d'une session

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

22

Destinations
2 types de destinations :
Queues pour le point point
Topics pour publish/subscribe

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

23

Point point : ''Queue''


Analogie avec le ''mail''
Chaque message n'a qu'un seul
consommateur
Pas de dpendance temporelle
entre prod/consom

ESSI - Printemps 2004

Le consommateur envoie un
reu

JMS 1re partie - Annick Fron

24

Publish/subscribe : Topic
Similaire un modle par vnements
(ex : Listener d'une interface
graphique)
Plusieurs consommateurs sur
abonnement

ESSI - Printemps 2004

Rception des messages que si


prsent et abonn
Extension : abonnements durables

JMS 1re partie - Annick Fron

25

Mode point point

ESSI Printemps 2004

JMS 1re partie - Annick Fron

26

JMS - "Point-to-Point"
Emetteur

Messaging
QueueConnectionFac

Destinataire

tory
Queue

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

27

JMS - "Point-to-Point"
Emetteur

Destinataire

Serveur
QueueConnectionFactory
Queue

QueueConnection

QueueConnection

QueueSession

QueueSession

// La factory est souvent stocke dans JNDI


QueueConnectionFactory connectionFactory =
(QueueConnectionFactory) context.lookup("");
QueueConnection connection = connectionFactory.createQueueConnection
();
QueueSession session = connection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
//false
: - pas
de 2004
transactionsJMS 1re partie - Annick Fron
28
ESSI
Printemps

Queue
La Queue est un objet ''administr''
Il doit avoir t cr par l'administrateur systme sur le
serveur
On peut soit le retrouver dans JNDI :
Queue queue = (Queue) context.lookup("");

soit obtenir une rfrence avec :


session.createQueue(nomQueue)

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

29

JMS - "Point-to-Point"
Emetteur

Server
QueueConnectionFactory

Destinataire

Queue
QueueConnection

QueueConnection

QueueSession

QueueSession

+
QueueSender
QueueSender sender = session.createSender(queue);

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

30

JMS - "Point-to-Point"
Emetteur

Destinataire

Messaging
QueueConnectionFac
tory
Queue

QueueConnection

QueueConnection

QueueSession

QueueSession

+
QueueReceiver

QueueSender

QueueReceiver receiver = session.createReceiver(queue);


connection.start();

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

31

Rcepteur/metteur
La cration de session est identique ct rcepteur et ct
metteur
Une mme session peut utiliser la fois des metteurs et des
rcepteurs, sur des queues identiques ou diffrentes

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

32

Connection start()
Lorque l'on cre connexion, elle est l'tat dormant.
Afin de pouvoir la lancer uniquement lorsque tous les acteurs
sont prsents, on utilise le start()
Le start() est ABSOLUMENT ncessaire pour activer la
rception de messages

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

33

JMS - "Point-to-Point"
Emetteur

Destinataire

Messaging
QueueConnectionFac
tory
Queue

QueueConnection

QueueConnection

QueueSession

QueueSession

send

+
QueueReceiver

QueueSender
TextMessage msg = session.createTextMessage();
msg.setText("");
sender.send(msg);
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

34

Send
Le message est cr DANS LA SESSION
L'envoi par send dpend de la smantique du serveur
On prcise la smantique avec les paramtres :
sender.send(mess, \\le message
DeliveryMode.PERSISTENT, \\ stock sur serveur
Message.DEFAULT_PRIORITY, \\priorit dfaut
60 000) \\dure de vie 60 000 ms = 1 minute

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

35

Cration d'un message


Session
cre
cre
MessageProducer

ESSI - Printemps 2004

Message

Destination

ie
o
v
n
e

JMS 1re partie - Annick Fron

36

Types de messages
Il existe plusieurs types de messages :
BytesMessage : binaire
MapMessage : fichier de proprits (paires attribut/valeur)
ObjectMessage : object java srialis
StreamMessage : une Stream de types primitifs
TextMessage : une String
setText(String);
getText()

Nota : on peut formatter le message en XML

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

37

JMS - "Point-to-Point"
Emetteur

Destinataire

Messaging
QueueConnectionFac
tory
Queue

QueueConnection

QueueConnection

QueueSession

QueueSession

send

+
receive
QueueReceiver

QueueSender

TextMessage msg = (TextMessage) receiver.receive();

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

38

Message
Cr par session, et envoy par le sender (ct serveur)
TextMessage msg = session.createTextMessage();
msg.setText("");
sender.send(msg);

Reu par le receiver (ct client)


TextMessage msg = (TextMessage) receiver.receive();

Nota : le receive est bloquant


Variantes :
receiveNoWait()
receive(timeOutEnMs)
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

39

PtoP synchrone
On peut recevoir autant de messages que comporte la Queue
connection.start();
Message m = consumer.receive();
Message m = consumer.receive(1000);
// time out aprs 1 seconde ou 1000 ms
Message m = consumer.receiveNoWait();

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

40

PtoP : rception asynchrone


On attache un "MessageListener" au consumer
MessageListener myListener = new MyListener();
receiver.setMessageListener(myListener);

On doit faire un start() sur la connection aprs


connection.start();

Le listener doit implmenter "onMessage


public void onMessage(Message message)
{ System.out.println( "Le message est "+message);}

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

41

En rsum

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

42

Mode publish/subscribe

ESSI Printemps 2004

JMS 1re partie - Annick Fron

43

JMS - "Publish/Subscribe"
Emetteur

Destinataire
TopicConnectionFactory
Topic
A
x

ESSI - Printemps 2004

B
y

JMS 1re partie - Annick Fron

44

JMS - "Publish/Subscribe"
Emetteur

Destinataire
TopicConnectionFactory
Topic

TopicConnection
A
TopicSession

TopicConnection
B

TopicSession

TopicConnectionFactory connectionFactory =
(TopicConnectionFactory) jndiContext.lookup("");
Topic topic = (Topic) jndiContext.lookup("/A/x");
TopicConnection connection = connectionFactory.createTopicConnectio();
TopicSession session =
connection.createTopicSession(false, Session.CLIENT_ACKNOWLEDGE);
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

45

Topic
Comme pour la Queue, ils peuvent tre soit dans JNDI soit
crs par la session
A la diffrence des Queues, ce ne sont pas des objets
administrs, on peut crer un Topic la vole dans
intervention de l'administrateur
Les Topics peuvent tre hirarchiques, et on peut utiliser des
expressions rgulires

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

46

Topic
L'abonnement publish/subscribe s'appuie sur une
arborescence de topics
/Sport/Tennis/* (notation Websphere MQ)
Sport.Tennis.* (notation SonicMQ)

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

47

JMS - "Publish/Subscribe"
Emetteur

Messaging
TopicConnectionFact

Destinataire

ory
Topic

TopicConnection
A
x

TopicSession

TopicConnection
B

TopicSession

+
TopicPublisher
TopicPublisher publisher = session.createPublisher(topic);

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

48

JMS - "Publish/Subscribe"
Emetteur

Destinataire

Messaging
TopicConnectionFact
ory
Topic

TopicConnection
A
x

TopicSession

TopicConnection
B
TopicSession

+
TopicSubscriber

TopicPublisher

Listener

TopicSubscriber subscriber =
session.createSubscriber(topic);
subscriber.setMessageListener(listener);
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

49

JMS - "Publish/Subscribe"
Emetteur

Destinataire

Messaging
TopicConnectionFact
ory
Topic

TopicConnection
A
x

TopicSession
publish

TopicConnection
B
TopicSession

+
TopicSubscriber

TopicPublisher

Listener

publisher.publish(msg);

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

50

JMS - "Publish/Subscribe
Emetteur

Destinataire

Messaging
TopicConnectionFact
ory
Topic

TopicConnection
A
x

TopicSession
publish

TopicConnection
B
TopicSession

+
TopicSubscriber

TopicPublisher
void onMessage(Message msg) throws JMSException {
// unpack and handle the message

}
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

Listener
onMessag
e

51

Synchrone/asynchrone
Mode diffusion
Mode rception

PtoP

Pub sub

Synchrone

receive

receive

Asynchrone

Onmessage

onmessage

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

52

Parallle PtoP / Pubsub


Abstrait

PtoP

Pubsub

ConnectionFactory QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer QueueSender

TopicPublisher

MessageConsumer QueueReceiver

TopicSubscriber

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

53

Hirarchie de classes parallles


receive
setMessageListener

MessageConsumer

QueueReceiver

ESSI - Printemps 2004

TopicSubscriber

JMS 1re partie - Annick Fron

54

Aperu du parallle

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

55

JMS 1.1 : unification Queue/Topic


ConnectionFactory
factory = (new
progress.message.jclient.ConnectionFactory (broker));
Connection connection = factory.createConnection ();
Session pubSession = connection.createSession
(false,Session.AUTO_ACKNOWLEDGE);
Topic topic = pubSession.createTopic (APP_TOPIC);
MessageConsumer subscriber = subSession.createConsumer
(topic);
subscriber.setMessageListener(this);
MessageProducer publisher = pubSession.createProducer
(topic);
publisher.send(message); // au lieu de publish

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

56

Filtrage de messages

Filtre

Prop = 'green'
Prop = 'blue'

ESSI - Printemps 2004

Prop = 'yellow'

JMS 1re partie - Annick Fron

57

Filtrage des messages en PtoP


Ct metteur
message.setStringProperty(" myProp ", " blue ");

Ct rcepteur
queueReceiver = session.createReceiver(ioQueue,
"myProp = 'blue'");

Nota : il est impossible de modifier le slecteur du receiver


aprs cration
Expressions logiques pour le filtrage
Nota :
createReceiver (queue)
createReceiver (queue, selector)
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

58

Expressions logiques pour le filtrage


Proprits types (String, long, Object ...)
message.setStringProperty
(propName,propValue)
Sous-ensemble de SQL92 : attention aux quotes
(Country = ' UK') OR (Country = ' US') OR
(Country = ' France')
age >= 15 AND age <= 19
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

59

Filtrage des topics en pubsub


On peut dfinir des jokers sur
les Topics (* pour IBM ou Sonic)
On peut filtrer sur
l'arborescence
ex:
Tous les rsultats
Sport/Football/*/Results
Toutes les quipes
Sport/Football/*
Sport.Football.* (Sonic)

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

60

Conclusions
JMS permet une communication par messages
Un message est non structur mais peut tre de plusieurs
types (texte, binaire)
2 modes de diffusion : point point (queues),
publish/subscribe (topics)
2 modes de rception : synchrone (receive), asynchrone
(listener>onMessage)
On peut combiner les deux modes de diffusion et les deux
modes de rception
On peut filtrer les messages sur des proprits
ESSI - Printemps 2004

JMS 1re partie - Annick Fron

61

Quelques rfrences...
Websphere MQ (ex MQSeries) d'IBM : http://www3.ibm.com/software/ts/mqseries/messaging/
Sonic MQ : http://www.sonicsoftware.com/products/sonicmq/index.ssp
Joram http://www.objectweb.org/joram (Open Source)
Tibco :
http://www.tibco.com/services/education/wbt_demo/wbt112/unit1/main.htm
l
Swift MQ : http://www.swiftmq.com/
JMS Tutorial : http://java.sun.com/products/jms/tutorial/index.html
Message-driven bean : http://java.sun.com/j2ee/tutorial/1_3fcs/doc/EJBConcepts5.html
http://www.afceurope.com/JMS.html

ESSI - Printemps 2004

JMS 1re partie - Annick Fron

62