0% ont trouvé ce document utile (0 vote)
59 vues48 pages

Java Message Service (JMS) : Université Joseph Fourier (Grenoble 1) Polytech Grenoble Lig Erods

Transféré par

teja.benhadjalaya
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
59 vues48 pages

Java Message Service (JMS) : Université Joseph Fourier (Grenoble 1) Polytech Grenoble Lig Erods

Transféré par

teja.benhadjalaya
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

[Link]

fr/donsez

Java Message Service (JMS)

Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
PolyTech Grenoble LIG ERODS
[Link]@[Link]
[Link]@[Link]
03/05/2015 MOM & JMS, Didier Donsez, 1998-2012 1
03/05/2015

Motivation
 Messaging Oriented Middleware
 messagerie inter-applicative
l ’envoi et la réception des messages entre applications est asynchrone
les messages sont structurés et correspondent à des événements, des requêtes,
des rapports, ...
ne nécessite pas de connexion permanente comme pour le Cl/Sv

ne pas confondre avec le courrier électronique (API JavaMail)

 API Java [Link] d ’un client à un serveur MOM


 Modèles de messagerie (messaging)
Point à Point (Point-to-Point)
concept de Queue, une file d ’attente de messages
MOM & JMS, Didier Donsez, 1998-2012

Publication-Souscription (Publish-Subscribe)

concept de Topic, un sujet auquel s ’abonne un ou plusieurs Subscribers

 support pour les transactions distribuées XA

2
JMS targets enterprise messaging; the API is chosen to abstract the programming of a wide
variety of message-oriented-middleware (MOM) products in a vendor neutral and portable
manner, using the Java programming language. A Destination refers to a named physical
resource managed by the underlying MOM. It is administered and configured via vendor
provided tools, and typically accessed by a user application via the Java Naming and Directory
Interface (JNDI) APIs (external to JMS). A MessageProducer will send messages to a destination
and a MessageConsumer can receive messages from a destination. The destination can be
thought of a mini-message broker or a channel independent of the producers and consumers.
A Connection is a heavy-weight object representing the link between the application and the
middleware. Its attributes include a clientID. It provides methods to start() and stop()
communication and to close() a connection. MessageProducer is used to produce messages. A
default destination may be specified when the producer is created; it can also be specified when
sending messages. In addition, the delivery mode, priority, and expiration can be specified for
the outgoing message headers.
A persistent delivery mode means that a message will be delivered once-and-only-once; the
message is stored in permanent storage before the send() method returns. A non-persistent
delivery mode means that the message will be delivered at most once; a message may be
dropped if the JMS provider fails.
Static destinations are discovered via JNDI APIs, which bind logical destination names to
destination objects. The static destinations accessible this way must have been previously
configured in the JMS middleware (server) using vendor supplied administrative tool. Since JMS
discovery is administered, the static destinations must be determined and configured before a
client can use them.
The following is a list of JMS providers: • WebSphere Application Server from IBM,
• Apache ActiveMQ which provides an inbuilt default messaging provider
known as the Service Integration Bus (SIBus), or which
• Redis pub/sub
can connect to WebSphere MQ as a JMS
• Apache Qpid, using AMQP[5]
provider[6]
• Oracle Weblogic (part of the Fusion
• WebSphere MQ (formerly MQSeries) from
Middleware suite) and Oracle AQ from
IBM
Oracle
• FioranoMQ
• EMS from TIBCO
• FFMQ, GNU LGPL licensed
etc
• JBoss Messaging and HornetQ from JBoss
Generally, all Java Enterperise Edition servers
• JORAM, from the OW2 Consortium
offer a JMS provider
• Open Message Queue, from Oracle
• OpenJMS, from The OpenJMS Group
• Solace JMS from Solace Systems
• RabbitMQ by Rabbit Technologies Ltd.,
acquired by SpringSource
• SAP Process Integration ESB
• SonicMQ from Progress Software
• SwiftMQ
• Tervela
• Ultra Messaging from 29 West (acquired
by Informatica)
• webMethods from Software AG
03/05/2015

Architecture JMS
le client utilise les classes du package [Link] pour l ’envoi et la
réception de messages
le serveur implante un JMS Service Provider qu ’interface à son noyau

JMS Client JMS Client JMS Client Non-JMS Client X AdminTools


JMS Scope
   
Java Message Service (JMS) API X Native API (C,C++,Cobol, …)
MOM & JMS, Didier Donsez, 1998-2012

X JMS Service Provider

Message Type
 Message Repositories  Repository
X Messaging Server (or Broker)
5
03/05/2015
Modèle Point à Point
Point-to-Point
 Concept de Queue
Un (ou plusieurs) Sender envoie (produit) un message à une
Queue (i.e. file d ’attente de messages)
Chaque message de la Queue reçu que par un seul

receiver (consommateur) (plusieurs receivers peuvent


cohabiter)
 Messaging Server
Sender
MOM & JMS, Didier Donsez, 1998-2012



Sender
 (Message) Queue
 Receiver

Sender

6
03/05/2015
Modèle Publication-Souscription
Publish-Subscribe
 Concept de Topic (centre d intérêt)
Un (ou plusieurs) publishers envoie un message à un Topic
Tous les subscribers de ce Topic reçoivent le message



 Messaging Server 
Publisher Subscriber



MOM & JMS, Didier Donsez, 1998-2012

 
Publisher Topic Subscriber



 
Publisher Subscriber

7
JMS API Programming Model

Connection
Factory
creates

Connection

Message creates creates Message


Producer Session Consumer
receives
sends to creates from

Destination Msg Destination


03/05/2015

API JMS
 Superclasses communes à PTP et PubSub
JMS Parent Modèle PTP Modèle Pub/Sub
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
un objet administré par le provider pour créer une Connection

Connection QueueConnection TopicConnection


une connexion active vers un JMS provider

Destination Queue Topic


encapsule l’’identité d ’une destination

Session QueueSession TopicSession


contexte (mono-thread) pour l ’émission et la réception de messages

MessageProducer QueueSender TopicPublisher


MOM & JMS, Didier Donsez, 1998-2012

objet pour la production (l ’envoi) de messages vers une Destination


(créé par la Session)
MessageConsumer QueueReceiver,QueueBrowser TopicSubscriber
objet pour la consommation (la reception) de messages d ’une destination
(créé par la Session)
9
03/05/2015
Fonctionnement d ’un client
typique JMS
 Phase d ’initialisation (setup)
trouver l ’objet ConnectionFactory par JNDI
créer une Connection JMS

créer une (ou plusieurs) Session avec la Connection JMS

trouver un (ou plusieurs) objet Destination par JNDI

créer le(s) MessageProducer ou/et MessageConsumer


avec la Session et concernant la (les) Destination
demander à la Connection de démarrer la livraison des
messages
MOM & JMS, Didier Donsez, 1998-2012

 Phase de consommation/production de messages


créer des messages et les envoyer
recevoir des messages et les traiter

10
03/05/2015
Les objets administrés par le
Provider
 Les objets administrés par le Provider
 ConnectionFactory
point d ’accès à un serveur MOM
accessible par JNDI et enregistré par l ’administrateur du serveur MOM

 Destination
Queue ou Topic administré par le serveur MOM
accessible par JNDI et enregistré par l ’administrateur du serveur MOM

 Les objets
Connection
encapsule la liaison TCP/IP avec le Provider JMS
MOM & JMS, Didier Donsez, 1998-2012

authentifie le client et spécifie un identifiant unique de client

crée les Sessions et fournit le ConnectionMetaData

supporte (optionnel) l ’ ExceptionListener

Session

encapsule la liaison TCP/IP avec le Provider JMS

11
03/05/2015

[Link]
 Rôle
encapsule la liaison TCP/IP avec le Provider JMS
authentifie le client et spécifie un identifiant unique de client

 Cycle de vie
 initialisation/setup
crée les Sessions, MessageProducers et les MessageConsumers.
fournit le ConnectionMetaData

supporte (optionnel) l ’ ExceptionListener

 démarrage start()
procède à la livraison des Messages

 pause stop()
MOM & JMS, Didier Donsez, 1998-2012

interrompt la livraison des Messages entrants, n ’affecte pas l ’envoi


reprise start()
fermeture close()

libération des ressources


12
03/05/2015

[Link]

 Rôle
contexte mono-threadé
fabrique les MessageProducers et les MessageConsumers

fabrique les destinations temporaires TemporaryDestination

