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
- 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
- Obtenga un contexto inicial:
try { ctx = new InitialContext(env); ...
- 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:
crea una instancia de cola de JMS que se puede utilizar para hacer referencia a la Q1 de destino existentes.Queue q = mySession.createQueue("Q1");
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.
- 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();
- 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().
- Envíe un mensaje.
- 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);
- 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);
- Envíe el mensaje. Para enviar el mensaje, se pasa el mensaje al método send en QueueSender:
queueSender.send(outMessage);
- 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.
- Reciba las respuestas.
- 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+"'";
- 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);
- 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.
- 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();
- 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.
- 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;
- 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();
- 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


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmj_devap
File name: tmj_devap.html