Integre rápidamente sus aplicaciones BlueMix usando Elastic MQ

30-04-2014
PDF (308 KB)
 

Mark Phillips

MQ Cloud Technical Lead

@markphillips

Melanie Rao

MQ Cloud Software Engineer

Elastic MQ proporciona un servicio de mensajería flexible y fácil de usar para aplicaciones desplegadas en Bluemix. Usted puede usar Elastic MQ como un servicio de creación de colas para enviar mensajes únicos a receptores individuales por medio de colas, o como un corredor de publicación/suscripción para enviarles notificaciones a receptores múltiples. Por ejemplo, el servicio lo puede usar una aplicación móvil o Web que necesite procesar una cantidad de videos, una tarea bastante intensiva para el CPU. Esto se puede descargar a instancias múltiples de una aplicación de trabajador back-end en la nube. Cada uno de estos trabajadores puede entonces responder a una cola asíncrona de respuesta, permitiendo que la aplicación en un dispositivo móvil o Web recolecte sus respuestas.

Elastic MQ proporciona las siguientes características:

  • No administración para casos de uso común.
  • Soporte para aplicaciones Java™ escritas para usar el JMS API.
  • Soporte para aplicaciones Node.js escritas para usar la API MQ Light.

Para los problemas que pueda encontrar con este servicio, vea la página Obtenga ayuda en el sitio de la Comunidad de Desarrolladores BlueMix.

Obtenga el código aquí

Lo que necesitará para construir su aplicación

 

Paso 1. Empezar con la API JMS Elastic MQ

 

Para ayudarle a familiarizarse con la API JMS de Elastic MQ, le daremos aquí un paseo rápido que describe como desplegar una aplicación muestra. Esta aplicación se vincula a una instancia Elastic MQ en BlueMix, toma una oración que usted captura y convierte las palabras en la secuencia a mayúsculas.

Diagram of how Elastic MQ breaks sentence into upper case words and sends responses

La muestra tiene dos partes:

  • Una aplicación Web implementada como un servlet Java empacado como un archivo Java EE (JEE) .war que se ejecuta en un tiempo de ejecución Liberty de un Servidor de Aplicaciones WebSphere. La aplicación acepta la entrada de texto en una página Web, descompone el texto en palabras, envía las palabras a la aplicación del trabajador y recibe las palabras procesadas como mensajes de respuesta. Luego estos mensajes se muestran dinámicamente en la página Web junto con la cadena de identificación del trabajador. La aplicación Web del servlet demuestra cómo desplegar una aplicación JEE en Liberty, cómo usar una búsqueda JNDI para establecer una conexión a Elastic MQ y cómo enviar y recibir mensajes de y hacia las colas.
  • Una aplicación Java™ de trabajador SE que se despliega a BlueMix, la cual toma palabras capturadas por usted, las convierte a mayúsculas y luego coloca la información en una cola. El programa de trabajador JMS demuestra cómo vincular una aplicación JMS a una instancia de servicio Elastic MQ usando la clase del asistente Elastic MQ, cómo usar el protocolo Elastic MQ para obtener mensajes de solicitud de una cola y poner mensajes de respuesta en otra cola y cómo se pueden usar múltiples aplicaciones de trabajadores para procesar mensajes en una cola.

Paso 2. Descargar y compilar el código fuente

 

El código fuente de las muestras almacenadas en un proyecto de Servicios DevOps de IBM. Usted necesitará instalar un archivo GIT, un archivo ANT y un SDK Java para descargar y construir la muestra. Usted puede obtener el código haciendo clic en el botón azul cerca del inicio de este artículo.

Para obtener el código fuente y construir las partes de la muestra:

  1. Use el URL del GIT especificado en la página anterior vinculada para clonar el repositorio GIT de Servicios DevOps (ver la sección Ayuda de Servicios DevOps para obtener ayuda adicional).
  2. El nivel superior mqservicesampleweb contiene la aplicación Web, mientras que mqservicesampleworker contiene la aplicación del trabajador. Ejecute ant de cada uno de estos directorios para construir los binarios correspondientes y hágalo otra vez después de hacer cualquier cambio para generar los binarios actualizados.

