Desarrollo de clientes JMS

Utilice esta tarea para desarrollar una aplicación cliente JMS que utilice mensajes para comunicarse con aplicaciones de empresa.

Acerca de esta tarea

Este tema ofrece una visión general de los pasos necesarios para desarrollar una aplicación cliente JMS. Este tema sólo describe el caso relacionado con JMS; no describe la programación cliente general, con la que ya debe estar familiarizado. Para obtener información detallada sobre estos pasos así como ejemplos de desarrollo de clientes JMS, consulte la documentación de Java™ Message Service y la sección Utilización de Java del Information Center de IBM MQ.

El cliente JMS asume que ya existen los recursos JMS (como una fábrica de conexiones de cola y un destino de cola). Una aplicación cliente puede obtener recursos JMS apropiados mediante búsquedas JNDI o mediante programación sin utilizar JNDI.

Para obtener información sobre el cliente ligero para JMS con WebSphere Application Server, que es una tecnología incorporable que proporciona conexiones JMS V1.1 con un motor de mensajería de proveedor de mensajería predeterminado de WebSphere Application Server, consulte Utilización de JMS para conectarse a un motor de mensajería del proveedor de mensajería predeterminado de WebSphere Application Server.

Para obtener más información sobre cómo desarrollar aplicaciones cliente y cómo configurar recursos JMS para ellas, consulte Desarrollo de código cliente de aplicaciones J2EE y las tareas relacionadas.

Para utilizar JMS, un programa cliente JMS típico sigue los pasos generales siguientes. Este ejemplo se basa en el uso de consultas JNDI para obtener recursos JMS.

