2009-10-06 6 views
4

Bonjour, est-ce que quelqu'un sait comment créer un programme d'écoute de messages à l'aide d'IBM MQ? Je sais comment le faire en utilisant les spécifications JMS mais je ne suis pas sûr de savoir comment le faire pour IBM MQ. Tous les liens ou les pointeurs sont grandement appréciés.Module d'écoute de messages IBM MQ

+0

Si vous savez comment faire pour JMS, pourquoi avez-vous besoin pour le rendre spécifique à MQ? – skaffman

+0

Hey pouvez-vous me dire comment se connecter à IBM MQ en utilisant JMS, comme je veux savoir comment spécifier le gestionnaire de files d'attente, le canal etc –

Répondre

4

Jetez un oeil à IBM Aide: Writing WebSphere MQ base Java applications

IBM a une API pour interagir avec les files d'attente. Voici leur exemple:

import com.ibm.mq.*;   // Include the WebSphere MQ classes for Java package 


public class MQSample 
{ 
    private String qManager = "your_Q_manager"; // define name of queue 
               // manager to connect to. 
    private MQQueueManager qMgr;     // define a queue manager 
               // object 
    public static void main(String args[]) { 
    new MQSample(); 
    } 

    public MQSample() { 
    try { 

     // Create a connection to the queue manager 

     qMgr = new MQQueueManager(qManager); 

     // Set up the options on the queue we wish to open... 
     // Note. All WebSphere MQ Options are prefixed with MQC in Java. 

     int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | 
         MQC.MQOO_OUTPUT ; 

     // Now specify the queue that we wish to open, 
     // and the open options... 

     MQQueue system_default_local_queue = 
       qMgr.accessQueue("SYSTEM.DEFAULT.LOCAL.QUEUE", 
           openOptions); 

     // Define a simple WebSphere MQ message, and write some text in UTF format.. 

     MQMessage hello_world = new MQMessage(); 
     hello_world.writeUTF("Hello World!"); 

     // specify the message options... 

     MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the // defaults, 
                  // same as MQPMO_DEFAULT 

     // put the message on the queue 

     system_default_local_queue.put(hello_world,pmo); 

     // get the message back again... 
     // First define a WebSphere MQ message buffer to receive the message into.. 

     MQMessage retrievedMessage = new MQMessage(); 
     retrievedMessage.messageId = hello_world.messageId; 

     // Set the get message options... 

     MQGetMessageOptions gmo = new MQGetMessageOptions(); // accept the defaults 
                  // same as MQGMO_DEFAULT 
     // get the message off the queue... 

     system_default_local_queue.get(retrievedMessage, gmo); 

     // And prove we have the message by displaying the UTF message text 

     String msgText = retrievedMessage.readUTF(); 
     System.out.println("The message is: " + msgText); 
     // Close the queue... 
     system_default_local_queue.close(); 
     // Disconnect from the queue manager 

     qMgr.disconnect(); 
    } 
     // If an error has occurred in the above, try to identify what went wrong 
     // Was it a WebSphere MQ error? 
    catch (MQException ex) 
    { 
     System.out.println("A WebSphere MQ error occurred : Completion code " + 
         ex.completionCode + " Reason code " + ex.reasonCode); 
    } 
     // Was it a Java buffer space error? 
    catch (java.io.IOException ex) 
    { 
     System.out.println("An error occurred whilst writing to the message buffer: " + ex); 
    } 
    } 
} // end of sample 

Je ne suis pas sûr si les fichiers IBM sont situés dans le référentiel Maven de base. Je sais que dans le passé, j'ai dû les extraire d'une installation locale d'IBM et les mettre dans un repo SVN local. J'utilise les pots suivants:

<dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mq</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mq.pcf</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mqbind</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mqjms</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
+0

Salut, merci pour la réponse. J'ai vérifié ces sites mais je n'ai toujours pas trouvé d'exemple qui utilise des écouteurs de message asynchrones. Des idées? Merci. – x1a0

+0

Nous créons un thread qui recherche des messages toutes les X secondes dans une file d'attente située dans un gestionnaire de files d'attente. En outre, vous voudrez peut-être modifier votre question initiale si c'est ce que vous cherchez vraiment. – Droo

2

Jetez un oeil à l'échantillon fourni ci-dessus.

Plus précisément aux lignes

MQGetMessageOptions gmo = new MQGetMessageOptions();  
system_default_local_queue.get(retrievedMessage, gmo); 

Vous pouvez configurer le faire attendre pendant un certain temps avant de lancer une exception MQRC_NO_MSG_AVAILABLE. Ou vous pouvez attendre pour toujours.

gmo.waitInterval= qTimeout; 
gmo.options = MQC.MQGMO_WAIT 

Vous pouvez donc créer un thread qui continue à rechercher de nouveaux messages, puis les transmet à un gestionnaire. L'obtention et la mise n'ont pas besoin d'être dans le même fil ou même application.

J'espère que cela aide à répondre à votre question.

6

Bien qu'il existe une API Java WMQ comme indiqué par les précédents répondeurs, WMQ prend également en charge JMS. Voici donc quelques ressources pour vous y lancer.

Jetez un oeil à cet article: IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0

En outre, si vous avez installé le client complet WMQ et non seulement pris les pots alors vous aurez beaucoup d'exemples de code installé. Par défaut, ils seront installés dans C: \ Program Files \ IBM \ WebSphere MQ \ tools \ jms ou/opt/mqm/samp en fonction de votre plate-forme.

