2016-01-23 1 views
0

J'envoie des messages à une file d'attente JMS. Quels sont les moyens possibles de rechercher un message particulier dans une file d'attente à consommer?Comment rechercher un message particulier dans la file d'attente JMS

J'ai essayé de la façon suivante: Je suis en train de l'JMSCorrelationID tout en envoyant un message à la file d'attente:

public void createDQueue(String queuename, String json, Integer userid) { 
      try { 

       QueueSession.AUTO_ACKNOWLEDGE); 
       Queue queue = session.createQueue(queuename); 
       ObjectMessage objectMessage = session.createObjectMessage(); 
       objectMessage.setJMSCorrelationID(String.valueOf(userid)); 
       objectMessage.setObject(json); 
       session.createSender(queue).send(objectMessage); 
       session.close(); 
       connection.close(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 

Dans le code de la consommation, je veux transmettre ce message particulier sur la base JMSCorrelationID. Je ne suis pas en mesure d'obtenir ce message particulier. Pouvez-vous proposer une solution?

public void getSpecificMessage(String queuename, Integer userid) { 

     try { 
      QueueConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
       ((ActiveMQConnectionFactory) connectionFactory).setUseAsyncSend(true); 
       QueueConnection connection = connectionFactory.createQueueConnection(); 
       connection.start(); 
       QueueSession session = connection.createQueueSession(false, 
        QueueSession.AUTO_ACKNOWLEDGE); 
       String id = String.valueOf(userid); 
      Queue queue = session.createQueue(queuename); 
      QueueReceiver receiver = session.createReceiver(queue, "JMSCorrelationID="+id); 
      Message message = receiver.receive();    
     } catch (JMSException e) {    
      e.printStackTrace(); 
     } 
     } 
+0

Je pense que vous avez fait une erreur lors de la publication de votre code ... Le premier bloc de code n'est pas correct. Vous pouvez cliquer sur le lien 'edit' sous votre question pour corriger cela dans votre question. –

Répondre

2

Votre premier problème est que vous essayez de penser au courtier de messages en tant que base de données, vous devez toujours vous rappeler ce morceau sage conseil, « Un courtier de messages n'est pas une base de données ». Il existe certaines limites quant à la profondeur d'un navigateur de client ou de file d'attente dans une destination avant que le courtier n'envoie plus de messages à partir du disque, vous devez donc vérifier votre profondeur et voir si son paramètre maxPageSize ajuster au besoin, mais rappelez-vous que les messages envoyés restent en mémoire jusqu'à leur consommation.

+0

Merci pour la suggestion @Tim Bish, à partir de maintenant ma file d'attente a 10 messages pour les tests et je dois obtenir un message spécifique.Je vais sûrement ajuster mon maxPageSize plus tard. Maintenant j'utilise, String id = String.valueOf (tid); .setStringProperty ("abc", id); (Producteur). en consommant, je rencontre un problème ici 'session.createConsumer (queue, "abc =" + id)'. Si je passe directement la valeur tid, en tant que session.createConsumer (queue, "abc = '11 '") je suis capable de consommer. Alors, comment devrais-je transmettre ma valeur d'identifiant? S'il vous plaît dites-moi le bon moyen de passer id. – msk

1

Juste envelopper l'identifiant entre guillemets simples

"JMSCorrelationID='"+id+"'" 

Cette fonctionnalité est recommandé de ne pas utiliser, il y a beaucoup plus de complications comme l'a expliqué Tim, mais si vous voulez obsolutely travailler avec elle faire le changement

0

Vous pouvez rechercher des messages à l'aide du MeessageID d'un message. Ce serait rapide car les fournisseurs de messagerie indexent les messages sur l'identifiant du message. Mais rappelez-vous que l'objectif premier de l'utilisation d'un fournisseur de messagerie est de connecter les applications de manière indépendante du temps. L'application réceptrice doit recevoir des messages dès que possible. Si les messages s'accumulent dans une file d'attente, cela indique un problème qui doit être résolu.

+0

dans mon cas, il existe différents utilisateurs qui envoient des messages à la file d'attente, donc je dois identifier à qui (l'utilisateur) l'ID de message appartient. Ensuite, je pense que je dois maintenir une paire de valeurs clés indiquant userid et messageid respectif et la recherche à partir de là. S'il vous plaît dites-moi, est-ce la bonne façon de faire? ou toute autre alternative pour obtenir un message spécifique et voir aussi mon commentaire à Tim Bish. – msk

+0

Vous n'êtes pas sûr de la logique de votre entreprise. Mais je ne crois pas que vous ayez besoin de chercher des messages. Je préférerais recevoir des messages sans n'importe quel sélecteur et puis appliquer la logique métier sur le message reçu. – Shashi