Blue Flower

Chercher

Naviguer entre les messages d'une file d'attente de messages

Dans cet exemple on étudie comment naviguer dans une file d'attente de messages (queue) et traiter le message qu'on a besoin; pour cela on se sert d'une instance de l'interface QueueBrowser pour pouvoir examiner un message dans une Queue. Dans Cet exemple on décrit un exemple qui crée un objet QueueBrowser pour examiner un message au sein d'une file d'attente de message.

Le client MessageBrowser.java

Pour créer un objet QueueBrowser, on appelle la méthode JMSContext.createBrowser avec comme paramètre un variable de type Queue; on obtient les messages présents dans la Queue sous forme d'un objet de type Enumeration. On peut afficher les messages en parcourant l'objet de type Enumeration. Pour arriver au résultat final l'application client MessageBrowser.java passe par les étapes suivantes:

  1. Injecter les ressources
  2. Dans le bloc "try-with-resources", créer un objet JMSContext.
  3. Créer un objet QueueBrowser:
    QueueBrowser browser = context.createBrowser(queue);
    
  4. Extraire l'Enumeration qui contient les messages:
    Enumeration msgs = browser.getEnumeration();
    
  5. Vérifier l'Enumeration des messages puis afficher le contenu des messages:
    if ( !msgs.hasMoreElements() ) { 
        System.out.println("No messages in queue");
    } else { 
        while (msgs.hasMoreElements()) { 
            Message tempMsg = (Message)msgs.nextElement(); 
            System.out.println("Message: " + tempMsg); 
        }
    }
    
  6. Capturer et exécuter les exceptions.

Dans le Server d'application Glassfish la sortie d'un message est de la forme suivante:

Text:   This is message 3 from producer
Class:                  com.sun.messaging.jmq.jmsclient.TextMessageImpl
getJMSMessageID():      ID:8-10.152.23.26(bf:27:4:e:e7:ec)-55645-1363100335526
getJMSTimestamp():      1129061034355
getJMSCorrelationID():  null
JMSReplyTo:             null
JMSDestination:         PhysicalQueue
getJMSDeliveryMode():   PERSISTENT
getJMSRedelivered():    false
getJMSType():           null
getJMSExpiration():     0
getJMSPriority():       4
Properties:             {JMSXDeliveryCount=0}

Le code de l'aplication cliente MessageBrowser.java

/** 
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. 
* 
* You may not modify, use, reproduce, or distribute this software except in 
* compliance with  the terms of the License at: 
* http://java.net/projects/javaeetutorial/pages/BerkeleyLicense 
*/
package javaeetutorial.messagebrowser;
import java.util.Enumeration;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueBrowser;

/**
 * The MessageBrowser class inspects a queue and displays the messages it holds.
 */
public class MessageBrowser {
   
 @Resource(lookup = "java:comp/DefaultJMSConnectionFactory")    
private static ConnectionFactory connectionFactory;    
@Resource(lookup = "jms/MyQueue")    
private static Queue queue;
  
 /**   
* Main method.    
*    
* @param args not used     
*/   
public static void main(String[] args) {       
QueueBrowser browser;    
 /*         
* In a try-with-resources block, create context.        
* Create QueueBrowser.         
* Check for messages on queue.        
*/      
try (JMSContext context = connectionFactory.createContext();) {          
browser = context.createBrowser(queue);          
Enumeration msgs = browser.getEnumeration();         
if (!msgs.hasMoreElements()) {               
System.out.println("No messages in queue");         
} else {             
while (msgs.hasMoreElements()) {                   
Message tempMsg = (Message) msgs.nextElement();                   
System.out.println("\nMessage: " + tempMsg);
                }
            }
        } catch (JMSException e) {         
System.err.println("Exception occurred: " + e.toString());          
System.exit(1);     
}    
System.exit(0);   
}
}

Exécuter l'application cliente QueueBrowser

Pour exécuter l'exemple MessageBrowser utiliser la commande appclient et suivez les différentes étapes précisées ci-dessous; on a besoin aussi de l'exemple Producer pour envoyer des messages dans la file de message et un des clients pour les consommer

Pour exécuter les clients on a besoin de deux terminales (fenêtres d'exécution).

  1. Dans un terminal aller dans le répertoire où se trouve Producer:

  2. Exécuter le client Producer, envoyer un message dans la file d'attente de message avec le caractère de contrôle:

    appclient -client target/producer.jar queue
    

    The output of the client looks like this (along with some additional output):

    Destination type is queue
    Sending message: This is message 1 from producer
    Text messages sent: 1
    
  3. Dans un autre terminal aller dans repertoire ou strouve messagebrowser :

  4. Executer l'appli Client MessageBrowser comme suit:

    appclient -client target/messagebrowser.jar
    

    A la sortie de l'appli client on a:

    Message: 
    Text:   This is message 1 from producer
    Class:                  com.sun.messaging.jmq.jmsclient.TextMessageImpl
    getJMSMessageID():      ID:9-10.152.23.26(bf:27:4:e:e7:ec)-55645-1363100335526
    getJMSTimestamp():      1363100335526
    getJMSCorrelationID():  null
    JMSReplyTo:             null
    JMSDestination:         PhysicalQueue
    getJMSDeliveryMode():   PERSISTENT
    getJMSRedelivered():    false
    getJMSType():           null
    getJMSExpiration():     0
    getJMSPriority():       4
    Properties:             {JMSXDeliveryCount=0}
    Message: 
    Class:                  com.sun.messaging.jmq.jmsclient.MessageImpl
    getJMSMessageID():      ID:10-10.152.23.26(bf:27:4:e:e7:ec)-55645-1363100335526
    getJMSTimestamp():      1363100335526
    getJMSCorrelationID():  null
    JMSReplyTo:             null
    JMSDestination:         PhysicalQueue
    getJMSDeliveryMode():   PERSISTENT
    getJMSRedelivered():    false
    getJMSType():           null
    getJMSExpiration():     0
    getJMSPriority():       4
    Properties:             {JMSXDeliveryCount=0}
    

    Le premier message est TextMessage et le second est le "non-text" qui permet de contrôler la fin des messages.

  5. Aller dans le répertoire où se trouve synchconsumer.

  6. Exécuter le client SynchConsumer :

    appclient -client target/synchconsumer.jar queue
    

    La sortie affichée côté client ressemble à ce qui ci-dessous:

    Destination type is queue
    Reading message: This is message 1 from producer
    Messages received: 1
    

précédent