miércoles, 5 de mayo de 2010

MANEJO 'IBM WebSphere MQ' EN JAVA

Que tal compañeros el dia de hoy hablaré sobre un tema relacionado a la integración de aplicaciones empresariales. WebSphere MQ (anteriormente MQSeries) que es un modo de transmisión de data via colas MQ, para la integración de aplicaciones empresariales. El envio de datos a traves de MQ muy popular ya que es más rápido que si se trabajara vía el protocolo SOAP o via ficheros.

I.- Características de WebSphere MQ:

* Admite cualquier tipo de conectividad heterogénea, desde equipos de escritorio hasta macrocomputadoras (admite una gran variedad de plataformas distintas).
* Dispone de una extensa familia de interfaces de programación de aplicaciones (API) diseñados con el objeto de facilitar la creación de código para tareas de mensajería.
* Garantiza la entrega sin duplicaciones de los mensajes importantes.
* Permite un mapeo de objetos via ficheros .cpy, xsd y direntes transformaciones de mensajes (Formatos).
* Proporciona conectividad de aplicaciones. Puede utilizarse de forma autónoma o con otros miembros de la familia para ofrecer una solución de integraciones de negocio global.

II.- Sistemas Operativos y Plataformas de Hardware Apropiadas.

* AIX
* HP OpenVMS (Alpha)
* HP-UX
* iSeries i5/OS V5R3
* iSeries OS/400 V5R2
* Linux
* Linux for iSeries
* Linux for pSeries POWER
* Sun Solaris
* Windows 2000
* Windows NT
* Windows XP

III.- Ejemplo Aplicativo:

Ahora si mostraré una forma de trabajar con de WebSphere MQ en JAVA. Para ello se tiene que tener en cuenta y configurar previamente Las colas MQ que serviran para la transmisión. Estos son los datos que se tendra que configura antes que nada:

- QManager
- colaIN
- colaOUT
- canal
- servidor
- puerto
- id
- password
- messageId

Luego ya configurado y definido se registrará en un archivo .properties que será nuestro archivo de configuración del ejemplo a mostrar.

#####################################################################
################ PROPIEDADES DE PARA ACCESO DE DATOS ################
#####################################################################

#### EL DELIMITADOR DE ACCESO PUEDE SER CON LA SIMBOLOGIA => ':', '=', 'BLANCO' ####

##--------- CONFIGURACION: 'LOCAL MESSAGE BROKER' ---------##
propiedad.MQ.QManager = WBRK61_DEFAULT_QUEUE_MANAGER
propiedad.MQ.colaIN = MQ.A
propiedad.MQ.colaOUT = MQ.B
propiedad.MQ.canal = SYSTEM.BKR.CONFIG
propiedad.MQ.servidor = localhost
propiedad.MQ.puerto = 2414
propiedad.MQ.id = MQSIUSER
propiedad.MQ.password = MQSIPASS
propiedad.MQ.messageId = JAVAMAN00000000000000000


Se debe analizar como se van a manejar las colas MQ, ya que si son utilizados un solo 2 aplicaciones (La aplicación que hace PUT y la que hace GET a la trama) y si van a haber muchas aplicaciones que dejen en una misma cola diferentes Tramas MQ. Para el primer caso bastaría con el manejo de la ultima trama que se deja en cola ya que un aplicatibo lo dejara y otro lo leera en ese mismo instante, pero si se está en un escenario como el 2do se necesita el manejo de messageId y correlationId para poder manejar la identificación y deferenciación de cada Trama qye se deposita en una misma cola MQ.

Los ejemplos preparados soportan todo esto anteriormente mencionado.

Clase 'PruebaEnviarMQ':

package org.java.mq;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaEnviaMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaEnviarMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private static String TRAMA_INPUT = "MENSAJE GUARDADO DE FORMA DIRECTA VIA APLICATIVO JAVA - MQ ...!!!...ENVIO: OPCION CLASE JAVA.";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaEnviarMQ(){
}

public PruebaEnviarMQ( String tramaParam ){
super();
TRAMA_INPUT = tramaParam;
}

