JBoss en Microsoft Azure Cloud Services PaaS

Desde hace bastante tiempo, la plataforma Microsoft Azure lleva dando soporte a otros lenguajes como son Java, Phyton o PHP. Una forma fácil de trabajar con ellos es a través del servicio de web sites, donde se no permite con un simple clic añadir el soporte para cada uno de ellos:

Microsoft Azure Web sites language support

En el caso de Java, las opciones que nos aportan como servidor web son Tomcat y Jetty:

Web sites Java support

¿Y si quisiéramos trabajar con JBoss?

En este post voy a mostrar cómo es posible instalar JBoss en Cloud Services a través del IDE de Eclipse, donde no sólo subiremos la aplicación en Java, sino también el servidor web que debe servir el sitio.

Instalaciones

Partiendo desde cero, estos son los requisitos necesarios para este escenario:

  • Es necesario Azure SDK 2.3.
  • En el momento de escribir este post, la version más reciente de JBOSS soportada por el plugin de Eclipse es JBoss AS 7, por lo que es necesario hacer uso de Java Development Kit 7 para que funcione correctamente.
  • Añadir a la variable PATH la ubicación de la instalación del runtime de Java:Path variable Java path
  • Eclipse IDE for Java EE Developers, Indigo o superior (en el momento del post la versión es Kepler).
  • Una vez descargado Eclipse, instalamos el plugin que nos da las opciones de Azure dentro del IDE: Help > Install New Software… > Work with http://dl.msopentech.com/eclipse > Deshabilitar Contact all update sites during install to find required software. Avanzamos en el Wizard, aceptamos la licencia y reiniciamos Eclipse cuando lo solicite.

Configuración de JBOSS en local

Antes de iniciar cualquier subida al cloud, lo primero es comprobar que el servidor y la aplicación funcionan correctamente en local. Para ello, lo primero que vamos a hacer es crear un servidor web JBoss desde Eclipse.
Para ello, nos posicionamos en la pestaña Servers y hacemos clic sobre en enlace No servers are available. Click this link to create a new server… o bien con el botón derecho seleccionamos New > Server.

Servers tab new Server

Si nos fijamos en el listado de JBOSS, la última version es la 5.0, por lo que haremos click en Download additional server adapters con el objetivo de descargar JBossAS Tools.

JBossAS Tools

Una vez que volvamos a acceder al listado de servidores disponibles, veremos que la lista ha aumentado y ya podremos seleccionar JBoss AS 7.1:

JBoss AS 7.1

En el siguiente paso, es necesario descargar el servidor de JBoss, y podemos hacerlo directamente desde el asistente haciendo clic sobre Download runtime and install…

JBoss Download and install runtime...

Dentro del listado seleccionamos JBoss AS 7.1.1 (Brontes), avanzamos en el asistente y seleccionamos la carpeta de instalación (asegurate de tener permisos sobre la ubicación que elijas).

Download runtime Install folder

A partir de este momento comenzará la descarga y la descompresión de JBoss.

Los últimos pasos para la configuración de JBoss son:

  1. Modificar el valor de Home Directory a la ubicación de nuestra instalación de JBoss
  2. Asegurarnos de que el JDK seleccionado para el servidor es la version 7, ya que en otro caso no funcionará correctamente.

Home Directory and JRE

Avanzamos sobre las opciones por defecto y terminamos con el asistente. En la pestaña Servers veremos que se han creado dos servidores en lugar de uno. No es necesario mantener los dos, por lo que en mi caso elimino uno de ellos y me quedo con JBoss 7.1 Runtime Server.

Projecto de ejemplo

Para comprobar tanto en local como en Azure que nuestro servidor funciona correctamente, vamos a crear un proyecto del tipo Dynamic Web Project (File > New > Dynamic Web Project) con la siguiente configuración:

New Dynamic Web Project

Dejamos Los siguientes pasos del asistentes con los valores por defecto.

En el apartado WebContent creamos un nuevo archivo del tipo JSP File. En este post se llamará index.jsp, para que lo tome como documento de inicio por defecto.

New JSP File

El contenido del archivo será el siguiente, con el objetivo de ejecutar algo de código en Java y además saber cuál es la instancia del worker role que está atendiendo la petición:

<%@page import="java.net.InetAddress"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>JBoss on Microsoft Azure PaaS</title>
</head>
<body>
<article>
This is <%= InetAddress.getLocalHost().getHostName() %> instance.
</article>
</body>
</html>

Creación del proyecto de Azure

Antes de realizar la subida al cloud, es necesario crear el proyecto asociado de Azure con la configuración de nuestro servicio. Para ello hacemos clic con el botón derecho sobre el proyecto que acabamos de crear y seleccionamos Azure > Package for Azure…

Package for Azure

Eligimos el nombre del proyecto (MyAzureProject) y nos aseguramos de que la pestaña del JDK tiene la siguiente configuración:

New Azure Deployment Project JDK

En la pestaña de Server debemos seleccionar la ubicación del servidor de JBoss que creamos anteriormente:

Azure Deployment Project Server Tab

En Applications debe aparecer el archivo .war correspondiente al proyecto desde el que hemos creado dicho paquete.
Existe un último apartado, el cual contiene una serie de características opcionales:

Azure Deployment Project optional features

Para este ejemplo no seleccionaremos ninguna de ellas.

Emulación en local

Una vez creado el proyecto de Azure, podemos posicionarnos sobre él y lanzar la emulación en local, comprobando que todo funciona según lo previsto:

Run in Azure Emulator

Este proceso puede tardar algunos minutos ya que realiza la completa emulación de este escenario (crear un worker role, descargar dentro del mismo el servidor web, montarlo, etcetera).
El resultado debe ser similar al siguiente:

Por el lado del worker role veremos un mensaje que pone java.exe is running…:

Worker role java is running

Para ver el sitio que está desplegado dentro del emulador, basta con acceder al navegador y escribir: http://127.0.0.1:8080/MyJavaHelloWorld:

Testing JBoss and Java locally

Además si accedemos a la raíz del sitio, veremos que se trata de la versión de JBoss seleccionada (antes de hacer una subida a producción es necesario modificar la configuración para eliminar este tipo de información ;)):

Your JBoss Application Server 7 is running on Microsoft Azure Emulator

Subida a un Cloud Service

Para realizar la subida, hacemos clic con el botón derecho sobre el proyecto de Azure y seleccionamos Azure > Deploy to Azure Cloud, lo cual nos abrirá un asistente donde deberemos importar la configuración de nuestra suscripción a través del botón Import from PUBLISH-SETTINGS file…. A través de él se nos permite seleccionar el archivo de configuración de nuestro disco duro y además existe un botón que abre una ventana del navegador y descarga la configuración de la cuenta de Azure con la que nos loguemos.

Publish Wizar Import from Publish-settings file

Una vez importada la configuración, basta con seleccionar la cuenta de Microsoft Azure Storage que queremos utilizar y cuál será el nombre del Cloud Service donde queremos desplegar la solución:

Publish Wizard Subscription options

Este proceso puede tardar unos minutos.

Una vez finalizado, podemos hacer clic directamente en el enlace Published de la ventana Azure Activity Log que nos llevará al sitio desplegado:

Azure Activity Log

JBoss on Azure

Por último, otra prueba interesante sería modificar el número de instancias que sirven la aplicación, para comprobar que efectivamente balancea nuestro sitio. Para ello podemos modificar el número de instancias desde el portal o bien editar la configuración del paquete de Azure desde Eclipse:

MyAzureProject Azure Properties

Desplegamos las opciones de la izquierda y seleccionamos la opción Roles. Hacemos clic en WorkerRole1 y seleccionamos Edit para modificar el valor:

Properties for WorkerRole1

Espero que haya sido de utilidad.

¡Saludos!