Procedimiento

  1. Importe los paquetes JMS. Una aplicación de empresa que utiliza JMS empieza por un número de sentencias import de JMS; por ejemplo:
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.rmi.PortableRemoteObject;
    import javax.jms.*;
  2. Obtenga un contexto inicial.
       try     {
            ctx = new InitialContext(env);
    ...
  3. Defina los parámetros que el cliente debe utilizar; por ejemplo, para identificar la fábrica de conexiones de cola y para ensamblar mensaje que se van a enviar.
    public class JMSppSampleClient
    {
      public static void main(String[] args)
      throws JMSException, Exception
    
      {
        String messageID = null;
        String outString = null;
        String  qcfName                   = "java:comp/env/jms/ConnectionFactory";
        String  qnameIn                   = "java:comp/env/jms/Q1";
        String  qnameOut                  = "java:comp/env/jms/Q2";
        boolean verbose = false;
    
        QueueSession           session    = null;
        QueueConnection        connection = null;
        Context                ctx        = null;
    
        QueueConnectionFactory qcf        = null;
        Queue                  inQueue    = null;
        Queue                  outQueue   = null;
    
    ...
  4. Recupere del espacio de nombres JNDI los objetos administrados. El método InitialContext.lookup() se utiliza para recuperar objetos administrados (una fábrica de conexiones y los destinos de cola):
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
           outQueue = (Queue)ctx.lookup( qnameOut );
    ...
  5. Cree una conexión con el proveedor de servicio de mensajes. La conexión proporciona acceso al transporte subyacente y se utiliza para crear sesiones. El método createQueueConnection() en el objeto factory se utiliza crear la conexión.
           connection = qcf.createQueueConnection();
    La especificación de JMS define que las conexiones deben crearse en el estado de detenido. Hasta que no empieza la conexión, los MessageConsumers que están asociados a la conexión no pueden recibir mensajes. Para iniciar la conexión, emita el siguiente mandato:
           connection.start();
  6. Cree una sesión, para enviar y recibir mensajes. La sesión proporciona un contexto para producir y consumir mensajes, incluidos los métodos utilizados para crear MessageProducers y MessageConsumers. El método createQueueSession se utiliza en la conexión para obtener sesiones. El método acepta dos parámetros:
    • Un valor booleano que determina si se realizará la transacción de la sesión.
    • Un parámetro que determina la modalidad de reconocimiento.
           boolean transacted = false;
           session = connection.createQueueSession( transacted,
                                                   Session.AUTO_ACKNOWLEDGE);

    En este ejemplo, no se realiza la transacción de la sesión y reconocerá automáticamente los mensajes recibidos. Con estos valores, sólo se devuelve un mensaje después de un error del sistema o si la aplicación cliente termina inesperadamente.

  7. Envíe el mensaje.
    1. Cree MessageProducers para crear mensajes. Para punto a punto, MessageProducer es un QueueSender que se crea pasando un objeto queue de salida (recuperado antes) al método createSender en la sesión. Normalmente se crea un QueueSender para una cola específica, de modo que todos los mensajes enviados por dicho remitente se envíen al mismo destino.
             QueueSender queueSender = session.createSender(inQueue);
    2. Cree el mensaje. Utilice la sesión para crear un mensaje vacío y añadir los datos transferidos.

      JMS proporciona varios tipos de mensajes, cada uno de ellos incorpora algún reconocimiento de su contenido. Para evitar la referencia a nombres de clases específicas del proveedor para los tipos de mensajes, se proporcionan los métodos en el objeto Session para la creación de mensajes.

      En este ejemplo, se crea un mensaje de texto a partir de la propiedad outString, que se podría proporcionar como un parámetro de entrada en la invocación del programa cliente o construirse de algún otro modo:
             TextMessage outMessage = session.createTextMessage(outString);
    3. Envíe el mensaje.
      Para enviar el mensaje, se pasa el mensaje al método send en QueueSender:
             queueSender.send(outMessage);
  8. Reciba las respuestas.
    1. Cree un identificador de correlación para enlazar el mensaje enviado con la respuesta. En este ejemplo, el cliente recibe mensajes de respuesta que están relacionados con el mensaje que se ha enviado, utilizando un identificador de mensaje específico del proveedor en JMSCorrelationID.
             messageID = outMessage.getJMSMessageID();
      El identificador de correlación se utiliza a continuación en el selector de mensajes, para seleccionar sólo mensajes que tienen ese identificador:
             String selector = "JMSCorrelationID = '"+messageID+"'";
    2. Cree un MessageReceiver para recibir mensajes. Para punto a punto, MessageReceiver es un QueueReceiver que se crea pasando un objeto queue de entrada (recuperado antes) y el selector de mensajes al método createReceiver en la sesión.
             QueueReceiver queueReceiver = session.createReceiver(outQueue, selector);
    3. Recupere el mensaje de respuesta. Para recuperar un mensaje de respuesta, se utiliza el método receive en QueueReceiver:
             Message inMessage = queueReceiver.receive(2000);

      El parámetro de la llamada receive es un tiempo de espera en milisegundos. Este parámetro define cuánto debería esperar el método si no hubiera mensajes disponibles inmediatamente. Si omite este parámetro, la llamada se bloquea indefinidamente. Si no desea ningún retardo, utilice el método receiveNoWait(). En este ejemplo, se devuelve el resultado de la llamada a receive cuando llega el mensaje o, después de 2000 mseg, lo que llegue antes.

    4. Actúe sobre el mensaje recibido. Cuando se recibe un mensaje, puede actuar sobre éste como sea necesario mediante la lógica empresarial del cliente. Algunas acciones de JMS generales son comprobar que el mensaje es del tipo correcto y extraer el contenido del mensaje. Para extraer el contenido del cuerpo del mensaje, debe realizar la conversión de tipos de la clase Message genérica (que es el tipo de devolución declarado de los métodos receive) a la subclase más específica, como TextMessage. Es un buen sistema probar siempre la clase message antes de convertir, de este modo los errores inesperados se pueden tratar más fácilmente.

      En este ejemplo, se utiliza la instancia de operator para comprobar que el mensaje recibido es del tipo TextMessage. Luego se extrae el contenido del mensaje convirtiendo su tipo a la subclase TextMessage.

             if ( inMessage instanceof TextMessage )
      
      ...
                 String replyString = ((TextMessage) inMessage).getText();
  9. Ciérrelo. Si la aplicación tiene que crear muchos objetos JMS de breve duración en el nivel de sesión o inferior, es importante cerrar todos los recursos JMS utilizados. Para efectuar esto, puede llamar al método close() en las distintas clases (QueueConnection, QueueSession, QueueSender y QueueReceiver) cuando ya no son necesarios los recursos.
           queueReceiver.close();
    ...
           queueSender.close();
    ...
           session.close();
           session = null;
    ...
           connection.close();
           connection = null;
  10. Publicación y suscripción de mensajes. Para utilizar el soporte de publicación/suscripción en lugar de mensajes punto a punto, las acciones generales del cliente son las mismas; por ejemplo, para crear una sesión y una conexión. Las excepciones son que se utilizan los recursos topic en lugar de los recursos queue (como TopicPublisher en lugar de QueueSender), como se muestra en el ejemplo siguiente para publicar mensajes:
    // Crear un TopicPublisher
           TopicPublisher pub = session.createPublisher(topic);
    ...
           pub.publish(outMessage);
    ...
           // Para cerrar un TopicPublisher
           pub.close();
  11. Manejo de errores Los errores de módulo ejecutable de JMS se informan mediante excepciones. La mayoría de los métodos de JMS emiten JMSExceptions para indicar errores. Resulta recomendable en programación capturar estas excepciones y mostrarlas en una salida adecuada.

    A diferencia de las excepciones Java normales, las excepciones JMSException pueden contener otras excepciones integradas en ellas. La implementación de JMSException no incluye la excepción integrada en la salida de su método toString(). Por lo tanto, debe comprobar explícitamente si hay alguna excepción integrada e imprimirla, como se muestra en el ejemplo siguiente:

        catch (JMSException je)
        {
           System.out.println("JMS failed with "+je);
           Exception le = je.getLinkedException();
           if (le != null)
           {
               System.out.println("linked exception "+le);
           }
        }

Qué hacer a continuación

Para obtener información sobre cómo ejecutar un cliente en un servidor remoto específico: Ejecución de una aplicación cliente Java EE con launchClient.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmj_devcl
File name: tmj_devcl.html