public PruebaEnviarMQ( String nombreQManager, String colaInParam, String colaOutParam,
String canalParam, String servidorParam, String puertoParam,
String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaEnviarMQ conexionMQ = new PruebaEnviarMQ();
conexionMQ.enviarMensajeMQ();
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setMensajeTramaMQ( TRAMA_INPUT );
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
this.objetoMQ.setCorrelationIdMQ( this.objetoMQ.getTiempoInicioMQ() + new java.util.Date().getTime() );
this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

//Imprimiendo Datos MQ.
this.imprimeDatosMQ();

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam(); //Normalmente el mismo 'ID' del dominio.
MQEnvironment.password = this.objetoMQ.getPasswordParam(); //Normalmente el mismo 'PASSWORD' del dominio.

MQEnvironment.disableTracing();
}

/**
* enviarMensajeMQ
*/
public void enviarMensajeMQ(){

try{
this.cargarConfiguracionMQ();

System.out.println( "TRAMA ENVIADA [PUT]: " + this.objetoMQ.getMensajeTramaMQ() );

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

//Configurar las opciones en la cola que se va a abrir...
//Todas las opciones de WebSphere MQ tienen el prefijo MQC en Java.
int opcionesInputMQ = MQC.MQOO_OUTPUT; //MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

//--------- Especificar las opciones de mensaje para ESCRIBIR (PUT). ---------------------------------------//
MQQueue objColaOUT = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesInputMQ, null, null, null );
MQPutMessageOptions opcionesPUT = new MQPutMessageOptions();
MQMessage mensajeOUT = new MQMessage(); //Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...

mensajeOUT.writeUTF( this.objetoMQ.getMensajeTramaMQ() );

mensajeOUT.messageId = mensajeOUT.messageId; //this.messageIdParam;
//mensajeOUT.correlationId = mensajeOUT.correlationId; //this.correlationIdMQ.getBytes();
mensajeOUT.format = MQC.MQFMT_STRING; //Formato que consiste en Solo Caracteres enviados.

//Escribe el mensaje en la cola MQ.
objColaOUT.put( mensajeOUT, opcionesPUT );

//Cerrando Colas MQ.
objColaOUT.close();

//Desconectar del gestor de colas
this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
finally{
}
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}

/**
* imprimeDatosMQ
*/
public void imprimeDatosMQ(){
System.out.println( "" );
System.out.println( "*************** PARAMETROS DE CONFIGURACION ***************" );
System.out.println( "- QMANAGER: " + this.objetoMQ.getNombreQManager() );
System.out.println( "- COLA IN: " + this.objetoMQ.getColaInParam() );
System.out.println( "- COLA OUT: " + this.objetoMQ.getColaOutParam() );
System.out.println( "- CANAL: " + this.objetoMQ.getCanalParam() );
System.out.println( "- SERVIDOR: " + this.objetoMQ.getServidorParam() );
System.out.println( "- PUERTO: " + this.objetoMQ.getPuertoParam() );
System.out.println( "- ID: " + this.objetoMQ.getIdParam() );
System.out.println( "- PASSWORD: " + this.objetoMQ.getPasswordParam() );
System.out.println( "- MESSAGE ID: " + this.objetoMQ.getMessageIdParam() );
System.out.println( "- CORRELATION ID: " + this.objetoMQ.getCorrelationIdMQ() );
System.out.println( "***********************************************************" );
System.out.println( "" );
}
}

Clase 'PruebaObtieneMQ':

package org.java.mq;

import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaObtieneMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaObtenerMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaObtenerMQ(){
}

public PruebaObtenerMQ( String nombreQManager, String colaInParam, String colaOutParam,
String canalParam, String servidorParam, String puertoParam,
String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaObtenerMQ conexionMQ = new PruebaObtenerMQ();
conexionMQ.obtenerMensajeMQ();
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
//this.objetoMQ.setCorrelationIdMQ( this.tiempoInicioMQ + new java.util.Date().getTime() );
this.objetoMQ.setCorrelationIdMQ( "COSAPISOFT" ); //HardCode.

this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam(); //Normalmente el mismo 'ID' del dominio.
MQEnvironment.password = this.objetoMQ.getPasswordParam(); //Normalmente el mismo 'PASSWORD' del dominio.

MQEnvironment.disableTracing();
}

