Desarrollo de una aplicación de empresa de modo que utilice JMS

Utilice esta tarea para desarrollar aplicaciones de empresa de modo que utilicen la API JMS directamente para mensajes asíncronos.

Acerca de esta tarea

Este tema ofrece una visión general de los pasos necesarios para desarrollar aplicaciones enterprise (servlet o enterprise bean) de modo que utilicen la API JMS directamente para mensajes asíncronos.

Este tema sólo describe el caso relacionado con JMS; no describe la programación general de aplicaciones empresariales, con la que ya debe estar familiarizado. Para obtener información detallada sobre estos pasos y ejemplos de desarrollos de una aplicación de empresa para que utilicen JMS, consulte la Documentación de Java™ Message Service

Las aplicaciones de empresa utilizan detalles de recursos JMS que se definen en WebSphere Application Server y se enlazan al espacio de nombres JNDI mediante el soporte administrativo de WebSphere Application Server.

Para utilizar JMS, lleve a cabo los pasos generales siguientes:

Procedimiento

  1. Importe los paquetes JMS. Una aplicación de empresa que utiliza JMS empieza con varias sentencias import de JMS, que deben incluir al menos las sentencias siguientes:
    import javax.jms.*;       //Interfaces JMS
    import javax.naming.*;    //Se utiliza para la búsqueda JNDI de objetos administrados
  2. Obtenga un contexto inicial:
       try     {
            ctx = new InitialContext(env);
    ...
  3. 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 JMS y destinos JMS). En el siguiente ejemplo se muestra cómo recibir un mensaje de una cola:
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
    ...
    Un enfoque alternativo, pero menos manejable, para obtener objetos de destino de JMS definidos administrativamente por la búsqueda de JNDI es utilizar el método Session.createQueue(String) o el método Session.createTopic(String). Por ejemplo:
    Queue q = mySession.createQueue("Q1");
    crea una instancia de cola de JMS que se puede utilizar para hacer referencia a la Q1 de destino existentes.

    En este formulario más sencillo, el parámetro para este método de creación es el nombre de un destino existente. Si desea conocer situaciones más complejas, las aplicaciones pueden utilizar un formato basado en URI, que permite proporcionar un número arbitrario de pares de valores de nombres para establecer varias propiedades del objeto de destino de JMS.

  4. 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();
  5. Cree una sesión, para enviar o 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 termina inesperadamente.

    Los puntos siguientes, como se definen en la especificación de EJB, se aplican a estos distintivos:
    • El distintivo transacted que se pasa a createQueueSession se ignora dentro de transacciones globales y todo el trabajo se realiza como parte de la transacción. Fuera de las transacciones se utiliza el distintivo transacted y, si está establecido en true, la aplicación debería utilizar session.commit() y session.rollback() para controlar la finalización del trabajo. En módulos EJB2.0, si el distintivo transacted está establecido en true y fuera de una transacción XA, la sesión interviene en la transacción local de WebSphere y el atributo de acción sin resolver del método se aplica al trabajo de JMS si la aplicación no lo ha confirmado o retrotraído.
    • Los clientes no pueden utilizar Message.acknowledge() para reconocer mensajes. Si se pasa un valor de CLIENT_ACKNOWLEDGE en la llamada a createxxxSession, se reconocerán automáticamente los mensajes en el servidor de aplicaciones y no se utilizará Message.acknowledge().
  6. Envíe un mensaje.
    1. Cree MessageProducers para crear mensajes. Para mensajes 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:
             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);
  7. 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, es necesario 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();
  8. 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;
  9. Publicación y suscripción a mensajes. Para utilizar el soporte de publicación/suscripción de JMS en lugar de mensajes punto a punto, las acciones generales 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();
  10. 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

Después de haber empaquetado la aplicación, puede desplegar a continuación la aplicación en WebSphere Application Server, como se describe en Despliegue de aplicaciones de empresa para utilizar JMS.

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_devap
File name: tmj_devap.html