Paso 3. Trabajar con la aplicación de trabajador JMS

 

El siguiente código muestra una versión simplificada del programa con la verificación de error y las declaraciones suprimidas:

Haga clic para ver la lista de códigos

 Connection conn = WebSphereMQServiceConnectionHelper .getWebSphereMQServiceConnectionFactory() .getJmsConnectionFactory().createConnection(); Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); conn.start(); Queue queue = sess.createQueue("jms/requestQueue"); MessageConsumer consumer = sess.createConsumer(queue); while (errorCount < 10) { Message message = consumer.receive(); Destination replyDestination = message.getJMSReplyTo(); MessageProducer replyProducer = sess.createProducer(replyDestination); TextMessage replyMessage = sess.createTextMessage(); msg = ((TextMessage) message).getText().toUpperCase(); replyMessage.setText(msg + "\tProcessed by worker ID: " + ID); replyMessage.setJMSReplyTo(null); replyProducer.send(replyMessage); replyProducer.close(); } sess.close(); conn.close();

A excepción de la primera línea, este código es un programa de consumidor JMS típico. La primera línea usa la clase proporcionada WebSphereMQServiceConnectionHelper para simplificar el proceso de obtener una ConnectionFactoryJMS.

Desplegando y operando en BlueMix

 
  1. Desarrolle la aplicación de trabajador JMS corriendo ant en el directorio mqservicesampleworker que produce un archivo JAR llamado MQServiceSampleWorker.jar.
  2. Empuje la aplicación muestra sin iniciarla. Usted puede usar el comando cf para desplegar la aplicación desde la línea de comando. Si usted no ha usado el comando cf antes, siga las instrucciones BlueMix Quick Start para aprender cómo usarlo. Escriba el comando siguiente:

    Haga clic para ver la lista de códigos

     cf push MQS.sample.worker -b https://github.com/cloudfoundry/java- buildpack -p MQServiceSampleWorker.jar --no-start --no-route

    La opción-b especifica el paquete de construcción Java porque la aplicación es una aplicación Java independiente. La opción --no-route indica que la aplicación no requiere una dirección HTTP externa asignada a ella. Como el servicio Elastic MQ necesita estar vinculado a la aplicación antes de ejecutarla, la opción --no-start también necesita ser incluida.

  3. Cree el servicio. La misma instancia de servicio se comparte tanto por las aplicaciones Web como las de trabajador en la muestra. Si no lo ha hecho todavía, cree el servicio escribiendo el siguiente comando:
    cf create-service ElasticMQ Default mqsampleservice

    Para listar el servicio que ha creado, escriba el siguiente comando:

     cf services
  4. Vincule el servicio a la aplicación no iniciada. El servicio se debe llamar mqsampleservice. Escriba el siguiente comando:
     cf bind-service MQS.sample.worker mqsampleservice
  5. Inicie la aplicación para refrescar las variables del ambiente. Escriba el siguiente comando:
    cf start MQS.sample.worker
  6. Cuando se despliegan tanto las aplicaciones Web como las de trabajador, es posible probar la muestra aumentando el número de instancias de trabajador JMS que se están ejecutando. Para escalar el número de instancias a 4, por ejemplo, use el siguiente comando:
    cf scale MQS.sample.worker -i 4

Paso 4: Trabajando con la aplicación Web JMS

 

El servlet Java envía un mensaje de solicitud al servicio back-end en respuesta a un HTTP POST que se envía de la página Web cliente HTML. Esta página está empacada junto con el servlet.

El servlet está empacado como un Archivo de Aplicación Web (WAR), que contiene el contenido Web que va a ser servido por el contenedor en la que está desplegada la aplicación, junto con un descriptor acerca del despliegue. Debido a que el servlet necesita establecer una conexión a un servicio de mensajería y poner y obtener mensajes a las colas, se necesitan describir las colas en el descriptor de despliegue como referencias de recursos y referencias de ambientes de recursos.

El siguiente snippet de código de web.xml muestra la definición de una ConnectionFactory y dos objetos Queue que están referenciados por sus nombres res-ref en el espacio JNDI local de Java.

