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.
- 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.*;
- Obtenga un contexto inicial.
try {
ctx = new InitialContext(env);
...
- 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;
...
- 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 );
...
- 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 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.
- Envíe el mensaje.
- 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);
- 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);
- Envíe el mensaje.
Para enviar el mensaje, se pasa el mensaje al método send en
QueueSender:
queueSender.send(outMessage);
- 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, 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();
- 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 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();
- 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.