Cómo enviar mensajes JMS a Websphere Application Server v8.5

IBM Websphere Application Server incluye un Service Integration Bus (SIB) que puede ser usado para comunicar aplicaciones usando mensajería JMS, estilo síncrono o asíncrono. Para probar el funcionamiento de estas aplicaciones se envían mensajes usando herramientas como Eclipse, Apache JMeter, PerfHarness, y posiblemente otras. Este artículo explica como enviar mensajes a las colas JMS de Websphere Application Server.

Fermín Luna Balcazar, Websphere IT Specialist, IBM México

Fermín es especialista Técnico para Software IBM México, es egresado del Instituto Politécnico Nacional, tiene más de 12 años en la industria de TI en áreas de desarrollo de Sistemas y liderazgo de grupos de desarrollo, trabajando en sectores como Banca, Retail, Telecomunicaciones. Actualmente es parte del equipo de Integración de Aplicaciones de WebSphere México, en productos como WebSphere MQ, IBM Integration Bus (formerly WebSphere Message Broker), WebSphere Datapower".



25-02-2014

Introducción

En escenarios de integración con mensajería JMS suele ser común el envío de mensajes a servidores remotos desde clientes que no necesariamente viven en un servidor de aplicaciones, por lo que es necesario que estos clientes llamados “Stand-alone” incluyan algunas librerías para comunicarse con el servidor. Dependiendo del tipo de pruebas: unitarias o de carga (pruebas de desempeño) y de las preferencias del usuario, línea de comandos o interfaz gráfica, existen diferentes herramientas que nos pueden ayudar para poder enviar estos mensajes de prueba.

En este artículo utilizaremos Websphere Applicaction Server ( WAS v8.5) y el Service Integration Bus integrado en WAS.

A continuación se describe cómo enviar mensajes hacia el “Service Integration Bus” (SIBus) de Websphere Application Server. Para esta finalidad se utilizan tres diferentes tipos de cliente JMS:

  1. Programa Java Stand-alone SendReceiveMsg.java). Las pruebas de envío se pueden realizar por línea de comandos o usando Eclipse. Esta opción es recomendable para pruebas unitarias, donde no son importantes las estadísticas, tener multi hilos ni multi usuarios.
  2. Apache JMeter, una herramienta Open Source para crear un Plan de Pruebas incluyendo simulación de números usuarios (hilos de ejecución), repeticiones, etc. Con esta herramienta se puede utilizar la interfaz gráfica y también la interfaz por línea de comandos. Esta opción es recomendable para pruebas de desempeño o de carga.
  3. Perfharness. Una excelente herramienta de IBM para realizar pruebas de rendimiento hacia diferentes proveedores JMS. Esta herramienta funciona en modo línea de comandos, su uso es sencillo y cuenta con varios parámetros personalizables para ejecutar las pruebas, lo que lo hace muy poderoso, además provee estadísticas valiosas en pruebas de desempeño. Esta opción es recomendable para pruebas de desempeño o de carga.

Las últimas dos opciones son muy recomendados cuando necesitamos realizar pruebas de rendimiento, de estrés o de carga, ya que cuentan con capacidades multi hilos, multi usuarios, estadísticas.

Al final del artículo se encuentran las ligas para descargar los clientes y el servidor Websphere Application Server v8.5, ya sea la versión para desarrolladores o la versión de prueba de 60 días, ambos proveen del Service Integration Bus que se necesita.

SIBus es un motor de mensajería construído enteramente con Java, es el motor de mensajería por defecto de Websphere Application Server desde la versión 6 del producto. Entre sus funciones principales están:

  • Soporte para “clustering”.
  • Es ideal para comunicar diferentes servidores con el mismo Bus.
  • Soporte para Point to Point y Pub-Sub de JMS.
  • Provee un esquema de seguridad.
  • Provee un esquema de Alta disponibilidad.
  • Integración con Websphere MQ.
  • Soporte para “Application Triggering” por medio de Message Driven Beans (MDB).

Ambiente de pruebas

Para este ambiente de pruebas se requiere:

  • WAS v8.5 que alojará las colas JMS.
  • El cliente JMS que publicará los mensajes a dicha Queue.

El servidor y el cliente están en máquinas diferentes, como se muestra a continuación.

Figura 1. Ambiente de pruebas JMS
Alternative text for image

Se supone que en este momento ya se tiene instalado WAS v8.5, por lo que se procede con una serie de pasos para la creación de los objetos JMS.

  • Creación del Service Integration Bus (SIB). Para ello hay que entrar a la consola de administración de WAS, con las siguientes opciones: Service Integration -> Buses -> New (tecleamos “testbus”) -> Next -> Finish. Finalmente damos clic en la liga Save del mensaje de aviso.
Figura 2. Nuevo Service Integration Bus
Alternative text for image
  • Agregamos miembros al Bus. Para ello entramos a la consola con las siguientes opciones: Service Integration -> Buses -> testbus -> Bus members -> Add -> Server -> (Seleccionar) HOSTNode01:Server1 -> Next ->(Seleccionar) File Store -> Next -> File Store (dejar valores default) -> Next -> Performance Parameters (dejar valores default) -> Next -> Finish. Finalmente damos clic en la liga Save del mensaje de aviso.
Figura 3. Nuevo miembro del Bus
Alternative text for image
  • Creación de Queue Connection Factory. Entramos a la consola en las siguientes opciones: Resources -> JMS -> Queue connection factories. Seleccionamos Scope (Cell=HOSTNode01Cell, Node=HostNode01, Server=server1). A continuación damos clic en el botón New -> Default messaging provider -> OK. En seguida necesitamos ingresar los siguientes campos: Name (qcftest), JNDI Name (jms/qcftest), Bus name (testbus), Target Type (Bus member name), Provider Endpoints (HOST:7276:BootstrapBasicMessaging), para el resto de los campos dejar valores default y dar clic en el botón OK. Finalmente damos clic en la liga Save del mensaje de aviso.
Figura 4. Nueva Queue Connection Factory
Alternative text for image
  • Creación de Queue. Entramos a la consola en las siguientes opciones: Resources -> JMS -> Queues. Seleccionamos Scope (Cell=HOSTNode01Cell, Node=HostNode01, Server=server1). A continuación damos clic en el botón New -> Default messaging provider -> OK. En seguida necesitamos ingresar los siguientes campos: Name (qreq), JNDI Name (jms/qreq), Bus name (testbus), Queue name (seleccionar Create Service Integration Bus Destination) -> Identifier (QREQ) -> Next -> Bus member (Node=HOSTNode01:Server=server1) Next -> Finish, dejar valores default y dar clic en botón OK. Finalmente damos clic en la liga Save del mensaje de aviso.
Figura 5. Queue creada en los recursos JMS
Alternative text for image
  • Reiniciar servidor de aplicaciones. Para ello ejecutamos los siguientes comandos de WAS: WAS_HOME\profiles\AppSrv01\bin\stopServer.bat server1WAS_HOME\profiles\AppSrv01\bin\startServer.bat server1 En los puntos anteriores hay que sustituir HOST por el hostname correspondiente al servidor donde está instalado WAS (en este caso W2K8WAS).

En este punto ya tenemos el servidor listo para enviar mensajes a las colas JMS del Bus.

Antes de seguir, se toman las siguientes suposiciones:

  • Se ha descargado el Software necesario para los clientes (PerfHarness, Apache Jmeter, Eclipse ó IBM Development Package for Eclipse), abajo vienen las ligas para la descarga.
  • Perfharness se encuentra en el directorio “C:\perfharness_v120\”
  • BM Development Package for Eclipse está descomprimido en el siguiente directorio: “C:\IBMDevPack\” y dentro se encuentran tanto Eclipse como el IBM SDK.
  • JMeter es la versión 2.9 y se encuentra en el siguiente directorio: “C:\apache-jmeter-2.9\”.