/**
* obtenerMensajeMQ
*/
public void obtenerMensajeMQ(){
try{
this.cargarConfiguracionMQ();

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

int opcionesOutputMQ = MQC.MQOO_INPUT_SHARED;

//--------- Especificar las opciones de mensaje para OBTENER (GET). ---------------------------------------//
//MQQueue objColaIN = this.objetoMQ.accessQueue( this.colaOutParam, opcionesOutputMQ, null, null, null );
MQQueue objColaIN = this.objQueueManager.accessQueue( "MQ.A", opcionesOutputMQ, null, null, null );
//MQQueue objColaIN = this.objetoMQ.accessQueue( "MQ.A", MQC.MQOO_INPUT_AS_Q_DEF );

MQGetMessageOptions opcionesGET = new MQGetMessageOptions();
MQMessage mensajeIN = new MQMessage();

opcionesGET.options = MQC.MQGMO_WAIT;

mensajeIN.messageId = mensajeIN.messageId;
//mensajeIN.correlationId = this.correlationIdMQ.getBytes(); //mensajeInput.correlationId;

if( mensajeIN.correlationId != null ){
System.out.println( "CORRELATION ID DEL MENSAJE 'IN': " + mensajeIN.correlationId );
}

//Obteniendo el mensaje de la COLA MQ.
objColaIN.get( mensajeIN, opcionesGET );

String mensajeObtenido = mensajeIN.readString( mensajeIN.getTotalMessageLength() );
System.out.println( "TRAMA OBTENDIDA [GET]: " + mensajeObtenido );

String tamanoMensajeObtenido = String.valueOf( mensajeIN.getTotalMessageLength() );
System.out.println( "TAMAÑO 'TRAMA OBTENDIDA': [" + tamanoMensajeObtenido + "]" );

//Cerrando Colas MQ.
objColaIN.close();

this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
finally{
}
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}
}

Clase 'PruebaEnviaObtieneMQ':

package org.java.mq;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaEnviaObtieneMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaEnviarObtenerMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private static String TRAMA_INPUT = "MENSAJE GUARDADO DE FORMA DIRECTA VIA APLICATIVO JAVA - MQ ...!!!...ENVIO DE TRAMA DESDE LANZADOR EN JAVA.";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaEnviarObtenerMQ(){
}

public PruebaEnviarObtenerMQ( String tramaParam ){
super();
TRAMA_INPUT = tramaParam;
}

public PruebaEnviarObtenerMQ( String nombreQManager, String colaInParam, String colaOutParam, String canalParam,
String servidorParam, String puertoParam, String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaEnviarObtenerMQ conexionMQ = new PruebaEnviarObtenerMQ();
conexionMQ.enviarObtenerMQ();
}

/**
* enviarObtenerMQ
*/
public void enviarObtenerMQ(){

try{
this.cargarConfiguracionMQ();

System.out.println( "TRAMA ENVIADA [PUT]: " + this.objetoMQ.getMensajeTramaMQ() );

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam();
MQEnvironment.password = this.objetoMQ.getPasswordParam();

//MQEnvironment.enableTracing( 2 );
MQEnvironment.disableTracing();

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

//Configurar las opciones en la cola que se va a abrir...
//Todas las opciones de WebSphere MQ tienen el prefijo MQC en Java.
int opcionesInputMQ = MQC.MQOO_OUTPUT;
int opcionesOutputMQ = MQC.MQOO_INPUT_SHARED;

//--------- Especificar las opciones de mensaje para ESCRIBIR (PUT). ---------------------------------------//
MQQueue objColaOUT = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesInputMQ, null, null, null );
MQPutMessageOptions opcionesPUT = new MQPutMessageOptions();
MQMessage mensajeOUT = new MQMessage(); //Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...

mensajeOUT.messageId = this.objetoMQ.getMessageIdParam();
mensajeOUT.correlationId = this.objetoMQ.getCorrelationIdMQ().getBytes();
mensajeOUT.format = MQC.MQFMT_STRING; //Formato que consiste en Solo Caracteres enviados.

//Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...
mensajeOUT.writeUTF( this.objetoMQ.getMensajeTramaMQ() );

//Escribe el mensaje en la cola MQ.
objColaOUT.put( mensajeOUT, opcionesPUT );

//Cerrando Colas MQ.
objColaOUT.close();

//--------- Especificar las opciones de mensaje para OBTENER (GET). ---------------------------------------//
MQQueue objColaIN = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesOutputMQ, null, null, null );
MQGetMessageOptions opcionesGET = new MQGetMessageOptions();
MQMessage mensajeIN = new MQMessage();

opcionesGET.options = MQC.MQGMO_WAIT;
mensajeIN.messageId = mensajeOUT.messageId;
mensajeIN.correlationId = mensajeOUT.correlationId;

if( mensajeIN.correlationId != null ){
System.out.println( "CORRELATION ID DEL MENSAJE 'IN': " + mensajeIN.correlationId );
}

//Obteniendo el mensaje de la COLA MQ.
objColaIN.get( mensajeIN, opcionesGET );

System.out.println( "" );

String mensajeObtenido = mensajeIN.readString( mensajeIN.getTotalMessageLength() );
System.out.println( "TRAMA OBTENDIDA [GET]: " + mensajeObtenido );

String tamanoMensajeObtenido = String.valueOf( mensajeIN.getTotalMessageLength() );
System.out.println( "TAMAÑO 'TRAMA OBTENDIDA': [" + tamanoMensajeObtenido + "]" );

//Cerrando Colas MQ.
objColaOUT.close();

//Desconectar del gestor de colas
this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setMensajeTramaMQ( TRAMA_INPUT );
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
this.objetoMQ.setCorrelationIdMQ( this.objetoMQ.getTiempoInicioMQ() + new java.util.Date().getTime() );
this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

//Imprimiendo Datos MQ.
this.imprimeDatosMQ();

MQEnvironment.disableTracing();
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}

/**
* imprimeDatosMQ
*/
public void imprimeDatosMQ(){
System.out.println( "" );
System.out.println( "*************** PARAMETROS DE CONFIGURACION ***************" );
System.out.println( "- QMANAGER: " + this.objetoMQ.getNombreQManager() );
System.out.println( "- COLA IN: " + this.objetoMQ.getColaInParam() );
System.out.println( "- COLA OUT: " + this.objetoMQ.getColaOutParam() );
System.out.println( "- CANAL: " + this.objetoMQ.getCanalParam() );
System.out.println( "- SERVIDOR: " + this.objetoMQ.getServidorParam() );
System.out.println( "- PUERTO: " + this.objetoMQ.getPuertoParam() );
System.out.println( "- ID: " + this.objetoMQ.getIdParam() );
System.out.println( "- PASSWORD: " + this.objetoMQ.getPasswordParam() );
System.out.println( "- MESSAGE ID: " + this.objetoMQ.getMessageIdParam() );
System.out.println( "- CORRELATION ID: " + this.objetoMQ.getCorrelationIdMQ() );
System.out.println( "***********************************************************" );
System.out.println( "" );
}
}




Para mayor detalle descargar el ejemplo completo de: AQUÌ.

16 comentarios:

David Corvalán dijo...

Disculpa. Me puedes indicar como configurar el WebSphere MQ? Tengo 0 experiencia en JMS y MQ y necesito comunicarme desde JAVA a una cola MQ de WAS. Desde ya muchas gracias

JAVAMAN dijo...

Bueno los datos de la configuracion luego de la instalacion estan en el MQ Manager y los demas datos los saque del Message Broker que de alguna manera los muestra. El demo expuesto muestra la forma de como dejar y recuper un mensaje a una cola MQ desde JAVA. Suerte

JLHV dijo...

Hola JAVAMAN.
No se si tienes algun ejemplo del manejo del WebSphere MQ, transmitiendo archivos XML.
Muchas gracias.

ToNny J@ck dijo...

Hola, no puedo descargar el archivo desde RapidShare, podrias subirlo a otro site?

Desde ya, gracias.

JAVAMAN dijo...

Sorry doc por la demora.. Ya actualice el LINK..

Saludos.

JAVAMAN dijo...

1. Tienes que descargar el DUMMY, este ya viene con las librerias necesarias.
2. Instalarte el WebPhere MQ Manager.
3. Aqui creamos las colas MQ necesarias y mencionadas en el archivo de configuracion .properties.
4. Configurar en archivo .properties en base a los nombres definidos al momento de crear el MQ Manager.
5. Ejecutar la clase de prueba.

Es todo. Saludos.

Anónimo dijo...

Hola, ya tengo mi cliente java funcionando enviando y recibiendo mensajes , pero en una maquina donde el Was y el server estan juntos...

El problema es ahora que el Was y el server estan en maquinas diferentes aahi error de conexion como soluciono esto ....

Es una Aplicacion de Voice Portal

JAVAMAN dijo...

Tengo dudas de lo me mencionas, dices que tienes el WAS y el SERVER en diferentes maquinas. Pero en si el WAS es el SERVIDOR DE APLICACIONES osea el SERVER. Especificamen bien eso.

Ojo que en las PROPIEDADES del archivo de configuracion.properties, esta con localhost y si quieres manejar por separado necesitarian que cada uno apunte a archivos de configuracion diferentes.

Considera el manejo de MDB para activar los listeners del App que estara a la escucha del lanzamiento de tu trama.

Anónimo dijo...


Hola JAVAMAN bueno te explico mi problema : tengo 2 colas de entrada (LQ_REQUEST y LQ_RESPONSE), ademas tengo un cliente MQ que envia una consulta a la cola LQ_REQUEST y recoje el resultado de la cola LQ_RESPONSE. Todo funciona ok(cuando un mismo cliente envia la peticion) , pero el tema esta en la correlacion de los mensajes de la cola de entrada con la de salida no se enlazan(cuando son varios clientes,ojo que he probado con el correlacionid y messageid).Uso un flujo en Message Broker 6.1 y WebSphere MQ 6 , no se si deba configurar algo mas.
Espero tus comentarios

Anónimo dijo...

Hola JAVAMAN bueno te explico mi problema : tengo 2 colas de entrada (LQ_REQUEST y LQ_RESPONSE), ademas tengo un cliente MQ que envia una consulta a la cola LQ_REQUEST y recoje el resultado de la cola LQ_RESPONSE. Todo funciona ok(cuando un mismo cliente envia la peticion) , pero el tema esta en la correlacion de los mensajes de la cola de entrada con la de salida no se enlazan(cuando son varios clientes,ojo que he probado con el correlacionid y messageid).Uso un flujo en Message Broker 6.1 y WebSphere MQ 6 , no se si deba configurar algo mas.
Espero tus comentarios

JAVAMAN dijo...

Un correlationId se utiliza para correlacionar los mensajes de respuesta con los mensajes de solicitud cuando una aplicación invoca una operación de petición-respuesta. Con WebSphere MQ y WebSphere MQ JMS, se puede correlacionar con un correlationId o un messageoId. En la mayoría de los casos, el solicitante permite que el gestor de colas seleccione un messageoId y espera que la aplicación para copiar este messageoId en el ID de correlación del mensaje de respuesta. Pero hay otras posibilidades. Un solicitante puede especificar un valor específico en el correlationId y esperar que este valor se copia en el correlationId de respuesta. El solicitante también puede exigir que el mensageId de solicitud se copiarán en el mensageId del mensaje de respuesta.

JAVAMAN dijo...

Pregunta tengo duda de como haces para obtener el mensaje de la cola ?... Mediante las librerías JAVA para MQ lo puedes hacer pero lo amarrarias a un CRON que mande ejecutar cada 3 segundos. Otra solución es utilizar un EJB3 (MDB) que esté a la espera de la inserción en dicha cola. La validación por messageId o correlationId es internamente osea una vez que ya el mensaje es capturado.

Anónimo dijo...

Hola JAVAMAN , estoy empezando y quisiera probar tu aplicacion he instalado el Websphere MQ me podrias indicar un manual o pagina web como configurar el MQ , crear las colas , emisores , etc para probarla ??? supongo que lo del password y usuario tambien son del MQ , o si me podrias hacer el favor de indicarme donde puedo llevar un curso en lima de MQ y message broker con sus respectivos aplicativos java . de antemano te agradezco tu ayuda.

Unknown dijo...

Hola JavaMan muchas gacias por lo compartido, alguna de las clases me podra servir para saber si una WebSphere MQ Connection esta activa

Saludos!!

Unknown dijo...

oe CESARIO, haste unos tutoriales de ESB sobre IBM, especificamente, message broker y de OSB tbn... xD

Juan Martin Navas dijo...

1. Utilice el método getMessageLength() en lugar de getTotalMessageLength(). El método getMessageLength() devuelve la cantidad de bytes de datos del mensaje en ese mensaje en particular.
2. Dado que el método message.readString() está en desuso en la versión 7, se debe usar el método readStringOfBytesLength() en su lugar.

message.readStringOfByteLength(message.getMessageLength()) ;