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

Thu, Nov 19 Sat, Oct 3 Fri, Sep 25 Mon, Aug 3 Mon, Apr 27 Sat, Mar 28 Mon, Jan 19 Tue, Jan 6

Home| New Wiki