définit les numéros de série des messages (consommés et produits)

un ordre par Session et par Destination. Pas d ’ordre entre Destinations


 sérialise l ’exécution des MessageListeners enregistrés


méthode onMessage()

 définit une chaîne de transactions atomiques


la portée est définie par commit() ou rollback()

MOM & JMS, Didier Donsez, 1998-2012

 Acquittement des messages

13
03/05/2015

Tolérance aux pannes


et Acquittement des messages
 Principe
le client reçoit un message et peut ne le traiter que partiellement
avant une erreur (Crash, Exception, …)
En cas d ’erreur dans une Session, le provider JMS renvoie (redeliver) ce

message au client tant que le client n ’a pas acquitté ce message.


 Modes d ’acquittement
mode automatique
mode manuel

14
03/05/2015

[Link]
 représente l ’objet consommateur des messages
 fabriqué par la Session
QueueReceiver [Link](Queue queue, String messageSelector)
TopicSubscriber [Link](Topic topic, String messageSelector, boolean)

Remarque : il peut y avoir plusieurs MessageConsumers


sur une Session pour une même Destination
Sous-interfaces : QueueReceiver, TopicSubscriber

 Réception Synchrone des messages


 le client se met en attente du prochain message
Message receive(), Message receive(long timeout), Message receiveNoWait()
 Réception Asynchrone des messages
le client crée un objet qui implémente l ’interface MessageListener
et positionne cet objet à l ’écoute des messages
void setMessageListener(MessageListener) / MessageListener getMessageListener()
quand un message arrive, la méthode void onMessage(Message) de l ’objet
MessageListener est invoquée
La session n ’utilise qu’une seule thread pour exécuter séquentiellement tous les
MessageListeners
16
03/05/2015

[Link]
 représente l ’objet producteur des messages
 fabriqué par la Session
QueueSender [Link](Queue queue)
TopicPublisher [Link](Topic topic)

Remarque : il peut y avoir plusieurs MessageProducers


sur une Session pour une même Destination
Sous-interfaces : QueueSender, TopicPublisher

 Production des messages


void [Link](Message)
void [Link](Message)

17
03/05/2015
Le modèle Point à Point
Point-To-Point PTP
 Classes et interface
JMS Parent Modèle PTP
ConnectionFactory QueueConnectionFactory
Connection QueueConnection
Destination Queue, TemporaryQueue
Session QueueSession
MessageProducer QueueSender
MessageConsumer QueueReceiver
-- QueueBrowser
 Remarques
plusieurs sessions peuvent se partager une même queue : JMS ne
spécifie pas comment le provider répartit les messages entre les
MOM & JMS, Didier Donsez, 1998-2012

QueueReceiver de ces sessions.


Les messages non sélectionnés restent dans la queue : l ’ordre de

réception n ’est plus alors l ’ordre de production


QueueBrowser permet de consulter les messages de la Queue sans les

retirer en les énumérant (méthode Enumeration getEnumeration())


18
03/05/2015
Le modèle Publication-Souscription
Publish-Subscribe PubSub
 Classes et interface
JMS Parent Modèle Pub/Sub
ConnectionFactory TopicConnectionFactory
Connection TopicConnection
Destination Topic
Session TopicSession
MessageProducer TopicPublisher
MessageConsumer TopicSubscriber

 Remarque
MOM & JMS, Didier Donsez, 1998-2012

le terme « publier » correspond à « produire »


le terme « souscrire » correspond à « consommer »

19
03/05/2015
Le modèle de Messages JMS
L ’interface [Link]
 Motivation
 Modèle commun à tous les produits
Supporte l’hétérogénéïté des clients (non JMS, langage, plate-forme, ...)
Supporte les objets Java et les documents XML

 L’interface [Link]
 sous-interfaces: BytesMessage, MapMessage, ObjectMessage, StreamMessage, TextMessage
 Structure d ’un Message
 Entête (header)
champs communs aux Providers (Produit) et obligatoires
destinés au routage et l ’identification du message
MOM & JMS, Didier Donsez, 1998-2012

 Propriété (property)
champs supplémentaires
propriétés standards : équivalent aux champs d ’entête optionnels

propriétés spécifiques au (produit) provider

propriétés applicatives : peuvent répliquer le contenu d ’une valeur du corps

 Corps (body)