Haga clic para ver la lista de códigos

 <resource-ref> <description> ConnectionFactory used to send and receive messages to and from the backend worker. </description> <res-ref-name>jms/CF1</res-ref-name> <res-type>javax.jms.ConnectionFactory</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> <resource-env-ref> <resource-env-ref-name>jms/requestQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref> <resource-env-ref> <resource-env-ref-name>jms/replyQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref>

El siguiente snippet de código muestra una versión simplificada del programa con la verificación de errores y declaraciones eliminadas. El servlet se inicializa y se obtiene un espacio de InitialContext al contenedor JNDI, permitiendo la búsqueda de los objetos de conexión del espacio JNDI local.

Haga clic para ver la lista de códigos

 InitialContext ctx = new InitialContext(); ConnectionFactory myCf = (ConnectionFactory)ctx.lookup("java:comp/env/jms/CF1"); Queue myRequestQueue = (Queue)ctx.lookup("java:comp/env/jms/requestQueue"); Queue myReplyQueue = (Queue)ctx.lookup("java:comp/env/jms/replyQueue");

Cuando se recibe un mensaje de solicitud HTTP POST de la página Web de muestra, se ejecutan dos pasos. En el primer paso, se envía un mensaje de solicitud al servicio back-end para cada una de las palabras del texto capturado en la página Web muestra, que se hace de manera similar a un programa de publicador JMS típico.

Haga clic para ver la lista de códigos

 String message = (String) request.getParameter("message"); Connection connection = myCf.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(myRequestQueue); connection.start(); for (String word : messages) { TextMessage requestMsg = session.createTextMessage(word); requestMsg.setJMSReplyTo(myReplyQueue); producer.send(requestMsg); } producer.close(); session.close(); connection.close();

En el segundo paso, se verifica la cola de respuesta para una respuesta de los procesos del trabajador del back-end. Cuando hay una respuesta disponible, se regresa como la respuesta HTTP a la consulta original.

Haga clic para ver la lista de códigos

 Connection connection = myCf.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = session.createConsumer(myReplyQueue); while ((replyMsg = (TextMessage) consumer.receive(1000)) != null) { replyMsgTxt.add(replyMsg.getText()); } consumer.close(); session.close(); connection.close(); generateReply(response, "SUCCESS!", replyMsgTxt);

Desplegar en un paquete de Servidor Liberty

 

El ejemplo de aplicación viene empacado como un perfil de usuario del servidor Liberty, que cuando se despliega en BlueMix, ignora el perfil Liberty predeterminado que se crea como el tiempo de ejecución de la aplicación. Al usar este método de despliegue, usted puede personalizar el perfil server.xml para crear los objetos de conexión necesarios para vincular la aplicación al servicio de mensajería y ponerlas a disposición en el espacio JNDI del contenedor Liberty.

Los siguientes snippets XML muestran cómo se modifica un server.xml servidor Liberty predeterminado para proporcionar los vínculos de la mensajería en el espacio JNDI Liberty.

  1. Primero, instale el adaptador WebShpere MQ Resource como una característica de Liberty, con el administrador de características:
     <feature>wmqJmsClient-1.1</feature>
  2. Declare una variable para localizar el archivo Resource Adapter:

    Haga clic para ver la lista de códigos

     <variable name="wmqJmsClient.rar.location"value="${shared.resource.dir}/wmq/wmq.jmsra.rar"/>

    Note aquí que el adaptador está referenciado por una variable. La variable es expandida por el servidor Liberty al momento del despliegue a la ruta absoluta. Esto permite la colocación del adaptador Resource dentro del paquete del servidor sin la necesidad de saber a dónde se extrae en la aplicación VM.

  3. Defina los objetos de mensajería para hacer el mapa a los requisitos establecidos en el descriptor de despliegue de la aplicación web.xml. Los objetos de mensajería son un ConnectionFactory y dos objetos Queue.

    Haga clic para ver la lista de códigos

     <jmsConnectionFactory jndiName="jms/CF1" connectionManagerRef="ConMgr6"> <properties.wmqJms hostName="${cloud.services.mqsampleservice.connection.host}" port="${cloud.services.mqsampleservice.connection.port}" channel="${cloud.services.mqsampleservice.connection.appChannel}" userName="${cloud.services.mqsampleservice.connection.username}" password="${cloud.services.mqsampleservice.connection.password}" /> </jmsConnectionFactory> <connectionManager id="ConMgr6" maxPoolSize="10"/> <jmsQueue id="reqq" jndiName="jms/requestQueue"> <properties.wmqJms baseQueueName="jms/requestQueue"/> </jmsQueue> <jmsQueue id="rpyq" jndiName="jms/replyQueue"> <properties.wmqJms baseQueueName="jms/replyQueue"/> </jmsQueue>

