2014-05-20 2 views
1

J'ai parcouru l'API de RabbitTemplate. Il fournit uniquement la méthode receive qui récupère le message de la file d'attente. Cependant, il n'y a aucun moyen d'obtenir un message avec un identifiant de corrélation particulier. Pouvez-vous s'il vous plaît m'aider à comprendre ce qui me manque ici.Comment recevoir des messages d'un corrélateur de RabbitMQ en utilisant Spring AMQP

Actuellement, j'utilise les API JMS d'ActiveMQ pour recevoir des messages en utilisant le code suivant, lequel createConsumer avec un sélecteur de message. Vous cherchez à faire la même chose avec le printemps AMQP avec RabbitMQ:

private ObjectMessage receiveMessage(final String readQueue, final UUID correlationId, final boolean isBroadcastMessage, final int readTimeout) throws JMSException 
{ 
    final ActiveMQConnectionFactory connectionFactory = this.findConnectionFactory(readQueue); 
    Connection connection = null; 
    Session session = null; 
    MessageConsumer consumer = null; 
    ObjectMessage responseMessage = null; 

    try 
    { 
     connection = connectionFactory.createConnection(); 
     connection.start(); 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

     Destination destination = session.createQueue(readQueue); 

     consumer = session.createConsumer(destination, "correlationId = '" + correlationId + "'"); 
     final Message message = consumer.receive(readTimeout); 
    } 
    finally 
    { 
     if (consumer != null) 
     { 
      consumer.close(); 
     } 
     if (session != null) 
     { 
      session.close(); 
     } 
     if (connection != null) 
     { 
      connection.close(); 
     } 
    } 
    return responseMessage; 
} 

Répondre

1

Vous utilisez une chaîne messageSelector dans JMS; RabbitMQ/AMQP n'a pas d'équivalent. Au lieu de cela, chaque consommateur obtient sa propre file d'attente et vous utilisez un échange direct ou un sujet dans le courtier pour effectuer le routage. Je vous suggère de regarder the tutorials on the rabbitmq web site et topics.

Si vous utilisez l'ID de corrélation pour le traitement des demandes/réponses, envisagez d'utiliser les méthodes intégrées sendAndReceive ou convertSendAndReceive dans le modèle. Voir le reference documentation pour plus d'informations.

+0

Merci beaucoup Gary – GRaj

+0

Pouvons-nous définir le délai d'attente pour le retour de convertSendAndReceive? Si son délai est dépassé, convertSendAndReceive doit renvoyer une sorte d'exception. – GRaj

+0

Le délai d'attente par défaut est de 5 secondes, ajustez-le avec 'setReplyTimeout (long)' (millisecondes). Si cela expire, vous obtenez une valeur de retour nulle, pas une exception. –

Questions connexes