|
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?
|