contient les données applicatives
 20
03/05/2015
Le modèle de Messages JMS
Les champs d ’entête
 Nom des champs d ’entête
JMSDestination : destination du message
JMSDeliveryMode : sûreté de distribution
NON_PERSISTENT : faible
PERSISTENT : garantie supplémentaire qu ’un message ne soit pas perdu
JMSExpiration : calculé à partir du TTL (Time To Live) depuis la prise en charge
JMSMessageID : identifiant du Message founi par le provider
JMSTimestamp : date de prise en charge du message par le provider
JMSCorrelationID : identifiant d ’un lien avec un autre Message (Request/Reply)
JMSReplyTo : identifiant de la Destination pour les réponses
MOM & JMS, Didier Donsez, 1998-2012

JMSType : identifiant du type de message défini par l’émetteur


JMSRedelivered : n’a du sens que si le récepteur n ’acquitte pas immédiatement la
réception (Transaction)
JMSPriority : priorité (de 0 à 9) du message
 Consultation/Modification
 méthodes setXXX() / getXXX() où XXX est le nom du champ d ’entête 21
03/05/2015
Le modèle de Messages JMS
Les champs de propriétés
 Nom des propriétés
 propriétés standards : nom préfixé par JMSX
correspondent à des champs d ’entête optionnels

JMSXUserID, JMSXAppID : identité de l ’utilisateur et de l ’application


JMSXGroupID, JMSXGroupSeq : groupe de messages et son numéro de séq
JMSXProducerTXID, JMSXConsumerTXID : identifiants de transaction
JMSXRcvTimestamp : date de réception
JMSXState : 1(waiting), 2(ready), 3(expired), 4(retained)
JMSXDeliveryCount : The number of message delivery attemps

 propriétés spécifiques : nom préfixé par JMS_VendorName


MOM & JMS, Didier Donsez, 1998-2012

 propriétés applicatives : autre


servent au filtrage
servent comme données complémentaires au corps

exemple : la date d ’expiration d ’un document XML véhiculé par un StringMessage

22
03/05/2015
Le modèle de Messages JMS
Les champs de propriétés
 Enumération des propriétés
Enumeration getPropertyNames() / Enumeration [Link]()
énumère les propriétés (JMSX) du message
boolean propertyExists(String) teste l ’existence d ’une propriété

 Valeur des propriétés


 Type : boolean, byte, short, int, long, float, double, String
méthodes void setIntProperty(String,int), void setBooleanProperty(String,boolean), ...

méthodes int getIntProperty(String), boolean getBooleanProperty(String), ...


 L ’appel à getXXXProperty() retourne null si la propriété n ’existe pas


Les propriétés d ’un message reçus sont en lecture seule
MOM & JMS, Didier Donsez, 1998-2012

sinon l ’exception MessageNotWriteableException est levée


 Type Objet correspondant : Boolean,Byte,Short,Int,Long,Float,Double,String
méthode void setObjectProperty(String,Object)

méthode Object getObjectProperty(String)


 Réinitialisation des propriétés : void clearProperties() 23


03/05/2015
Le modèle de Messages JMS
Le corps (body) du message
 Sous interfaces de [Link] :
[Link]
 contient une String qui peut être un document XML, un message SOAP…
 String getText()/ setText(String)
[Link]
contient un ensemble de paires name-value
int getInt(String name) / setInt(String name, int value), …

Object getObject(String)/ setObject(String,Object), Enumeration getMapNames()

[Link]
 contient un objet Java sérialisé : Object getObject()/ setObject(Object)
[Link]
contient un tableau de bytes (non interprétés)
MOM & JMS, Didier Donsez, 1998-2012

int readInt()/writeInt(int), …, int readBytes(Byte[])/writeBytes(Byte[]),

Object readObject()/ writeObject(Object), reset()

[Link]
contient un flot de données (Java primitives) qui s ’écrit et se lit séquentiellement
int readInt()/writeInt(int), …, String readString()/writeString(String)

Object readObject()/ writeObject(Object), reset() 24


03/05/2015
Remarque: Message SOAP sur
JMS
In a recent "Strategic Planning" research note,
Gartner issued a prediction that "by 2004, more than
25 percent of all standard Web services traffic will be
asynchronous...." and "by 2006, more than 40
percent of the standard Web services traffic will be
asynchronous."
MOM & JMS, Didier Donsez, 1998-2012

25
03/05/2015
Le modèle de Messages JMS
Le corps (body) du message
 Méthodes
la méthode clearBody() réinitialise le corps

 Remarque
le corps d ’un message reçu est en lecture seule

MOM & JMS, Didier Donsez, 1998-2012

26
03/05/2015
Le modèle de Messages JMS
Le corps (body) du message
String textstr = "<?xml version=\"1.0\"?><!DOCTYPE person SYSTEM \"[Link]\">"
+"<person><firstname>Joe</firstname><lastname>Smith</lastname>"
+"<salary value=\"10000.0\"><age value=\"38\"></person>";
// l ’API [Link] est préférable pour construire le document XML
TextMessage textmsg = [Link]();
[Link](textstr);

MapMessage mapmsg = [Link]();


[Link]("Firstname", "Joe"); [Link]("Lastname", "Smith");
[Link]("Salary", 10000.0); [Link]("Age", 38);

Person object = new Person("Joe","Smith", 37); [Link](38); [Link](10000.0);


ObjectMessage objectmsg = [Link]();
[Link](object); // Person doit implémeter [Link]
MOM & JMS, Didier Donsez, 1998-2012

Byte[] bytesarray = { 'J','o','e',' ','S','m','i','t','h'};


BytesMessage bytesmsg = [Link]();
[Link](bytesarray); [Link](38); [Link](10000.0);

StreamMessage streammsg = [Link]();


[Link]("Joe"); [Link]("Smith");
[Link](38); [Link](10000.0);

27
03/05/2015
Le modèle de Messages JMS
Le corps (body) du message
TextMessage textmsg = (TextMessage)receivedmsg;
String textstr=[Link](textstr); [Link](textstr);
// le document XML peut être parsé

MapMessage mapmsg = (MapMessage)receivedmsg;


String firstname= [Link]("Firstname");
String lastname= [Link]("Lastname");
long age= [Link]("Age"); double salary= [Link]("Salary");
[Link](firstname + " " + lastname + " " + age + " " + salary);

ObjectMessage objectmsg = (ObjectMessage)receivedmsg;


Person object = (Person)[Link]();
[Link]([Link]());

BytesMessage bytesmsg = (BytesMessage)receivedmsg;


MOM & JMS, Didier Donsez, 1998-2012

Byte[] bytesarray ;
int length=[Link](bytesarray);
long age= [Link](); double salary= [Link]();

StreamMessage streammsg = (StreamMessage)receivedmsg;


String firstname= [Link](); String lastname= [Link]();
long age= [Link](); double salary= [Link]();
[Link](firstname + " " + lastname + " " + age + " " + salary);
28
03/05/2015
Le modèle de Messages JMS
La sélection (filtrage) des messages
 Motivation
le MessageProducer catégorise les messages à envoyer avec les propriétés
le MessageConsumer peut filtrer les messages reçus

l ’expression de sélection est spécifiée à la fabrication du MessageConsumer


les messages reçus sont ceux qui vérifient l ’expression de sélection


 Expressions de sélection
 sous-ensemble de SQL-92
identifiants, littéraux (Chaînes, Numériques, TRUE/FALSE)
connecteurs OR, AND, NOT, ( )
MOM & JMS, Didier Donsez, 1998-2012

>, <, >=, <=, <>, =, BETWEEN, LIKE, IN, IS [NOT] NULL
 Exemple
String selector="JMSType='car' AND ( color='blue' OR color='red' ) AND price IS NOT NULL";
QueueReceiver receiver= [Link](queue, selector);

29
03/05/2015
Exemple : Point à Point
La partie commune
class JMSQueueTest {
static Context messaging; static QueueConnectionFactory queueConnectionFactory; static Queue queue;
static QueueConnection queueConnection; static QueueSession queueSession;
static QueueSender queueSender; static QueueReceiver queueReceiver;
static void setup(String queueConnectionFactoryName, String queueName){
messaging = new InitialContext();
queueConnectionFactory = (QueueConnectionFactory)[Link](queueConnectionFactoryName);
queue = (Queue) [Link](queueName);
queueConnection = [Link]();
queueSession = [Link](false,Session.AUTO_ACKNOWLEDGE);
}
static void setupSender(String queueConnectionFactoryName, String queueName){
setup(queueConnectionFactoryName, queueName);
queueSender = [Link](queue);
MOM & JMS, Didier Donsez, 1998-2012

[Link]();
}
static void setupReceiver(String queueConnectionFactoryName, String queueName){
setup(queueConnectionFactoryName, queueName);
queueReceiver = [Link](queue);
[Link]();
}}

30
03/05/2015
Exemple : Point à Point
Sender
// java JMSQueueSenderTest testServer testQueue Hello 10.0 10
public class JMSQueueSenderTest extend JMSQueueTest {

static void send(String stringValue,double doubleValue, long doubleValue, boolean booleanProperty) {


MapMessage message = [Link]();
[Link]("stringValue", stringValue);
[Link]("doubleValue", doubleValue);
[Link]("longValue", longValue);
[Link]("exit", booleanProperty);
[Link](message);
}

public static void main(String args[]) {


setupSender(argv[0],argv[1]);
long cpt=[Link](argv[4]);
MOM & JMS, Didier Donsez, 1998-2012

while(--cpt>0) {
send(argv[2]+cpt,[Link](agv[3]).valueDouble()+cpt,cpt, false);
}
send(argv[2]+cpt,agv[3]+cpt,cpt, true);
close();
}}

31
03/05/2015
Exemple : Point à Point
Receiver synchrone
// java JMSQueueSyncReceiverTest testServer testQueue
public class JMSQueueSyncReceiverTest extend JMSQueueTest {
static boolean exit=false;
static void handleMessage(MapMessage message) {
String stringValue=[Link]("stringValue"); [Link](" stringValue="+stringValue);
double doubleValue=[Link]("doubleValue"); [Link](" doubleValue="+doubleValue);
long longValue=((Long)[Link]("longValue")).longValue(); [Link](" longValue="+longValue);
exit = [Link]("exit");
}
static void syncReceive() {
MapMessage message;
while(!exit) {
message= (MapMessage)[Link]();
handleMessage(message);
}
}
MOM & JMS, Didier Donsez, 1998-2012

public static void main(String args[]) {


setupReceiver(argv[0],argv[1]);
syncReceiver();
close();
}}

32
03/05/2015
Exemple : Point à Point
Receiver asynchrone
// java JMSQueueAsyncReceiverTest testServer testQueue public class MyListener implements
[Link] {
void onMessage(Message message) { [Link]((MapMessage)message); }
}
public class JMSQueueAsyncReceiverTest extend JMSQueueTest {
static boolean exit=false;
static void handleMessage(MapMessage message) {
String stringValue=[Link]("stringValue"); [Link](" stringValue="+stringValue);
double doubleValue=[Link]("doubleValue"); [Link](" doubleValue="+doubleValue);
long longValue=((Long)[Link]("longValue")).longValue(); [Link](" longValue="+longValue);
exit = [Link]("exit");
}
static void asyncReceive() {
[Link](new MyListener());
while(!exit) { /* doSomething */ }
}
MOM & JMS, Didier Donsez, 1998-2012

public static void main(String args[]) {


setupReceiver(argv[0],argv[1]);
asyncReceiver();
close();
}}

33
03/05/2015
Exemple : Publication Souscription
La partie commune
class JMSTopicTest {
static Context messaging; static TopicConnectionFactory topicConnectionFactory; static Topic topic;
static TopicConnection topicConnection; static TopicSession topicSession;
static TopicPublisher topicPublisher ; static TopicSubscriber topicSubscriber ;
static void setup(String topicConnectionFactoryName, String topicName){
messaging = new InitialContext();
topicConnectionFactory = (TopicConnectionFactory)[Link](topicConnectionFactoryName);
topic = (Topic) [Link](topicName);
topicConnection = [Link]();
topicSession = [Link](false,Session.AUTO_ACKNOWLEDGE);
}
static void setupPublisher(String topicConnectionFactoryName, String topicName){
setup(topicConnectionFactoryName, topicName);
topicPublisher = [Link](topic);
[Link]();
MOM & JMS, Didier Donsez, 1998-2012

}
static void setupSubscriber(String topicConnectionFactoryName, String topicName){
setup(topicConnectionFactoryName, topicName);
topicSubscriber = [Link](topic);
[Link]();
}}

35
03/05/2015
Exemple : Publication Souscription
Publisher
// java JMSTopicPublisherTest testServer testTopic Hello 10.0 10
public class JMSTopicPublisherTest extend JMSTopicTest {

static void publish(String stringValue,double doubleValue, long doubleValue, boolean booleanProperty) {


MapMessage message = [Link]();
[Link]("stringValue", stringValue);
[Link]("doubleValue", doubleValue);
[Link]("longValue", longValue);
[Link]("exit", booleanProperty);
[Link](message);
}

public static void main(String args[]) {


setupPublisher(argv[0],argv[1]);
long cpt=[Link](argv[4]);
MOM & JMS, Didier Donsez, 1998-2012

while(--cpt>0) {
publish(argv[2]+cpt,[Link](agv[3]).valueDouble()+cpt,cpt, false);
}
publish(argv[2]+cpt,agv[3]+cpt,cpt, true);
close();
}}

36
03/05/2015
Exemple : Publication Souscription
Subscriber synchrone
// java JMSTopicSyncSubscriberTest testServer testTopic
public class JMSTopicSyncSubscriberTest extend JMSTopicTest {
static boolean exit=false;
static void handleMessage(MapMessage message) {
String stringValue=[Link]("stringValue"); [Link](" stringValue="+stringValue);
double doubleValue=[Link]("doubleValue"); [Link](" doubleValue="+doubleValue);
long longValue=((Long)[Link]("longValue")).longValue(); [Link](" longValue="+longValue);
exit = [Link]("exit");
}
static void syncSubscribe() {
MapMessage message;
while(!exit) {
message= (MapMessage)[Link]();
handleMessage(message);
}
}
MOM & JMS, Didier Donsez, 1998-2012

public static void main(String args[]) {


setupSubscriber(argv[0],argv[1]);
syncSubscriber();
close();
}}

37
03/05/2015
Exemple : Publication Souscription
Subscriber asynchrone
// java JMSTopicAsyncSubscriberTest testServer testTopic
public class MyListener implements [Link] {
void onMessage(Message message) { [Link]((MapMessage)message); }
}
public class JMSTopicAsyncSubscriberTest extend JMSTopicTest {
static boolean exit=false;
static void handleMessage(MapMessage message) {
String stringValue=[Link]("stringValue"); [Link](" stringValue="+stringValue);
double doubleValue=[Link]("doubleValue"); [Link](" doubleValue="+doubleValue);
long longValue=((Long)[Link]("longValue")).longValue(); [Link](" longValue="+longValue);
exit = [Link]("exit");
}
static void asyncSubscribe() {
[Link](new MyListener());
while(!exit) { /* doSomething */ }
MOM & JMS, Didier Donsez, 1998-2012

}
public static void main(String args[]) {
setupSubscriber(argv[0],argv[1]);
asyncSubscriber();
close();
}}

38
03/05/2015

Le Transactionnel dans JMS


 Motivation
inclure la production et consommation de messages d ’un
client dans la portée d ’une transaction distribuée (JTA)
une Queue ou un Topic sont considérés comme des ressources XA
en cas d ’abandon, les messages ne sont pas postés ou retirés

le JMS Provider doit garantir la livraison « une et une seule fois »

Remarque : un messsage ne peut pas être posté et retiré dans la même

transaction
 API
JMS Root PTP Interface Pub/Sub Interface
MOM & JMS, Didier Donsez, 1998-2012

ServerSessionPool
ServerSession
ConnectionConsumer
XAConnectionFactory XAQueueConnectionFactory XATopicConnectionFactory
XAConnection XAQueueConnection XATopicConnection
XASession XAQueueSession XATopicSession
39
03/05/2015
Modèle Requête-Réponse (i)
Request-Reply
 Principe
Client-Serveur en mode Asynchrone
mais nombreux styles de Requête-Réponse

1- un message de requête donne un message de réponse


2- un message de requête donne un flot de messages de réponse de la part de plusieurs

serveurs (respondents)
...

 Non explicitement supporté par JMS


 mais JMS fournit des facilités pour le construire
