2012-06-29 2 views
0

J'ai la classe MQConsumerClass qui récupère les messages de la file d'attente comme suit.WebSphere MQ MessageListener (Similaire à JMS Message Listener)

while (running) 
{ 
    try 
    { 
     MQMessage rcvMessage = new MQMessage(); 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 

     gmo.options = MQConstants.MQGMO_WAIT; 
     gmo.waitInterval = 60000; 
     queue.get(rcvMessage, gmo); 

     if(rcvMessage.getTotalMessageLength() > 0) 
     { 
      String msgText = rcvMessage.readUTF(); 
     } 
    } 
    catch blocks{} 
} 

Mais le problème est lorsqu'il n'y a aucun message dans la file d'attente, l'exception 2033 est levée.

Je pense que 2033 NO_MSG_AVAILABLE exception n'est PAS une exception sérieuse qui peut probablement arrêter l'opération.

Toutefois, je souhaite appeler la fonction onMessage(Message msg) chaque fois qu'un nouveau message est dans la file d'attente.

Je veux créer cette classe avec MessageListener, mais je ne trouve pas MessageListener ni aucun exemple associé. Donc, s'il vous plaît dites-moi s'il y a une fonction MessageListener dans l'API Java WMQ.

ou

un moyen de le faire?

Répondre

1

Eh bien, l'API Java WMQ n'a pas d'écouteur de message. Similaire à onMessage de JMS n'est pas là, seulement synchrone recevoir.

+0

Alors, voulez-vous dire qu'il n'y a pas d'autre choix que while? Pour diminuer le nombre de boucles while, j'ai utilisé MQConstants.MQGMO_WAIT; et définissez waitInterval sur une demi-minute (60 000). Mais, "MQJE001: Code d'achèvement" 2 ", Raison" 2033 "." est affiché si la file d'attente n'a aucun message jusqu'à ce que waitInterval soit terminé.Alors, comment puis-je éviter cette exception? J'ai édité mes nouveaux codes. Je vous remercie beaucoup pour votre aide. –

1

Vous ne pouvez pas complètement éviter ces 2033 "aucun message" des exceptions dans ce genre de boucle. En augmentant l'intervalle d'attente, il y a peu de désavantages (autres que l'application peut-être plus lente lorsque vous avez terminé) et vous réduirez les chances de ne pas avoir de message pour chaque appel. Par exemple, si vous spécifiez un intervalle d'attente de 5 minutes, tant qu'au moins un message arrive dans la file toutes les 5 minutes, chaque appel get recevra un message (en général). Mais vous avez toujours besoin d'un bloc catch pour ce genre d'exception, car vous devriez vous attendre parfois à ne pas trouver un message dans votre intervalle d'attente. Tant que votre intervalle d'attente n'est pas trop court, la surcharge de performance de ce get, catch block et respin autour de la boucle, devrait être relativement faible. Si vous voulez vraiment utiliser un client asynchrone où votre application sera appelée lorsqu'un message devient disponible, les classes WebSphere MQ pour JMS sont l'API Java dans laquelle vous trouverez une interface MessageListener. WebSphere MQ expose 2 API différentes pour Java. Votre fragment de code utilise des classes WebSphere MQ pour Java plutôt que JMS.

5

L'erreur '2033' n'est vraiment pas une erreur, c'est plutôt un état de retour MQSeries: MQRC_NO_MSG_AVAILABLE 2033 Le programme MQTester interroge une file d'attente à la recherche d'un message, mais aucun message n'est disponible.

Vous pouvez exclure avec

MQException.logExclude (nouveau entier (MQException.MQRC_NO_MSG_AVAILABLE));

1

Vous pouvez utiliser MQConstants.MQWI_UNLIMITED pour spécifier Ulimited attendre l'intervalle.

while (running) { 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 
     gmo.options = MQConstants.MQGMO_WAIT; 
     gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

    try { 
     // Get the message off the queue. 
     queue.get(rcvMessage, gmo); 
    } catch (MQException e) { 
    if (e.reasonCode == 2033) { 
     continue; 
    } 

} 

}

Questions connexes