jueves, 10 de mayo de 2012

MANEJO DE JMS.

En esta oportunidad mostrare el manejo de la API de JMS para el manejo de mensajería y colas.

El manejo de mensajería es utilizado normalmente por los sistemas de tipo Legacy , debido a la rapidez en la transmisión de datos, como por la facilidad de integración. El formato de los mensajes normalmente enviados (tramas) pueden ser de distintos tipos:

- TRAMAS LINEALES: 01cesar ricardoguerra arnaiz4181613329masculino 
- TRAMAS LINEALES (SEPARADOR): 01|cesar ricardo|guerra arnaiz|41816133|29|masculino|  
- TRAMAS XML:  [usuario] [codigo] 01 [/codigo] [nombres] cesar ricardo [/nombres] [apellidos] guerra arnaiz [/apellidos] [dni] 41816133 [/dni] [edad] 29 [/edad] [sexo] masculino [/sexo] [/usuario]

El ejemplo preparado mostrara una clase utilitaria que facilitara el ENVIO y CONSULTA a una cola JMS.

Para poder probar este ejemplo es necesario que se tenga configurado e iniciado el Servidor de Aplicaciones. Para ello es requerimiento primordial que se desarrolle primero este post: CONFIGURACION-JMS-EN-ORACLE-WEBLOGIC

La clase utilitaria JMS lista para utilizar es la siguiente: 
 
import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

