Mostrando entradas con la etiqueta JMS. Mostrar todas las entradas
Mostrando entradas con la etiqueta JMS. Mostrar todas las entradas

martes, 21 de agosto de 2012

MAPPING 'JMS' & 'MDP' CON 'SPRING3'


En esta oportunidad mostraré como realizar un Mapping mediante SPRING, para el manejo de lanzamiento de mensajes 'JMS' y para su respectiva recepción de dichos mensajes 'JMS' mediante 'MDP' (Message Driven Pojos).

El mapping mostrado a continuación hace referencia al manejo de dos colas JMS para ello es requerido crea lo siguiente:
  • 1  JNDI TEMPLATE
  • 2 JNDI FACTORY
  • 1 JDNI DESTINATION RESOLVER
  • 2 JDNI DESTINATION (por cada cola)
  • 2 JMS TEMPLATE
Y para la recepción del mensaje JMS se deberá crear:
  • 2 JMS MDP
  • 2 JMS LISTENER
(Para fines del ejemplo, se ha cambiado LLAVES por CORCHETES):

[?xml version="1.0" encoding="UTF-8" ?]
[beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
      http://www.springframework.org/schema/jee
      http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util-3.0.xsd" ]
        
    [!-- ************** [JNDI TEMPLATE] ************** --]            
    [bean id="idTemplateJDNI" 
          class="org.springframework.jndi.JndiTemplate" ]
     [property name="environment" ] 
         [props]
             [prop key="java.naming.factory.initial" ]weblogic.jndi.WLInitialContextFactory[/prop]
             [prop key="java.naming.provider.url" ]t3://localhost:7001[/prop]
         [/props]
     [/property]
    [/bean]    
    
    [!-- **************** [JNDI FACTORY] *************** --]     
    [bean id="idConnectionFactoryJDNI" 
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiTemplate"        ref="idTemplateJDNI" /]
          [property name="lookupOnStartup" value="false" /]
  [property name="cache"                 value="true" /]
          [property name="jndiName"            value="dummy.javaman.jms.factory" /]
          [property name="proxyInterface"     value="javax.jms.ConnectionFactory" /]
    [/bean]
        
    [!-- ********* [JDNI DESTINATION RESOLVER] ********* --]  
    [bean id="idDestinationResolverJNDI"
          class="org.springframework.jms.support.destination.JndiDestinationResolver" ]
          [property name="jndiTemplate" ref="idTemplateJDNI" /]
          [property name="cache"           value="true" /]
    [/bean]    
    
    [!-- ************* [JDNI DESTINATION] ************** --]      
    [bean id="idDestination_01"
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiName" value="jms.jndi.queue" /]
    [/bean]
    
    [bean id="idDestination_02"
          class="org.springframework.jndi.JndiObjectFactoryBean" ]
          [property name="jndiName" value="jms.jndi.auxiliar" /]
    [/bean]
        
    [!-- **************** [JMS TEMPLATE] *************** --]     
    [bean id="idTemplateJMS_01" 
          class="org.springframework.jms.core.JmsTemplate" ]
          [property name="connectionFactory"          ref="idConnectionFactoryJDNI" /]
          [property name="destinationResolver"        ref="idDestinationResolverJNDI" /]
          [property name="defaultDestination"          ref="idDestination_01" /]      [!-- COLA #1 --]
          [property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /]
          [property name="sessionTransacted"         value="true" /]
    [/bean]    
   
    [bean id="idTemplateJMS_02" 
          class="org.springframework.jms.core.JmsTemplate" ]
          [property name="connectionFactory"          ref="idConnectionFactoryJDNI" /]
          [property name="destinationResolver"        ref="idDestinationResolverJNDI" /]
          [property name="defaultDestination"          ref="idDestination_02" /]      [!-- COLA #2 --]
          [property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /]
          [property name="sessionTransacted"        value="true" /]
    [/bean]
    
 [!-- ****************** [JMS MDP] ****************** --]  
[bean id="idClaseJmsMessageListener_01"
     class="pe.com.javaman.dummy.servicioLlamadasWS.jms.ServicioLlamadasMDP_A" ]  [!-- PARA RECEPCIÓN [ASINCRONA] DE LA COLA --]   
[/bean] 
   
[bean id="idClaseJmsMessageListener_02"
     class="pe.com.javaman.dummy.servicioLlamadasWS.jms.ServicioLlamadasMDP_B" ]  [!-- PARA RECEPCIÓN [ASINCRONA] DE LA COLA --]   
[/bean] 
   
 [!-- **************** [JMS LISTENER] *************** --]      
[bean id="idListenerJMS_01" 
     class="org.springframework.jms.listener.SimpleMessageListenerContainer" ]
     [property name="connectionFactory" ref="idConnectionFactoryJDNI" /]
     [property name="destination"            ref="idDestination_01" /]                 [!-- COLA #1 --]
     [property name="messageListener"   ref="idClaseJmsMessageListener_01" /]
[/bean] 
    
[bean id="idListenerJMS_02" 
     class="org.springframework.jms.listener.SimpleMessageListenerContainer" ]
     [property name="connectionFactory" ref="idConnectionFactoryJDNI" /]
     [property name="destination"            ref="idDestination_02" /]                 [!-- COLA #2 --]
     [property name="messageListener"   ref="idClaseJmsMessageListener_02" /]
[/bean]                                
 [/beans]  

Esto sería todo nos vemos.


domingo, 20 de mayo de 2012

CREACIÓN Y MANEJO DE UN MDB


En esta oportunidad tratare de explicar un poco el manejo de un MDB (Message Driven Bean), apoyándonos en la herramienta: “Oracle Enterprise Pack for Eclipse” que en si es un ECLIPSE.
Antes que nada un poco de conceptos:

ENTERPRISE JAVABEANS (EJB):

Enterprise JavaBeans son componentes de J2EE que implementan la tecnología Enterprise JavaBeans (EJB). Estos beans corren dentro de un EJB container, en un runtime environment dentro del Servidor de Aplicaciones. Proporcionan un modelo de componentes que simplifica el desarrollo de aplicaciones del lado del servidor, proporcionando apoyo automático a los servicios como las transacciones, seguridad y conectividad de base de datos. Estos servicios son proporcionados por el contenedor EJB que forma parte del servidor de aplicaciones. El contenedor maneja el ciclo de vida completo del Enterprise JavaBean (EJB). EJB 2.0 especifica tres tipos de Beans: Session, Entity, Message Bean.

MESSAGE DRIVEN BEAN (MDB):


Un MDB (Bean controlado por mensajes) es un consumidor de mensajes asíncrono y es invocado por el contenedor EJB al momento de la llegada de un mensaje JMS en una cola. Un cliente no puede acceder al Bean directamente, sino que lo hace mediante el envío de mensajes al destino de JMS (cola o tema), este MDB se activa mediante la implementación de la clase MessageListener. Los mensajes de beans no tiene estado conversacional y son anónimos.

Una plantilla base de un MDB debería lucir de esta manera:

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.annotation.Resource;
import javax.ejb.EJBException;

/**
 * JavamanMDB
 * @author cguerra
 */
@MessageDriven( activationConfig = { @ActivationConfigProperty(
propertyName  = "destinationType",
propertyValue = "javax.jms.Queue") },
mappedName    = "jms/MQ_01",
messageListenerInterface = MessageListener.class )
public class JavamanMDB implements MessageListener, MessageDrivenBean{

   private static final long serialVersionUID = 6500707485732319445L;
  
   @Resource
   private MessageDrivenContext mdc = null;

   //Constructor ...
   public JavamanMDB(){
   }

   /**
       * setMessageDrivenContext
       * @param mdcParam
       */
    @Override
    public void setMessageDrivenContext( MessageDrivenContext mdcParam ){
           this.mdc = mdcParam;
    }

   /**
    * ejbRemove
    */
    @Override
    public void ejbRemove() throws EJBException {    
    }
      
   /**
    * onMessage
    * @param messageParam
    */
    public void onMessage( Message messageParam ){         
    }

  }

El objetivo del TUTORIAL es justamente intentar crear lo mostrado en la grafica de arquitectura:

1. Un app Cliente (Puede ser un JSP, un Servlet, etc). En nuestro caso una clase Main que lance un Mensaje.
2. La configuración en un Servidor de aplicaciones de una COLA JMS.
3. La creación de un EJB de tipo MDB para que esta al escucha, de los mensajes ingresados en una COLA.
4. La interpretación del mensaje.
5. Procesamiento y redistribución (esta parte será explicada solamente).


Para el desarrollo completo de las 5 partes de tutorial, es preferible la descarga del documento detallado. La descarga la pueden hacer: AQUI.

Para descargar las fuentes de Dummy lo pueden hacer de aqui: AQUI.


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.


CONFIGURACION JMS EN ORACLE WEBLOGIC v11

En esta oportunidad mostrare de una forma detallada y paso a paso, la forma como podemos configurar el Servidor de Aplicaciones ORACLE WEBLOGIC v11 para poder trabajar con cola JMS. La necesidad de hacer este tutorial fue que en su momento cuando requerí en mi trabajo realizar esto no conseguí por ningún lado un tutorial que de manera completa y detallada me ayudara a realizar todo lo que requería. Axial que pensé en desarrollar yo uno mismo de manera mas adecuada y completa.

La API (Java Message Service) , también conocida por sus siglas JMS, es la solución creada por Sun Microsystems para el uso de colas de mensajes. Este es un estándar de mensajería que permite a los componentes de aplicaciones basados en la plataforma Java2 crear, enviar, recibir y leer mensajes. También hace posible la comunicación confiable de manera Síncrona y Asíncrona.

Para trabajar con JMS lo primero que se tiene que hacer es configurar el Servidor de Aplicaciones, en esta oportunidad el ORACLE WEBLOGIC 11. Debemos de crear el Factory, las Colas, etc. Ya que por medio de JNDI creado accederemos a dicha configuración en el servidor.

El RESUMEN de los que vamos a crear y configurar en el servidor es lo siguiente con dichos nombres:

- ALMACENAMIENTO PERSISTENTE [ARCHIVO]: crgaAlmacenPersistenteJMS
- ALMACENAMIENTO PERSISTENTE [JDBC]: crgaAlmacenPersistenteJDBC
- SERVIDOR JMS: crgaJMSServidor
- MODULO JMS: crgaJMSModulo
- SUB DESPLIEGUE: crgaSubDespliegue
- FÁBRICA DE COLAS: crgaQueueConexionFactory
- JNDI FABRICA COLAS: jms/crgaQueueConexionFactory
- COLA JMS: jms/crgaTestQueue
- JNDI COLA JMS: jms/crgaTestQueue

En realidad para la configuración completa son bastantes pasos y la manera mas amigable de entender es a modo visual, para hello he adjuntado el tutorial compledo con mas capturas de pantalla respectivas.

Para descargar el tutorial paso a paso pulsar: AQUI.

En un próximo tutorial, una vez ya configurado el servidor de aplicaciones, mostrare una manera muy fácil de ENVIAR y OBTENER mensajes de una cola JMS con JAVA.