Cours de Patrice Torguet sur JMS Rédigé par
Thomas Delaux
1/5
Objets gérés à
l’extérieur de
l’application
Java Message Service
API JAVA pour travailler avec des MOM (Message Oriented Middleware)
Providers mulitples : Interaction standardisée (production et consommation de
message)
Interaction non standardisée (création, nommage,
administration des files et topics)
Le package java se nomme javax.jms (JMS 1.1)
L’architecture de JMS :
1 Concept de QUEUE/File de message
Point à point
Producteurs de messages
Consommateur de messages (en général 1 seul)
Classes : - QueueConnectionFactory
- Queue
- QueueConnection
- QueueSession transaction
- QueueSender / QueueReceiver / QueueBrowser
2 Concept de Topic (publication/souscription)
Classes : - TopicConnection/TopicConnectionFactory
- Topic
- TopicSession
- TopicSender / TopicReceiver
3 Super classes
Manipulation uniforme Queue/topics
Classe : - Connection / ConnectionFactory
- Destination
- Session
- MessageProducer / MessageConsummer
4 Fonctionnement d’un client JMS
Trouver l’objet ConnectionFactory via JNDI (Java Naming and Directory Service)
Trouver un ou plusieurs objets destination via JNDI
Créer une connexion JMS
Serveur
Applic
ations JAVA
Applic
ations JAVA
Applic
ations JAVA
API JAVA
Provider JMS
Applic
ations C
API C
Cours de Patrice Torguet sur JMS Rédigé par
Thomas Delaux
2/5
Créer 1 ou plusieurs Sessions avec la connexion JMS
Créer le(s) MessageProducer/MessageConsumer en précisant Session/Destination
Demander à la connexion de démarrer la livraison des messages.
Créer des messages et les envoyer et/ou recevoir des messages et les traiter.
5 ConnexionFactory
Point d’accès à 1 serveur MOM accessible via JNDI et enregistré par
l’administrateur.
Content jndiContext = new InitialContext() ; JNDI
ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(« Nom de connexion factory »)
;
6 Connection
* Encapsule la liaison socket/RMI/http/… avec le protocole JMS
* Authentification du client (login/mot de passe)
* crée les sessions et fournit des métas données sur le provider.
* gère l’exceptionListener qui permet de récupérer les exceptions de façon
asynchrones
Connection c = cf.createConnection() ;
7 Destination
Accès via JNDI
Destination d = (Destination)jndiContext.lookup(« Nom de la destination ») ;
8 Session
C’est ce qui permet de faire les transactions.
contexte mono-threadé
fabrique les producteurs/consommateurs
fabrique les destinations temporaires
gère les numéros de série des messages (ordre par session et par destination)
gère les transactions
acquittement des messages (automatique ou manuel)
Session session = c.createSession(boolean transaction, int acquittement)
acquittement : Session.AUTO_ACKNOWLEDGE
9 Message Producer
* Représente le producteur du message
MessageProducer prod= session.createProducer(destination) ;
prod.send(message) ;
10 Message consumer
* représente le consommateur de messages
* réception synchrone par rapport à la connexion
Message receive() ;//bloquante
Message receive(long timeout) ;//bloque pendant timeout ms
Message receiveNoWait() ;//Non Bloquant
* Réception ascynchrone
void setMessageListener(MessageListener ml) ; // le plus utilisé
public interface MessageListener{
public void on Message(message m) ;
Cours de Patrice Torguet sur JMS Rédigé par
Thomas Delaux
3/5
}
Quand un message arrive, cette méthode est appelée.
Messageconsumer mc = Session.createConsumer(destination d)
Messageconsumer mc = Session.createConsumer(destination d, String selecteur)
Messageconsumer mc =Session.createConsumer(destination d, String selecteur, boolean
noLocal)
noLocal à vrai : on ne récupère pas les messages créés localement.
10.1 Pour les topics uniquement
MessageConsumer mc = createDurableSubscriber(Topic t, String nom[, String sélecteur,
[Boolean noLocal]])
Dans ce cas, le provider stocke les messages entre 2 exécutions de l’application.
11 Classe message
- Gère l’hétérogénéité (TextMessage, MapMessage, StreamMessage)
- Gère les objets Java Serializable (ObjectMessage)
- Gère les messages XML sous forme de texte (TextMessage)
11.1 Sous classes
- ByteMessage
- MapMessage
- ObjectMessage
- StreamMessage
- TextMessage.
11.2 Structure
Header, properties, body
Header : Standard
Properties : aux choix
Body en fonction de la sous classe.
11.2.1 Header
Une méthode set et get existent sur toutes les propriétés suivantes
Destination JMSDestination
Int JMSDeliveryMode : Message Non persistant / persistant. Il y a plus de garanties que le
message ne soit pas perdu en mode persistant.
Long JMSExpiration : durée de vie du message en milliseconde.
Long JMSTimestamp : Date de production. Nombre de millisecondes depuis le 1 janvier 1970.
String JMSMessageID : identificateur du message. Gérée par le provider.
String JMSCorrelationID : lors d’une réponse, référence au message d’origine.
Destination JMSReplyTo : destination pour répondre au message
String JMSType : type utilisateur pour le message
Boolean JMSRedelivered : si y’a pas d’acquittement automatique et que le message n’est pas
acquitter, il passe à vrai.
Int JMSPRiority : priorité du message entre 0 et 9 (0 min et 9 max)
11.2.2 Propriétés
- Champs nommés
- Types : booléen, byte, short, int, long, long, float, double, String
- Methodes :
o Void setIntProperty(String nom, int prop);
o Int getIntProperty(String nom);
- Enumeration : Enumeration getPropertyNames();
Cours de Patrice Torguet sur JMS Rédigé par
Thomas Delaux
4/5
11.2.3 Body
TextMessage : void setText(string s)/ String getText();
ObjectMessage : void setObject(Serializable o)/Serializable getObject();
MapMessage : void setInt(String nom, int Valeur)/int getInt(String Nom); …
StreamMessage : void writeInt(int val)/int readInt(); …
On peut mettre des objets dans le stream void writeObject(serializable o)- mais ils
ne sont pas portables.
ByteMessage : même méthodes que pour stream +
void writeBytes(Bytes[])/int readBytes(Bytes[])
Remarques :
void clearBody(); : permet de re-initialiser le message
Un message reçu est en lecture seule.
12 Sélection/Filtrage de messages
Expression de sélection donnée au consommateur lors de la création
Implémenté en SQL92
- Identifiants (noms headers/propriétés)
- Littéraux (valeurs numériques, chaînes, TRUE/FALSE)
- Connecteurs (OR, AND, NOT, (), <, >, <=, >=, <>, =, BETWEEN, IN, IS [NOT]
NULL.
On peut filtrer uniquement sur les headers et les properties.
12.1 Exemple
String selector = “JMSType=‘car’ AND (color=‘blue’ OR color=’red’) AND price IS NOT NULL”;
MessageConsummer conso = session.createConsummer(dest, selector);
13 Exemples
13.1 Exemple producteur
Context context = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) context.lookup(“nomFactory”);
Destination d = (Destination) context.lookup("nomDest");
Connection c = cf.createConnection(“login”, “passwd”) ;
Session s = c.createSession (false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = s.createProducer(d);
c.start(); // démarre la production de message
TextMessage mess = s.createTextMessage() ;
mess.setText(“message texte”);
msg.send(mess);
context.close();
c.close();
13.2 Exemple consommateur
Context context = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) context.lookup(“nomFactory”);
Destination d = (Destination) context.lookup("nomDest");
Connection c = cf.createConnection(“login”, “passwd”) ;
Session s = c.createSession (true, Session.AUTO_ACKNOWLEDGE);
MessageConsumer mp = s.createConsumer(d);
c.start(); // démarre la production de message
Message mess = mc.receive() ;
if (mess instanceof TextMessage){
TextMessage txtmess = (textMessage)mess ;
System.out.println(“reception de “ + txtmess.getText());
s.commit();
}
Cours de Patrice Torguet sur JMS Rédigé par
Thomas Delaux
5/5
else {s.roolback();}
context.close();
c.close();
14 Modèle requête / réponse
2 types :
- À 1 requête 1 réponse : queue
- À 1 requête flots de réponses : topics
Coté client :
- Création d’une Temporary Queue pour la réponse
- setJMSReplyTo de cette file
Traitement requete :
- setJMSCorrelationID
- On renvoie sur la destination donnée par getJMSReplyTo
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !