Home| New Wiki | | Login | User registry | Home Tree PDF
MQSeries en modo directo
Owner:, Version: 11, Date:Mon 24, March 2008,

Bueno, existen varias formas de usar MQSeries para mensajeria

  • Uso directo (API de MQ)
  • Uso a traves de JMS (API Abierta)
  • Uso solo como procesador de mensajes a traves de MDB

Como esta indicacion se debe a que voy a borrar algo de codigo de mi computador, será mas simple que lo normal y solo tratará del uso de MQ en forma directa (1).

Sobre MQ

  • MQ actua como un canal de comunicaciones seguro entre aplicaciones.
  • Normalmente los mensajes son entidades pequeñas (pocos kb) pero podrían ser hasta GB.
  • Ultimamente se asocia mucho MQ con XML, para transferir peticiones de acciones.
  • En MQ existe Colas (queues) administradas por un QueueManager y que pertenecen a un channel.
  • MQ series es un servidor (similar a una base de base de datos) qyue garantiza que los mensajes recibidos no se perderan.
  • En MQ puede habilitarse seguridad para que solo clientes conocidos puedan colocar o sacar mensajes.
  • Los mensajes pueden ser texto, pero hay que tener cuidado con el encoding (set de caracteres del mensaje).

Enviar mensajes

Listado 1: MQSender.java

import java.io.*;
import java.util.*;
import com.ibm.mq.*;
public class MQSender {
   public static void main(String args[]) {
       try {
           String host = "192.168.100.1";
           String channel="channel.server";
           String qmName = "QM.server";
           String qName = "default";
           MQSender mqSender = new MQSender(host,channel,qmName, qName);
           mqSender.send("Test message at "+ new java.util.Date());
           System.out.println("Terminado!");
       } catch (MQException ex) {
           MQSender.printEx(ex);
       } catch (java.io.IOException ex) {
           System.out.println(
             "An error occurred reading from message buffer: " + ex);
       }
   }

   Hashtable ht = null;
   MQQueueManager qMgr=null;
   MQQueue q=null;

   public MQSender(String host, String channel, String qmName, String qName) 
     throws MQException{
       ht = new Hashtable();
       ht.put(MQC.HOST_NAME_PROPERTY,host);
       ht.put(MQC.CHANNEL_PROPERTY,channel);
       qMgr = new MQQueueManager(qmName,ht);
       int openOptions = MQC.MQOO_OUTPUT;
       q = qMgr.accessQueue(qName, openOptions, null, null, null);
   }

   public void send(String text) 
     throws IOException, MQException{
       MQMessage mBuf = new MQMessage();
       MQPutMessageOptions pmo = new MQPutMessageOptions(); 
       pmo.options = MQC.MQPMO_NONE; 
       mBuf.clearMessage(); 
       mBuf.correlationId = MQC.MQCI_NONE; 
       mBuf.messageId = MQC.MQMI_NONE; 
       mBuf.writeUTF(text); 
       q.put(mBuf, pmo); 
   }

   public void close() throws MQException {
       q.close();
       qMgr.disconnect();
   }

   public static void printEx(MQException ex){
       System.err.println("MQ exception occurred : Completion code "
       + ex.completionCode + " Reason code " + ex.reasonCode);
   }
}

Recibir Mensajes

Listado 2: MQReceiver.java

import java.io.*;
import java.util.*;
import com.ibm.mq.*;
public class MQReceiver {
   public static void main(String args[]) 
     throws IOException, MQException {
       String host = "192.168.100.1";
       String channel="channel.server";
       String qmName = "QM.server";
       String qName = "default";
       MQReceiver mqReceiver= new MQReceiver(host,channel,qmName, qName);
       String m=mqReceiver.recv();
       System.out.println("MSG:"+m);
       System.out.println("Terminado!");
   }

   // DATOS PRIVADOS
   Hashtable ht = null;
   MQQueueManager qMgr=null;
   MQQueue q=null;

   /**
   * Constructor
   * @param host ip del servidor
   * @param channel nombre del channel
   * @param qmName nombre del queue manager
   * @param qName nombre de la cola
   * @throws MQException si ocurre un error
   */
   public MQReceiver(String host, String channel, String qmName, String qName) 
     throws MQException{
       ht = new Hashtable();
       ht.put(MQC.HOST_NAME_PROPERTY,host);
       ht.put(MQC.CHANNEL_PROPERTY,channel);
       qMgr = new MQQueueManager(qmName,ht);
       int openOptions = MQC.MQOO_INPUT_EXCLUSIVE;
       q = qMgr.accessQueue(qName, openOptions, null, null, null);
   }

   public String recv() throws IOException, MQException{
       MQMessage msg = new MQMessage();
       MQGetMessageOptions pmo = new MQGetMessageOptions(); 
       pmo.options = MQC.MQGMO_NONE; 
       pmo.waitInterval=5000;
       msg.messageId=MQC.MQMI_NONE;
       msg.correlationId=MQC.MQCI_NONE;
       q.get(msg, pmo); 
       return msg.readUTF();
   }

   public void close() throws MQException {
       q.close();
       qMgr.disconnect();
   }

   public static void printEx(MQException ex){
       System.err.println("MQ exception occurred : Completion code "
         + ex.completionCode + " Reason code " + ex.reasonCode);
   }
}

Notas

  • Los métodos main(String args) son test que envían y reciben mensajes.
  • El metodo readUTF() lee un mensaje en formato UTF (juego de juego de caracteres UTF-8 o UTF-16) que es un estandar bastante global y el que utiliza java. Esta funcion solo será exitosa si el mensaje fue escrito con la funcion writeUTF() al enviarlo.
  • El recibidor espera hasta 5000 milisegundos por un mensaje, si no llega, la ejecucion se termina.
  • Para que este codigo funcione en un cliente se requieren dos jars: com.ibm.mq.jar y connector.jar

Preguntas

  • Qué es un EJB MDB?
  • Donde se pueden entregar parametros de usuario y password para la conexion a MQ?


Edit - History - Extract PDF - Extract Tree as PDF

Last Modified

Sun, May 18 Mon, May 12 Mon, Apr 28 Sun, Apr 13 Mon, Mar 24 Sat, Feb 23 Tue, Feb 19 Sat, Feb 16 Wed, Feb 13

Home| New Wiki