Si las versiones o los directorios de instalación cambian, es necesario realizar las adecuaciones pertinentes en los comandos.


Envío de mensajes de prueba

En cualquiera de las siguientes opciones necesitaremos las librerías de Websphere Application Server, ya sea para compilar la clase de java, agregar al “Build Path” de Eclipse o agregar al CLASSPATH de Perfharness. Estas librerías se pueden encontrar en el directorio WAS_HOME\runtimes del servidor WAS y son las siguientes:

  • com.ibm.ws.ejb.thinclient_8.5.0.jar
  • com.ibm.ws.orb_8.5.0.jar
  • com.ibm.ws.sib.client.thin.jms_8.5.0.jar
  • com.ibm.ws.messagingClient.jar (opcional)

Envío de mensajes con Java

Podemos utilizar la interfaz gráfica de Eclipse o llamar la clase de Java desde línea de comandos.

Adjunto se encuentra el código Java (SendReceiveMsg.java) para realizar la prueba. La clase envía cierto número de mensajes y los obtiene de regreso.

NOTA: Se recomienda utilizar el SDK de IBM, para evitar problemas al encontrar las clases ORB (­java.lang.NoClassDefFoundError: com/ibm/CORBA/iiop/ORB). El IBM Development Package for Eclipse, ofrece tanto el SDK de IBM como Eclipse.

Si es necesario se deberá configurar la variable de sistema

JAVA_HOME = C:\IBMDevPack\ibm_sdk70

Además se agregará al final de la variable “Path” del sistema Windows lo siguiente:

...;%JAVA_HOME%\bin

Listado 1. Sample code overlay

Haga clic para ver la lista de códigos

Listado 1. Sample code overlay

** 
import java.util.Hashtable;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class SendReceiveMsg {
	/**
	 * Clase utilizada para realizar una prueba de envio de Mensajes a una Queue JMS 
	 * en un servidor remoto de Websphere Application Server. 
	 * Esta prueba esta preparada con Eclipse agregando los jars de abajo en el "Build 
	 * Path", sin embargo se puede ejecutar desde linea  
	 * * de comandos agregando los jars necesarios (abajo ejemplo para WAS v8.5.0):
	 * - com.ibm.ws.ejb.thinclient_8.5.0.jar
	 * - com.ibm.ws.orb_8.5.0.jar
	 * - com.ibm.ws.messagingClient.jar
	 * - com.ibm.ws.sib.client.thin.jms_8.5.0.jar
	 * Estos jars se encuentran en WAS_HOME/runtimes.
	 * Seria necesario que se modifiquen los datos de conexion para compilar la clase 
	 * y posteriormente ejecutar el comando. Para enviar 8 mensajes de prueba seria: 
	 * java -cp %CLASSPATH% SendReceiveMsg 8 
	 * 
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		//#Connection parameters
	    String  strConnFactory = "jms/qcftest";
	    String  requestQueue = "jms/qreq";
	    String initialCtx = "com.ibm.websphere.naming.WsnInitialContextFactory";
	    String url = "iiop://W2K8WAS:2809";
	    int loops = 0;
	    if (args != null && args.length > 0) {
	    	loops = Integer.parseInt(args[0]);
	    } else {
	    	loops = 5;
	    }
	    Session session = null;
	    Connection connection = null;
	    ConnectionFactory connFactory = null;
	    MessageProducer msgProducer = null;
	    MessageConsumer	 msgConsumer = null;
	    Destination dest = null;
	    TextMessage outgoingMsg = null;
	    Message incomingMsg = null;
		try {
	    	Hashtable<String, String> env = new Hashtable<String, String>();
	    	env.put(Context.INITIAL_CONTEXT_FACTORY, initialCtx);
	    	env.put(Context.PROVIDER_URL, url);    	
	    	//#Initialization
	    	Context initialContext = new InitialContext(env);
			connFactory = (ConnectionFactory)initialContext.lookup(strConnFactory);
			dest =(Destination)initialContext.lookup(requestQueue);
			connection = connFactory.createConnection();
			connection.start();
			session = connection.createSession(false, 1);
			msgProducer = session.createProducer(dest);
			
			//#Message Sending
			for (int i = 0; i < loops; i++) {
				outgoingMsg = session.createTextMessage("Test message from java - " + (i+1));
				msgProducer.send(outgoingMsg);
				System.out.println((i+1) + " - Message Sent, ID = " + outgoingMsg.getJMSMessageID());
			}
			//#Message Reception
			msgConsumer = session.createConsumer(dest);
			loops = 0;
			while (true) {
				loops++;
			    incomingMsg = msgConsumer.receive(1);
			    if (incomingMsg != null && (incomingMsg instanceof TextMessage)) {
			    	System.out.println(loops + " - Message Read: " + ((TextMessage)incomingMsg).getText() + ", ID = " + incomingMsg.getJMSMessageID());
			    } else { 
			    	break; 
		        } 
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			//#Clearing objects
			outgoingMsg = null;
			incomingMsg = null;
			try {
				msgProducer.close(); msgProducer = null;
				msgConsumer.close(); msgConsumer = null;
				session.close(); session = null;
				connection.close(); connection = null;
			} catch (Exception e2) {
				e2.printStackTrace();
				throw e2;
			}
		}

	}
	
}

NOTA: Se trata de una clase de Java básica para el envío de mensajes JMS hacia WAS. En la primera parte (#Connection parameters) observamos la inicialización de las variables de conexión (strConnFactory, requestQueue, initialCtx , url), posteriormente (#Initialization) vemos la inicialización de los objetos JMS, después se observa (#Message Sending) el bloque para el envío de mensajes, posteriormente viene el bloque para recuperar los mensajes recién enviados (#Message Reception), al final está el bloque de código para liberar la memoria de los objetos (#Clearing objects).

Para facilitar la compilación y ejecución de la clase, los comandos se encuentran encapsulados en archivos .bat para windows (compile_SendReceive.bat y execute_SendReceive.bat).

Haga clic para ver la lista de códigos

set JMSLIB=c:\JMSLIB
set CLASSPATH=%JMSLIB%\com.ibm.ws.sib.client.thin.jms_8.5.0.jar;%JMSLIB%\com.ibm.ws.ejb.thinclient_8.5.0.jar;
%JMSLIB%\com.ibm.ws.orb_8.5.0.jar;%CLASSPATH%
javac -cp %CLASSPATH% SendReceiveMsg.java

java -cp %CLASSPATH% SendReceiveMsg 5
Figura 6. Prueba de envío JMS desde línea de comandos
Alternative text for image

La otra forma de ejecutar la prueba es utilizando Eclipse. Adjunto se encuentra el archivo “was-jms-test.zip” que se puede importar en eclipse, será necesario ajustar el “Build Path” para que corresponda al directorio donde están las librerías mencionadas, para despúes dar clic en el botón “Run” y en la consola se verán los mensajes enviados y recibidos.

Figura 7. Clase de Java en Eclipse para la prueba
Alternative text for image

Envío de mensajes con Apache JMeter

En el artículo se encuentra adjunto un plan de pruebas simple (was-jms-test.jmx) que puedes abrir con Apache JMeter. Podrás modificar algunos parámetros para enviar mensajes, por ejemplo el número iteraciones (loops) y simular el número de usuarios (threads). Las librerías (jars) arriba mencionadas se deben copiar en el directorio “JMETER_HOME/lib” de esa forma la herramienta puede encontrar las clases necesarias.

Es necesario editar el test plan para ingresar los parámetros necesarios: número de iteraciones (loops), el servidor y puerto (url), el Queue Connection Factory (qcf), o la Queue (qreq). Para editar el Test Plan deberá dar clic en la opción File -> Open y luego buscar el archivo “was-jms-test.jmx”.

Figura 8. Plan de pruebas de Apache JMeter
Alternative text for image

Si se ejecuta por línea de comandos, abajo se muestra el comando para enviar 20 mensajes de prueba:

JMETER_HOME\bin\jmeter -n -t C:\JMSTest\was-jms-test.jmx -Jloops=20

En seguida se muestra la salida cuando se ejecuta JMeter por línea de comandos.

Figura 9. Prueba de JMeter usando línea de comandos
Alternative text for image

En seguida también se muestra la salida de una prueba utilizando la interfaz gráfica de JMeter.

Figura 10. Prueba de JMeter usando interfaz gráfica
Alternative text for image

Envío de mensajes con Perfharness

Esta herramienta de IBM basada en Java nos permite realizar pruebas por línea de comandos. Al igual que JMeter ofrece características como múltiples hilos, período de tiempo, número de mensajes, entre otras. Por defecto la prueba corre con un hilo por 60 segundos y envía tantos mensajes como sea posible hacia el servidor. En el comando de abajo vamos a enviar 10 mensajes, sin embargo en el manual podrán encontrar otras opciones como PutGet, RequestResponse, entre otras.

Haga clic para ver la lista de códigos

set JMSLIB=C:\jmslib\
set JAR_FILE=C:\perfharness_v120\perfharness.jar
set CLASSPATH=%JMSLIB%\com.ibm.ws.sib.client.thin.jms_8.5.0.jar;%JMSLIB%\com.ibm.ws.ejb.thinclient_8.5.0.jar;
%JMSLIB%\com.ibm.ws.orb_8.5.0.jar;%JAR_FILE%;%CLASSPATH%
set URL=iiop://W2K8WAS:2809
set INICTX=com.ibm.websphere.naming.WsnInitialContextFactory
set CONNFAC="jms/qcftest"
set DEST="jms/qreq"
set FILE=C:\perfharness_v120\sample.xml
java -Xms768M -Xmx768M -cp %CLASSPATH% JMSPerfHarness -tc jms.r11.Sender -pc JNDI -ii %INICTX% -iu %URL% -cf 
%CONNFAC% -d %DEST% -mf %FILE% -pp true -tx true -mg 10

Adjunto se encuentra un archivo “execute_perfharness.bat”, con los comandos anteriores.

Figura 11. Envío de mensajes con PerfHarness
Alternative text for image

Conclusión

En este artículo se ha demostrado la facilidad para el envío mensajes JMS al bus de WAS v8.5 utilizando Eclipse, JMeter y PerfHarness. Para lograrlo se ha realizado:

  • La configuración de los objetos JMS en WAS (SIB, Queue Connection Factory y Queues).
  • Se ha implementado una clase de Java para las pruebas.
  • Se ha creado un plan de pruebas de JMeter.
  • Se ha creado un set de pruebas de PerfHarness.

Agradezco a mi colega Juan Montalvo Godina y Pedro Ernesto Arroyo (where ever you are) por sus valiosas contribuciones a este artículo.


Descargas

Adjunto encontrarán un archivo JMS_WASv85.zip que contiene:

  • compile_SendReceive.bat. Contiene los comandos para compilar la clase “SendReceiveMsg.java”.
  • execute_SendReceive.bat. Contiene los comandos para ejecutar la clase “SendReceiveMsg”
  • execute_perfharness.bat. Contiene los comandos para ejecutar la prueba con PerfHarness.
  • sample.xml. Archivo XML de pruebas que se envía con PerfHarness.
  • jmeter-was-jms.bat. Comandos para la prueba con JMeter.
  • SendReceiveMsg.java. Clase para probar el envío de mensajes JMS.
  • was-jms-test.jmx. Plan de pruebas de JMeter.
  • was-jms-test.zip. Proyecto de eclipse (export) para realizar la prueba de Java con el GUI eclipse.

Recursos


Descargar

DescripciónNombretamaño
DescargasJMS9285 bytes

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere
ArticleID=964135
ArticleTitle=Cómo enviar mensajes JMS a Websphere Application Server v8.5
publish-date=02252014