la création de TemporaryQueue et de TemporaryTopic temporaires utilisées pour les
MOM & JMS, Didier Donsez, 1998-2012

réponses (à Destination unique)


le champ d ’entête de message JMSReplyTo

 qui spécifie la Destination pour la réponse


le champ d ’entête de message JMSCorrelationID

 qui peut être utilisé comme référence de la requête originelle


40
03/05/2015

Modèle Requête-Réponse (ii)


 Proposition d ’implantation de 1 (avec les Queues de JMS)

Messaging Server
 (Reply for A) 
reply XA
Client A Temporary Queue reply XA

request A

Request Queue request A
 Server X
 request B

request B
MOM & JMS, Didier Donsez, 1998-2012

Client B  (Reply for B) 


reply XB Temporary Queue reply XB

 Question :
 A quoi peut servir le partage de la Queue par plusieurs serveurs ?
41
03/05/2015

Modèle Requête-Réponse (ii)

Messaging Server
(Reply for A)
Client A Temporary Queue

request A

Request Queue
MOM & JMS, Didier Donsez, 1998-2012

42
03/05/2015

Modèle Requête-Réponse (ii)

Messaging Server
 (Reply for A) 
reply XA
Client A Temporary Queue reply XA


Request Queue request A Server X
MOM & JMS, Didier Donsez, 1998-2012

43
03/05/2015

Modèle Requête-Réponse (ii)

Messaging Server

Client A

Request Queue  Server X


MOM & JMS, Didier Donsez, 1998-2012

 request B

request B
Client B  (Reply for B) 
reply XB Temporary Queue reply XB

44
03/05/2015

Modèle Requête-Réponse (iii)


 Proposition d ’implantation de 2 (avec les Topics de JMS)

Messaging Server

Client A
 
Temporary Queue
(Publisher)  reply Y (one per client)
 reply Y
reply X reply X

 Server X
request A (Subscriber)
MOM & JMS, Didier Donsez, 1998-2012

 Topic
 Server Y
request A request A (Subscriber)

 Remarque :
le serveur Z n ’est pas obligé de fournir une réponse
 Server Z
request A (Subscriber)

45
03/05/2015

Modèle Requête-Réponse (iii)


 QueueRequestor/TopicRequestor
classes utilitaires
qui implantent de la modèle synchrone de Requête-Réponse
la Session ne peut être transactionnelle

 Cycle de vie
création avec le constructeur
QueueRequestor(QueueSession session, Queue queue)
TopicRequestor(TopicSession session, Topic topic)
envoi d ’une requête et attente de la réponse

Message request(Message msg)


MOM & JMS, Didier Donsez, 1998-2012

fermeture pour libérer les ressources void close()

 Remarque
 la Session ne peut être transactionnelle

46
03/05/2015

Les Destinations Temporaires


objet unique, qui ne peut être copié
fabriqué par la Session dont la durée de vie n ’excède pas la Connection

peut être détruit (delete()) après usage pour libérer des ressources

ne peut être consommée que par la Connection

typiquement utilisé pour le modèle Requête-Réponse (propriété

JMSReplyTo)
 TemporaryQueue
objet unique, sous interface de Queue
fabriquée par [Link]()

n ’existe que durant une QueueConnection


MOM & JMS, Didier Donsez, 1998-2012

47
03/05/2015

Ce que JMS n ’adresse pas


 En tant qu ’API Client, JMS n ’adresse pas
Administration du produit MOM
Équilibrage de charge et Tolérance aux Pannes

Dépôt des types de message

JMS ne fournit pas un dépôt des formats (types) de message ni un langage de


définition
 Notification d ’erreur et d ’avertissement
chaque produit peut envoyer aux clients des messages systèmes
JMS ne normalise pas ces messages.

 Sécurité
JMS ne contrôle pas la confidentialité et l ’intégrité des messages

MOM & JMS, Didier Donsez, 1998-2012

Protocole de transport
Déploiement

 Extensions proposées par des éditeurs de MOM


 Topics hiérarchiques, Dead queue, XMLMessage …

49
03/05/2015

JMS dans J2EE


 Partie intégrante de J2EE/EJB
JNDI : recherche des objets administrés
JTA : XASession

EJB : Message-Driven Bean


MOM & JMS, Didier Donsez, 1998-2012

50

Vous aimerez peut-être aussi