1 Concept de QUEUE/File de message 2 Concept de Topic
Transcription
1 Concept de QUEUE/File de message 2 Concept de Topic
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