martes, 15 de junio de 2010

Hola mundo con Apache Tapestry (5.1) en Google App Engine

Java   Apache Tapestry   Google App Engine

Este fin de semana he estado probando el servicio de hosting Google App Engine para aplicaciones web (GAE para los amigos). Y por el momento me ha dejado muy buen sabor de boca ya que he conseguido subir a la nube con este servicio sin excesibas dificultades la aplicación Hola Mundo con Tapestry 5.1 que hice en un post anterior.

Pero antes de ver el ejemplo vamos a hablar de las principales caracteristicas de este servicio. Dado que es un servicio de hosting lo principal que hay que tener en cuenta es que no estamos trabajando sobre un servidor propio sino que lo hacemos sobre la infraestructura y servidores que utiliza la propia Google para sus servicios y por tanto no podemos hacer cualquier cosa en él sino que nos tenemos que limitar a usar las funcionalidades que nos ofrece y dentro de los límites que nos impone el entorno. Pero no nos asustemos, si se puede hacer funcionar un framework como Apache Tapestry dentro de él, que no es un framework internamente sencillo, los límites son bastante amplios y con bastante probabilidad podremos trabajar con el framework o librerías que más nos gusten. También podemos optar por trabajar directamente con Servlets y JSPs si nuestra aplicación es sencilla.

El primer lenguaje soportado en GAE fue Python y posteriormente añadieron soporte para Java que le permite atraer a un mayor número de programadores dado que Java es uno de los lenguajes de programación más extendido en estos días. El soporte de Java no se limita al lenguaje Java unicamente sino que están soportados otros lenguajes que se pueden ejecutar sobre la Java Virtual Machine (JVM) como Scala, Groovy o JRuby.

Las aplicaciones GAE tienen unas cuotas diarias de cantidad de datos de subida y de bajada, de tiempo de CPU, de número de archivos, de tamaño de datos almacenados en el servicio y algunos otros que no podremos sobrepasar con el servicio gratuito pero que pagando se pueden ampliar (que será la forma en que Google rentabilice el servicio).

La herramienta a través de la cual subiremos la aplicación a GAE es el App Engine SDK que entre otras cosas incluye las librerías que necesitaremos para compilar y un servidor que simula el entorno de la nube y con el cual podremos desarrollar en local.

Para administrar las aplicaciones que subamos, GAE nos proporciona una consola de administración desde la cual podremos ver los recursos que ha consumido cada aplición, peticiones realizadas, trazas, deshabilitar y habilitar la aplicación, borrar versiones, etc... en resumen todo lo que necesitaremos a lo largo de la vida de la aplicación.

Los servicios que proporciona el entorno a las aplicaciones son por ahora:
- Memcache: servicio de cache en memoria para acceso rápido a la información.
- Extracción de URL: para hacer peticiones mediante HTTP o HTTPS.
- Correo: para enviar correos electrónicos desde la aplicación.
- Imágenes: para manipular imágenes (rotar, escalar, recortar, ...).
- Cuentas de Google: para autenticar a usuarios a través de cuentas de Google.
- Almacenamiento de datos: para almacenar de forma persistente datos en la aplicación y realizar consultas sobre ellos.

Para acabar con esta introducción, la idea de tener un servicio de hosting para aplicaciones Java me parece muy útil ya que muchos proveedores de hosting sólo ofrecen soporte para PHP, Python, ASP o ASP.NET.

Vayamos a ver ahora lo que hay que tener en cuenta para desplegar una aplicación con Apache Tapestry 5.1 en el Google App Engine. Partiendo de la aplicación Hola Mundo que ya tenia desarrollada para hacerla funcionar en Tomcat, he tenido que realizar los siguientes cambios:

- La páginas necesitan la clase Java para ser encontradas por el framework con lo que he añadido la clase con.blogspot.tapestry.helloworld.pages.Index que únicamente contiene:

package com.blogspot.elblogdepicodev.tapestry.helloWorld.pages;

import org.apache.tapestry5.MarkupWriter;

public class Index {

}

- Las librerías que hay que incluir en el directorio WEB-INF/lib de la aplicación web son muchas menos. Las que he necesitado incluir para que funcione el ejemplo son las siguientes:
  • appengine-api-1.0-sdk-1.3.4.jar
  • commons-codec-1.3.jar
  • commons-fileupload-1.2.jar
  • commons-io-1.3.jar
  • commons-logging-1.1.1.jar
  • javassist-3.9.0.GA.jar
  • log4j-1.2.14.jar
  • slf4j-api-1.5.2.jar
  • slf4j-log4j12-1.5.2.jar
  • stax-api-1.0.1.jar
  • stax2-api-3.0.1.jar
  • tapestry-core-5.1.0.5.jar
  • tapestry-ioc-5.1.0.5.jar
  • tapestry5-annotations-5.1.0.5.jar
  • woodstox-core-asl-4.0.3.jar
Aunque posiblemente de estas alguna no sea imprescidible y se pueda quitar y tal vez alguna falte para alguna funcionalidad. Para el ejemplo estas son suficientes.

- Hay que incluir en el directorio WEB-INF el archivo appengine-web.xml (que es el descriptor de la aplicación en GAE) donde indicaremos el identificativo de nuestra aplicación a la que luego accederemos con la URL http://[application-id].appspot.com.

Y eso es todo, lo demás se queda igual que estaba. Para subir la aplicación primero tenemos que generar en nuestro sistema de archivos la estructura de archivos estandar de toda aplicación web Java con nuestra herramienta de contrucción favorita, en el caso de este ejemplo he utilizado Ant para la construcción e Ivy para las dependencias.

$ ./ant.sh resolve package

Y despues copiar manualmente la libreria appengine-api-1.0-sdk-1.3.4.jar del SDK del App Engine al directorio build/war/WEB-INF/lib.

Una vez que tenemos los archivos listos los subimos con el siguiente comando, también nos sirve para cuando queramos subir alguna modificación:

$ $GAE_HOME/bin/appcfg.sh update src/main/webapp/

También la podemos probar en el servidor de pruebas local proporcionado en el SDK:

$ $GAE_HOME/bin/dev_appserver.cmd src/main/webapp/

No pongo capturas de pantalla porque aquí tenéis la aplicación funcionando en el App Engine http://hello-world-tapestry5-gae.appspot.com/.

Espero que alguno se anime a probar y usar este framework  o le sirva de utilidad estas entradas que estoy publicando sobre Apache Tapestry.

Enlaces:
Documentación sobre Apache Tapestry
Codigo fuente ejemplo Hola Mundo con Apache Tapestry 5.1 en Google App Engine

Nota: Para obtener un código fuente más actualizado de esta aplicación a versiones superiores de las librerías de Tapestry, del Google App Engine y utilizando Gradle puedes ver el repositorio en el enlace anterior de Github.

¿Que es el Google App Engine?
Documentación sobre Google App Engine