Si vous avez besoin du support d'installation du client WMQ, procurez-vous le here. Notez qu'il s'agit du client WMQ v7 et non du client v6. Il est compatible avec la v6 QMgr mais puisque la version 6 est en fin de vie à partir de septembre 2011, vous devriez faire un nouveau développement sur le client v7 et, si possible, un v7 QMgr. Il y a beaucoup d'améliorations fonctionnelles et de performance disponibles si les deux parties sont v7. Vous pouvez obtenir le manuel du produit here si vous avez besoin. Enfin, assurez-vous d'avoir une exception JMS pour imprimer l'exception liée. Ce n'est pas une chose WMQ, c'est plutôt une chose JMS. Sun a fourni une structure de données à plusieurs niveaux pour les exceptions JMS et les parties vraiment intéressantes sont souvent au niveau imbriqué. Ce n'est pas un gros problème et peut être mis en œuvre en quelques lignes:

try { 
    . 
    . code that might throw a JMSException 
    . 
} catch (JMSException je) { 
    System.err.println("caught "+je); 
    Exception e = je.getLinkedException(); 
    if (e != null) { 
    System.err.println("linked exception: "+e); 
    } else { 
    System.err.println("No linked exception found."); 
    } 
} 

Cela permet de déterminer la différence entre une erreur JMS par rapport à une erreur de transport. Par exemple, une erreur de sécurité JMS peut être une WMQ 2035 ou une configuration JSSE, ou l'application peut ne pas avoir accès à quelque chose dans le système de fichiers. Un seul d'entre eux vaut la peine de passer beaucoup de temps à creuser à travers les journaux d'erreurs WMQ et seulement en imprimant l'exception liée, vous serez en mesure de dire si c'est celui-là.

2

Un point important en plus des réponses existantes: JMS fournit MessageListener, une classe qui vous permet de recevoir des messages en tant que rappels asynchrones.

L'API native a aucune fonctionnalité équivalente! Vous devez appeler à plusieurs reprises get(...) selon le cas.

2

dans la boucle avant d'obtenir le message que vous pouvez spécifier la manière suivante

gmo.options = MQC.MQGMO_WAIT 
gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

ce qui rend la boucle attendra jusqu'à ce qu'il ya un message dans la file d'attente. Pour moi, il est semblable à MessageListerner

2

Juste au cas où quelqu'un va google stackoverflow pour MQ Listener comme je l'ai fait ... Il est peut-être pas la réponse due à la réalisation JMS, mais ce que je cherchais. Quelque chose comme ceci: méthode

MQQueueConnectionFactory cf = new MQQueueConnectionFactory(); 
MQQueueConnection conn = (MQQueueConnection)cf.createQueueConnection(); 
MQQueueSession session = (MQQueueSession)conn.createSession(false, 1); 

Queue queue = session.createQueue("QUEUE"); 

MQQueueReceiver receiver = (MQQueueReceiver)session.createReceiver(queue); 

receiver.setMessageListener(new YourListener()); 

conn.start(); 

YourListener devrait mettre en œuvre l'interface MessageListener et vous vous recevez des messages en onMessage (message msg).

0

Bonjour, voici l'exemple de l'écouteur de message avec IBM MQ. Ici, je le printemps aussi pour créer des haricots etc ...

package queue.app; 

import javax.annotation.PostConstruct; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueReceiver; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

import com.ibm.mq.jms.MQQueue; 
import com.ibm.mq.jms.MQQueueConnectionFactory; 
import com.ibm.msg.client.wmq.WMQConstants; 


@Component 
public class QueueConsumer implements MessageListener{ 

    private Logger logger = Logger.getLogger(getClass()); 

    MQQueueConnectionFactory qcf = new MQQueueConnectionFactory(); 
    QueueConnection qc; 
    Queue queue; 
    QueueSession queueSession; 
    QueueReceiver qr; 

    @Value("${jms.hostName}") 
    String jmsHost; 
    @Value("${jms.port}") 
    String jmsPort; 
    @Value("${jms.queue.name}") 
    String QUEUE_NAME; 
    @Value("${jms.queueManager}") 
    String jmsQueueMgr; 
    @Value("${jms.username}") 
    String jmsUserName; 
    @Value("${jms.channel}") 
    String jmsChannel; 

    @PostConstruct 
    public void init() throws Exception{ 
     qcf.setHostName (jmsHost); 
     qcf.setPort (Integer.parseInt(jmsPort)); 
     qcf.setQueueManager (jmsQueueMgr); 
     qcf.setChannel (jmsChannel); 
     qcf.setTransportType (WMQConstants.WMQ_CM_CLIENT); 
     qc = qcf.createQueueConnection(); 

     queue = new MQQueue(QUEUE_NAME); 
     qc.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); 
     queueSession = qc.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); 
     qr = queueSession.createReceiver(queue); 
     qr.setMessageListener(this); 
     qc.start(); 

    } 


    @Override 
    public void onMessage(Message message) { 
     logger.info("Inside On Message..."); 
     long t1 = System.currentTimeMillis(); 
     logger.info("Message consumed at ...."+t1); 

     try{ 
      if(message instanceof TextMessage) { 
       logger.info("String message recieved >> "+((TextMessage) message).getText()); 
      } 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 
} 

Voici les dépendances que j'ai ..

<dependency> 
      <groupId>com.sun.messaging.mq</groupId> 
      <artifactId>fscontext</artifactId> 
      <version>4.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>jms</artifactId> 
      <version>1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jms</artifactId> 
      <version>3.2.17.RELEASE</version> 
     </dependency> 


     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq.allclient</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq.jmqi</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mqjms</artifactId> 
      <version>1.0</version> 
     </dependency> 
Questions connexes