De interés notable en esto está, una vez más, el uso de variables para los valores que proporcionan la conectividad al servicio de mensajería. Estas variables están predefinidas y Liberty se expanden con los valores proporcionados por el servicio de mensajería a través de la variable del ambiente VCAP_SERVICES. Las variables toman la forma de:

 ${cloud.services.<message_service_name>.connection.<variable>}

Es importante que <message_service_name> coincida con el nombre del servicio que se crea y se vincula a la aplicación.

Para obtener una lista completa de objetos que puede agregar a server.xml, vea Descripciones del archivo de configuración en el Centro de Información Liberty.

Desplegar y operar en BlueMix

 
  1. Construya la aplicación Web JMS ejecutando ant en el directorio mqservicesampleweb . Esto produce un archivo WAR llamado MQServiceSampleWeb.war, que se colocará en el paquete del servidor Liberty en el lugar apropiado (dist/wlp/usr/servers/sampleserver/apps).
  2. Empuje la aplicación muestra sin iniciarla. Esta acción registra la aplicación y la configuración con BlueMix y habilita los servicios que se vincularán a ella. Puede usar el comando cf para desplegar la aplicación de la línea de comando. Si no ha usado el comando cf antes, sigua las instrucciones BlueMix Quick Start para aprender cómo usarlo. Escriba el siguiente comando:
     cf push MQS.sample.web -m 512M -p dist -n <unique hostname> --no-start

    La opción -m especifica que deben haber 512 MB de memoria disponibles para la aplicación. Se necesita la opción -n para especificar un nombre de host único, que se usará para crear una URL para permitir el acceso al front-end Web.

  3. Cree el servicio. La misma instancia de servicio se comparte por las aplicaciones tanto Web como de trabajador de la muestra. Si no lo ha hecho todavía, cree el servicio escribiendo el siguiente comando:
    cf create-service ElasticMQ Default mqsampleservice

    Para listar el servicio que creó, escriba el siguiente comando:

    cf services
  4. Vincule el servicio a la aplicación no iniciada. El servicio se debe llamar "mqsampleservice". Escriba el siguiente comando:
    cf bind-service MQS.sample.web mqsampleservice
  5. Inicie la aplicación para refrescar las variables del ambiente. Escriba el siguiente comando:
    cf start MQS.sample.web
  6. Puede desplegar la aplicación Web escribiendo su URL en su navegador o pasando a la aplicación en la interfaz de usuario BlueMix. Para lanzar la aplicación desde la interfaz de usuario BlueMix, vaya al Tablero y haga clic en el vínculo que se muestra junto al nombre de la aplicación.

    En la imagen siguiente, la interfaz de usuario (UI) Web de la aplicación muestra un cuadro de entrada, en donde puede escribir la oración que quiere sea procesada. Haga clic en Submit Work para enviar una solicitud HTTP POST al servlet Java. Entonces se envía la oración a través de Elastic MQ a los hilos del trabajador para procesarla y los resultados se muestran junto con la ID del hilo del trabajador que procesó cada palabra.

    Diagram of the sample app's web UI showing an input box

Conclusión

 

¡Y eso es todo! Varias instancias de la aplicación del trabajador se pueden comunicar ahora con el front-end Web usando el servicio de mensajería JMS API de Elastic MQ, todo alojado en la nube y disponible en cualquier parte.

Agregar un comentario

Nota: los elementos en HTML no son soportados dentro de los comentarios.


quedan 1000 caracteres

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, Cloud computing
ArticleID=972583
ArticleTitle=Integre rápidamente sus aplicaciones BlueMix usando Elastic MQ
publish-date=04302014