ESSI - Printemps 2004 JMS 1ère parti e - Annick Fron 1 JMS 1ère partie Annick Fron ESSI Printemps 2004
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 1
JMS 1re partie
Annick FronESSIPrintemps 2004
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 2
Plan
Introduction la communication par messagesCommunication point pointCommunication publish/subscribeFiltrage de messagesConclusion
ESSI Printemps 2004 JMS 1re partie - Annick Fron 3
Introduction la communication par messages
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 4
RMI, Corba ... : RPC
A C
B DRPC : point pointConnaissance mutuelle1 seul metteur1 seul rcepteurMessage reu ou perduDfinition d'une interface
E F
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 5
Communication par messages : ''destination''
Emetteur
Message
Persistance
Rcepteur
= intermdiaireCf maillistes de diffusion
RcepteurRcepteur
Destination 1Destination 2
Emetteur
Emetteur
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 6
Communication par messages
Ventes
commandes
Livraison
Facturation
Comptabilit factures
Traitement en ''diffr''Graphe mtier ; synchronisation
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 7
Communication par vnements
Courtier en bourse
Courtier en bourse
Courtier en bourse
Courtier en bourse
Cours > 6
cf. ''Listener'' en java swing
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 8
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 9
Communication par messages
L'metteur (resp. rcepteur) ne connat que la ''destination''Il peut y avoir plusieurs metteurs / rcepteurs sur la mme destinationLe 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 10
Rles du message
Message = contenu + contrleEchange d'information (contenu) Synchronisation/ coordination
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 11
Structure d'un message
MessagesEntte :
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 12
Proprits du bus de messages
Proprits du busPriorit, ordre des messagesDure de vie des messagesFiltrage des messages
metteur, type de message, prioritattributscontenu
Notification des erreursQualit de service de la file de messages
''best effort'', fiable, persistant, transactionnelAuthentification, Scurit, Protection
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 13
Synchrone/asynchrone
Synchrone Asynchrone
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 14
Srialisation temporelle des messages
1. dcroche
2. raccroche
$$$$ ???
Serveur
2. dcroche
1. raccroche
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 15
Smantique one only
ServeurRetrait 200$
!Conn. timeout
Retrait 200$
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 16
Utilisation des systmes messages
Transferts point point asynchrones (ex : swift)Couplage lche entre grosses applications (message en format libre l'inverse de RMI) : ERP, SAPNotification (ex: Tibco trackers de bourse)Diffusion une liste, un groupe d 'intrt
ESSI Printemps 2004 JMS 1re partie - Annick Fron 17
JMS : Java Messaging Service
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 18
Java Message Service
JMS : API Java d'accs uniforme aux systmes de messagerie
IBM Websphere MQSeriesNovell, Oracle, SybaseTibco, Sonic MQ, SwiftMQ
2 modles de communicationPoint-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 19
Architecture JMSClient JMSConnection
Session
Producer
Client JMSConnection
Session
Consumer
Message Server
Destinationmessage message
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 20
Architecture JMS
Emboitement d'abstractions : une session existe l'intrieur d'une connexionLa connexion est lie au serveur de messageIl peut y avoir plusieurs sessions par connexionLa session assure la qualit de service (gestion des erreurs, transactions ...) : gre le processus global de transmission de bout en bout, srialise les messages selon prioritLe consumer/producer n'existe qu' l'intrieur d'une session et connait la destinationLe message n'existe qu' l'intrieur d'une session
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 21
JMS - causalit
JNDI
ConnectionFactory
Connection
Session
MessageProducer
MessageConsummer
Destination
JMS Client
+
+
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 22
Point de dpart
2 points de dpart :1) La ConnectionFactory -> Connection -> Session2) La Destination
Le Producer/Consumer requiert : session + destinationLe Message n'existe qu' l'intrieur d'une session
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 23
Destinations
2 types de destinations :Queues pour le point pointTopics pour publish/subscribe
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 24
Point point : ''Queue''Analogie avec le ''mail''Chaque message n'a qu'un seul consommateurPas de dpendance temporelle entre prod/consom
Le consommateur envoie un reu
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 25
Publish/subscribe : Topic
Similaire un modle par vnements (ex : Listener d'une interface graphique)Plusieurs consommateurs sur abonnement
Rception des messages que si prsent et abonnExtension : abonnements durables
ESSI Printemps 2004 JMS 1re partie - Annick Fron 26
Mode point point
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 27
Emetteur Destinataire
JMS - "Point-to-Point"
Queue
QueueConnectionFactory
Messaging
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 28
JMS - "Point-to-Point"
Emetteur Destinataire
// La factory est souvent stocke dans JNDIQueueConnectionFactory connectionFactory =
(QueueConnectionFactory) context.lookup("");
QueueConnection connection = connectionFactory.createQueueConnection();QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);//false : pas de transactions
Queue
QueueConnectionFactoryServeur
QueueSession
QueueConnection
QueueSession
QueueConnection
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 29
QueueLa 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 30
JMS - "Point-to-Point"
Emetteur Destinataire
Queue
QueueConnectionFactoryServer
QueueSession
QueueConnection
QueueSession
QueueConnection
+
QueueSender
QueueSender sender = session.createSender(queue);
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 31
JMS - "Point-to-Point"
Emetteur Destinataire
Queue
QueueConnectionFactory
Messaging
QueueSession
QueueConnection
QueueSession
QueueConnection
+
QueueSender
+
QueueReceiver
QueueReceiver receiver = session.createReceiver(queue);connection.start();
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 32
Rcepteur/metteur
La cration de session est identique ct rcepteur et ct metteurUne 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 33
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 34
JMS - "Point-to-Point"
Emetteur Destinataire
Queue
QueueConnectionFactory
Messaging
QueueSession
QueueConnection
QueueSession
QueueConnection
+
QueueSender
+
QueueReceiver
send
TextMessage msg = session.createTextMessage();msg.setText("");sender.send(msg);
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 35
Send
Le message est cr DANS LA SESSIONL'envoi par send dpend de la smantique du serveurOn prcise la smantique avec les paramtres :
sender.send(mess, \\le messageDeliveryMode.PERSISTENT, \\ stock sur serveurMessage.DEFAULT_PRIORITY, \\priorit dfaut60 000) \\dure de vie 60 000 ms = 1 minute
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 36
Cration d'un message
Session
MessageProducer
DestinationMessagecrecre
envoie
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 37
Types de messages
Il existe plusieurs types de messages :BytesMessage : binaireMapMessage : fichier de proprits (paires attribut/valeur)ObjectMessage : object java srialisStreamMessage : une Stream de types primitifsTextMessage : une String
setText(String); getText()
Nota : on peut formatter le message en XML
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 38
JMS - "Point-to-Point"
Emetteur Destinataire
Queue
QueueConnectionFactory
Messaging
QueueSession
QueueConnection
QueueSession
QueueConnection
+
QueueSender
+
QueueReceiver
sendreceive
TextMessage msg = (TextMessage) receiver.receive();
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 39
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 bloquantVariantes :receiveNoWait()receive(timeOutEnMs)
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 40
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 msMessage m = consumer.receiveNoWait();
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 41
PtoP : rception asynchrone
On attache un "MessageListener" au consumer
MessageListener myListener = new MyListener();receiver.setMessageListener(myListener);
On doit faire un start() sur la connection aprsconnection.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 42
En rsum
ESSI Printemps 2004 JMS 1re partie - Annick Fron 43
Mode publish/subscribe
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 44
Emetteur Destinataire
Topic
TopicConnectionFactory
A B
x y
JMS - "Publish/Subscribe"
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 45
Emetteur Destinataire
Topic
TopicConnectionFactory
A B
x y
JMS - "Publish/Subscribe"
TopicConnectionFactory connectionFactory =(TopicConnectionFactory) jndiContext.lookup("");
Topic topic = (Topic) jndiContext.lookup("/A/x");TopicConnection connection = connectionFactory.createTopicConnectio();
TopicSession session =connection.createTopicSession(false, Session.CLIENT_ACKNOWLEDGE);
TopicSession
TopicConnection
TopicSession
TopicConnection
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 46
Topic
Comme pour la Queue, ils peuvent tre soit dans JNDI soit crs par la sessionA la diffrence des Queues, ce ne sont pas des objets administrs, on peut crer un Topic la vole dans intervention de l'administrateurLes Topics peuvent tre hirarchiques, et on peut utiliser des expressions rgulires
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 47
TopicL'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 48
Emetteur Destinataire
Topic
TopicConnectionFactory
Messaging
A B
x y
JMS - "Publish/Subscribe"
TopicPublisher publisher = session.createPublisher(topic);
TopicSession
TopicConnection
TopicSession
TopicConnection
+
TopicPublisher
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 49
Emetteur Destinataire
Topic
TopicConnectionFactory
Messaging
A B
x y
JMS - "Publish/Subscribe"
TopicSubscriber subscriber =session.createSubscriber(topic);
subscriber.setMessageListener(listener);
TopicSession
TopicConnection
TopicSession
TopicConnection
+
TopicPublisher
+
TopicSubscriberListener
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 50
Emetteur Destinataire
Topic
TopicConnectionFactory
Messaging
A B
x y
JMS - "Publish/Subscribe"
TopicSession
TopicConnection
TopicSession
TopicConnection
+
TopicPublisher
publish +
TopicSubscriberListener
publisher.publish(msg);
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 51
Emetteur Destinataire
Topic
TopicConnectionFactory
Messaging
A B
x y
JMS - "Publish/Subscribe
TopicSession
TopicConnection
TopicSession
TopicConnection
+
TopicPublisher
publish +
TopicSubscriberListeneronMessag
evoid onMessage(Message msg) throws JMSException {
// unpack and handle the message
}
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 52
Mode diffusionMode rception
PtoP Pub sub
Synchrone receive receive
Asynchrone Onmessage onmessage
Synchrone/asynchrone
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 53
Parallle PtoP / Pubsub
Abstrait PtoP PubsubConnectionFactory QueueConnectionFactory TopicConnectionFactoryConnection QueueConnection TopicConnectionDestination Queue Topic Session QueueSession TopicSessionMessageProducer QueueSender TopicPublisher MessageConsumer QueueReceiver TopicSubscriber
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 54
Hirarchie de classes parallles
TopicSubscriber
MessageConsumer
QueueReceiver
receivesetMessageListener
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 55
Aperu du parallle
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 56
JMS 1.1 : unification Queue/TopicConnectionFactory 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 57
Filtrage de messages
Filtre
Prop = 'blue'Prop = 'green'
Prop = 'yellow'
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 58
Filtrage des messages en PtoP
Ct metteurmessage.setStringProperty(" myProp ", " blue ");
Ct rcepteurqueueReceiver = session.createReceiver(ioQueue,
"myProp = 'blue'");
Nota : il est impossible de modifier le slecteur du receiver aprs crationExpressions logiques pour le filtrageNota :
createReceiver (queue)createReceiver (queue, selector)
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 59
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
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 60
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 rsultatsSport/Football/*/Results
Toutes les quipesSport/Football/* Sport.Football.* (Sonic)
ESSI - Printemps 2004 JMS 1re partie - Annick Fron 61
Conclusions
JMS permet une communication par messagesUn 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 62
Quelques rfrences...Websphere MQ (ex MQSeries) d'IBM : http://www-3.ibm.com/software/ts/mqseries/messaging/Sonic MQ : http://www.sonicsoftware.com/products/sonicmq/index.sspJoram http://www.objectweb.org/joram (Open Source)Tibco : http://www.tibco.com/services/education/wbt_demo/wbt112/unit1/main.htmlSwift MQ : http://www.swiftmq.com/JMS Tutorial : http://java.sun.com/products/jms/tutorial/index.htmlMessage-driven bean : http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts5.htmlhttp://www.afceurope.com/JMS.html