1 Concept de QUEUE/File de message 2 Concept de Topic

publicité
Cours de Patrice Torguet sur JMS
Rédigé par
Thomas Delaux
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 :
Applic
ations JAVA
Applic
ations JAVA
Applic
ations JAVA
API JAVA
Applic
ations C
API C
Provider JMS
Serveur
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
Objets gérés à
l’extérieur de
l’application
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
1/5
Cours de Patrice Torguet sur JMS
•
•
•
•
•
Rédigé par
Thomas Delaux
Créer une connexion JMS
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{
2/5
Cours de Patrice Torguet sur JMS
Rédigé par
Thomas Delaux
public void on Message(message m) ;
}
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();
3/5
Cours de Patrice Torguet sur JMS
11.2.3
Rédigé par
Thomas Delaux
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();
}
4/5
Cours de Patrice Torguet sur JMS
Rédigé par
Thomas Delaux
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
5/5
Téléchargement