/**
 * UtilJMS Util creado para el manejo de JMS. Enviar y Obtener mensajes de tipo:
 *         PUNTO a PUNTO.
 * @author CGUERRA
 */
 public class UtilJMS{

    private Context                      objContexto          = null;
    private QueueConnectionFactory objQueueFactory  = null;
    private QueueConnection     objQueueConexion        = null;
    private QueueSession           objQueueSesion   = null;
    private Queue                       objQueue               = null;
    private QueueSender            objQueueSender   = null;
    private QueueReceiver        objQueueReciver  = null;
    private TextMessage           objTextMensaje    = null;
    private Message                   objMensaje           = null;
  
    private String JNDI_QUEUE_FACTORY = null;   //IMPORTANTE 
    private String JDNI_QUEUE        = null;                //IMPORTANTE 
    private String MENSAJE_JMS    = null;   
  
    private static final String CONTEXTO = "weblogic.jndi.WLInitialContextFactory";     
    private static final String URL               = "t3://localhost:7001";
    private static final String USUARIO     = "javaman";
    private static final String PASSWORD = "12345678";
   
    //Constructores ...
    public UtilJMS( String JNDI_QUEUE_FACTORY, String JDNI_QUEUE ){
           this.JNDI_QUEUE_FACTORY = JNDI_QUEUE_FACTORY;
           this.JDNI_QUEUE         = JDNI_QUEUE;
    }
   
   /**
    * enviarMensajeJMS_punto_a_punto
    * @param mensajeParam
    */
    public void enviarMensajeJMS_punto_a_punto( String mensajeParam ){
      System.out.println( "******** DENTRO DE: [enviarMensajeJMS_punto_a_punto] ********" );
      
      this.MENSAJE_JMS = mensajeParam;
       
      try{
          if( (this.JNDI_QUEUE_FACTORY != null) &&
              (this.JDNI_QUEUE != null) ){

              //---------------- CONFIGURACION [INICIO] ----------------//     
              Hashtable objProperties = new Hashtable();
             
              objProperties.put( Context.INITIAL_CONTEXT_FACTORY, CONTEXTO );
              objProperties.put( Context.PROVIDER_URL,            URL      );
              objProperties.put( Context.SECURITY_PRINCIPAL,      USUARIO  );
              objProperties.put( Context.SECURITY_CREDENTIALS,    PASSWORD );
              //---------------- CONFIGURACION [FINAL] -----------------//
             
              this.objContexto      = new InitialContext( objProperties );
              this.objQueueFactory  = (QueueConnectionFactory)this.objContexto.lookup( this.JNDI_QUEUE_FACTORY );
              this.objQueueConexion = objQueueFactory.createQueueConnection();
              this.objQueueSesion   = this.objQueueConexion.createQueueSession( false, 0 );
              this.objQueue         = (Queue)this.objContexto.lookup( this.JDNI_QUEUE );
              this.objQueueSender   = this.objQueueSesion.createSender( this.objQueue );
             
              //SETEANDO MENSAJE:
              this.objTextMensaje   = this.objQueueSesion.createTextMessage();
              this.objTextMensaje.setText( mensajeParam );
              this.objTextMensaje.setStringProperty( "id_01", mensajeParam ) ;
             
              System.out.println( "- MENSAJE SETEADO: " + this.objTextMensaje.toString() );
              System.out.println( "- OBTENIENDO [TEXT MENSAJE]:   " + this.objTextMensaje.toString() );
             
//ENVIANDO MENSAJE:
              this.objQueueSender.send( this.objTextMensaje );
              System.out.println( "- MENSAJE ENVIADO ...!!!" );
             
//LIMPIANDO & CERRAR CONEXIONES:
              this.limpiarCerrarConexiones(); 
          }
      }
      catch( JMSException e ){
             e.printStackTrace();
      }
      catch( Exception e ){
             e.printStackTrace();
      }  
    }
   
   /**
    * obtenerMensajeJMS_punto_a_punto
    */
    public void obtenerMensajeJMS_punto_a_punto(){
        System.out.println( "******** DENTRO DE: [obtenerMensajeJMS_punto_a_punto] ********" );
      
        try{
            if( (this.JNDI_QUEUE_FACTORY != null) &&
                (this.JDNI_QUEUE != null) ){
               
                //---------------- CONFIGURACION [INICIO] ----------------//     
                Hashtable objProperties = new Hashtable();
               
                objProperties.put( Context.INITIAL_CONTEXT_FACTORY, CONTEXTO );
                objProperties.put( Context.PROVIDER_URL,            URL      );
                objProperties.put( Context.SECURITY_PRINCIPAL,      USUARIO  );
                objProperties.put( Context.SECURITY_CREDENTIALS,    PASSWORD );
                //---------------- CONFIGURACION [FINAL] -----------------//
               
                this.objContexto      = new InitialContext( objProperties );
                this.objQueueFactory  = (QueueConnectionFactory)this.objContexto.lookup( this.JNDI_QUEUE_FACTORY );
                this.objQueue         = (Queue)this.objContexto.lookup( this.JDNI_QUEUE );    
                this.objQueueConexion = this.objQueueFactory.createQueueConnection();
                this.objQueueSesion   = this.objQueueConexion.createQueueSession( false,objQueueSesion.AUTO_ACKNOWLEDGE );  
                this.objQueueReciver  = this.objQueueSesion.createReceiver( this.objQueue );
               
//INICIAR LA OBTENCION DE LOS DATOS DE LA [COLA JMS]:
                this.objQueueConexion.start();
               
                long tiempoEspera = 1000;  //[1 SEG = 1000 MILISEGUNDOS].
               
                for( ;true; ){
                    
//OBTENEMOS TODOS LOS TIPOS DE MENSAJES DE LA [COLA JMS]. 
                     this.objMensaje  = this.objQueueReciver.receive( tiempoEspera );
                   
                     if( this.objMensaje != null){
                         if( this.objMensaje instanceof TextMessage ){
                            
                             //OBTENER LOS MENSAJES DE TIPO TEXTO DE LA [COLA JMS]:
                             this.objTextMensaje = (TextMessage)this.objMensaje;
                             System.out.println( "MENSAJES ENCONTRADO EN [COLA JMS]: " + this.objTextMensaje .getText() );
                            
                             System.out.println( "getJMSCorrelationID: " + this.objMensaje.getJMSCorrelationID() );
                             System.out.println( "getJMSReplyTo:       " + this.objMensaje.getJMSReplyTo()    );
                             System.out.println( "getJMSMessageID:     " + this.objMensaje.getJMSMessageID()  );
                             System.out.println( "getJMSType:          " + this.objMensaje.getJMSType()       );
                            
                             this.objTextMensaje.acknowledge();
                         }
                     }
                     else{
                          System.out.println( "NO HAY MENSAJES EN LA [COLA JMS]" );
                          break;
                   }
                }
               
 //LIMPIAMOS Y CERRAMOS CONEXIONES:
                this.limpiarCerrarConexiones();
            } 
     }
     catch( JMSException e ){
            e.printStackTrace();
     }
     catch( Exception e ){
            e.printStackTrace();
     }          
   }
      
   /**
    * limpiarCerrarConexiones
    */
    public void limpiarCerrarConexiones(){
         
       try{
           if( this.objQueueSender != null ){
               this.objQueueSender.close();
           }
           if( this.objQueueReciver != null ){
               this.objQueueReciver.close();
           }
           if( this.objQueueSesion != null ){
               this.objQueueSesion.close();
           }
           if( this.objQueueConexion != null ){
               this.objQueueConexion.close();
           }
          
           this.objMensaje       = null;
           this.objTextMensaje   = null;            
           this.objQueueSender   = null;
           this.objQueueReciver  = null;
           this.objQueue         = null;
           this.objQueueSesion   = null;
           this.objQueueConexion = null;
           this.objQueueFactory  = null;
           this.objContexto      = null;
          
           System.out.println( "- LIMPIANDO CONFIGURACION ...!!!" );
       }
       catch( JMSException e ){
                  e.printStackTrace();
       }
       catch( Exception e ){
                  e.printStackTrace();
       }       
    }  
  }


Para poder probar este mensaje es necesario setear el USUARIO/PASSWORD del SERVIDOR de APLICACIONES en las variables: USUARIO, PASSWORD y configurar el CONTEXTO y URL. Luego de ellos vasta con hacer lo siguiente:

UtilJMS utilJMS = new UtilJMS( "jms/crgaQueueConexionFactory", "jms/crgaTestQueue" );  

//ENVIAR JMS:
utilJMS.enviarMensajeJMS_punto_a_punto( “TRAMA_CREADA” );

//OBTENER JMS:
utilJMS.obtenerMensajeJMS_punto_a_punto();

Es todo el resultado será mostrado en consola.

Saludos.


No hay comentarios: