Corriendo aplicaciones Rails en JBoss
El objetivo de esta anotación es mostrar los pasos necesarios para lanzar una aplicación Rails dentro de un servidor de aplicaciones Java, en este caso el popular JBoss La intención última es comprobar los progresos está llevando a cabo el equipo de JRuby. Quién nos lo iba a decir hace un año, así que… ¿quién nos dirá qué va a ocurrir para el año que viene?
Instalación de JRuby
El primer paso será la instalación de JRuby , por supuesto. Damos por ya instalado Java en nuestra máquina. Para Mac OS X, la instalación por defecto de Java será suficiente (lo cual es raro)
1 2 3 |
cd ~/jrubydemo/ wget http://dist.codehaus.org/jruby/jruby-bin-1.0.1.tar.gz tar zxvf jruby-bin-1.0.1.tar.gz |
Y se creará el directorio jruby-1.0.1. A continuación, añadiremos las siguientes variables al entorno de ejecución actual, una forma de hacerlo es la siguiente
1 2 3 |
Tamarindo:~/jrubydemo/ juan$ cat > entorno export JRUBY_HOME=`pwd`/jruby-1.0.1 export PATH=$JRUBY_HOME/bin:$PATH |
Cada vez que cambiemos este fichero tendremos que acordarnos de ejecutar el nuevo entorno en todas las sesiones que tengamos abiertas, hasta que añadamos estas variables al entorno por defecto.
. entorno |
Ya podemos comprobar que las variables de entorno están presentes. Posteriormente podremos añadir la carga de este entorno a nuestro profile, pero de momento nos bastará con recordar que hay que evaluar este archivo de entorno para poder trabajar con JRuby. Ya podemos hacer nuestra primera, emocionante prueba:
1 2 |
Tamarindo:~ juan$ jruby -v ruby 1.8.5 (2007-08-23 rev 4201) [i386-jruby1.0.1] |
1 2 |
Tamarindo:~ juan$ which gem /Users/juan/jrubydemo/jruby-1.0.1/bin/gem |
JRuby incluye su propia versión de gem, y todas las gemas que instalemos con el entorno de JRuby quedarán instaladas en $JRUBY_HOME/lib/gems, de manera que no romperemos nuestra instalación estándar de Rails y otra gemas.
Instalación de Rails sobre JRuby
Merced a la flexibilidad del sistema de paquetes de Ruby, este paso será muy sencillo. Para instalar a los sospechosos habituales bastará con:
1 2 |
gem install rails -y --no-rdoc gem install activerecord-jdbc --no-rdoc --no-ri |
Esto instalará las gemas habituales: ActionMailer, ActionPack, ActiveSupport, ActiveRecord, Rails, Rake, RSpec, etc. asi como el adaptador JDBC para ActiveRecord. En este punto es cuando cualquier tutorial de Rails que se precie creará una aplicación de prueba (por ejemplo, un blog, un CMS, un mashup o cualquier otra cosa) en menos de 5 minutos. Nosotros, que somos algo más vagos, optaremos por instalar una aplicación que ya tenemos lista en su repositorio de Subversion:
1 2 3 4 |
cd ~/jbossdemo svn checkout http://mi-repositorio.com/myapp/trunk myapp cd myapp jruby script/server |
Y, si la base de datos está arrancada y ’’config/database.yml’’ está bien configurado, la aplicación funcionará sin más dilación. El mismo código de nuestra aplicación funcionará tanto sobre la implementación de Ruby en C que sobre la implementación en Java. No es poco.
Más difícil todavía: JBoss
Descargaremos JBoss de Sourceforge. El paquete zip es algo más pequeño:
1 2 3 4 |
http://labs.jboss.com/jbossas/downloads/ (4.2.1GA) cd ~/jrubydemo/ wget http://downloads.sourceforge.net/jboss/jboss-4.2.1.GA.zip?modtime=1184616808&big_mirror=1 unzip jboss-4.2.1.GA.zip (la versión zip es más pequeña) |
Y por supuesto a nuestro fichero de entorno añadiremos:
1 2 3 4 |
cd ~/jbossdemo export JRUBY_HOME=`pwd`/jruby-1.0.1 export JBOSS_HOME=`pwd`/jboss-4.2.1.GA export PATH=$JRUBY_HOME/bin:$PATH |
Configurando el acceso a bases de datos en JBoss
Este paso es lógicamente específico de JBoss, pero es necesario para correr nuestra aplicación. Dado que en el mundo Java no está aún muy extendido lo de la convención sobre configuración, tendremos que explayarnos un poco en el acceso a la base de datos, creando el fichero ’’jboss-4.2.1.GA/server/default/deploy/mysql-ds.xml’‘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://mysql-hostname:3306/myapp</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>usuario</user-name> <password>clave</password> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources> |
Con esta configuración le hemos dicho a JBoss que acceda a MySQL usando JDBC para acceder a la base de datos. Pero aún necesitamos instalar el correspondiente driver JDBC para Java, lo que MySQL denomina conector . De esta página podremos descargar el conector en forma de archivo .zip y la instalación es tan sencilla como copiar un archivo ’’.jar’’ al directorio lib del directorio de nuestro servidor.
1 2 3 4 |
cd ~/jbossdemo wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.3-rc.zip/from/http://mysql.rediris.es/ unzip mysql-connector-java-5.1.3-rc.zip cp mysql-connector-java-5.1.3-rc/mysql-connector-java-5.1.3-rc-bin.jar jboss-4.2.1.GA/server/default/lib/ |
Con todo esto, ya podremos probar si JBoss goza de buena salud.
cd $JBOSS_HOME
bin/run.sh
Tras varios mensajes esotéricos, JBoss cobra vida:
INFO [Server] JBoss (MX MicroKernel) [4.2.1.GA (build: SVNTag=JBoss_4_2_1_GA date=200707131605)] Started in 16s:863ms
También nos interesa el mensaje
[ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=MySqlDS' to JNDI name 'java:MySqlDS'
que indica que JBoss ha creado el gestor de conexiones MySQL. Es hora de mudar nuestra aplicación Rails.
Creando un archivo .war
La manera estándar de desplegar aplicaciones dentro de un contenedor Java es mediante el uso de archivos war” los cuales no son más que ficheros zip que contienen toda una jerarquía de directorios con clases y recursos estáticos (HTML, imágenes, etc) aderezados con ciertos metadatos. Cuando uno de estos ficheros aparece en el directorio adecuado del servidor, éste lo abre, analiza los metadatos y toma las acciones pertinentes para activar la aplicación.
Así, nos hace falta crear un fichero war que contenga nuestra aplicación Rails. Afortunadamente, no tenemos que preocuparnos mucho del asunto porque ya existe un plugin Rails que se encarga de ello, creado por Charles Nutter. Tenemos toda la información necesaria en este wiki
cd ~/jbossdemo/myapp
jruby script/plugin install svn://rubyforge.org/var/svn/jruby-extras/trunk/rails-integration/plugins/goldspike
Para configurar los contenidos de nuestro war no todo van a ser convenciones, tenemos que editar el archivo config/war.rb para referenciar el conector.
1 2 |
maven_library 'mysql', 'mysql-connector-java', '5.0.4' |
Teniendo en cuenta que por defecto Goldspike ejecutará la aplicación Rails en modo producción, tendremos que configurar adecuadamente ’’config/database.yml’’ Por último:
rake war:standalone:create |
Tras un rato de funcionamiento la tarea de Rake finalizará dejando un bonito myapp.war en nuestro directorio. Obsérvese que el fichero .war pesa la friolera de 18M: no en vano incluye todo JRuby, Rails y las gemas que tuviéramos instaladas. Si no hemos parado la anterior instancia de JBoss podemos copiar en caliente el war:
cp myapp.war /Users/juan/jbossdemo/jboss-4.2.1.GA/server/default/deploy/
Veremos que en JBoss comienzan a pasar cosas y nuestra aplicación cobra vida.
23:29:10,762 INFO [TomcatDeployer] deploy, ctxPath=/myapp, warUrl=.../tmp/deploy/tmp22213myapp-exp.war/
23:29:11,322 INFO [[/myapp]] Ruby is running in standalone mode
23:29:14,472 INFO [[/myapp]] JRuby init time: 2082ms
23:29:26,946 INFO [[/myapp]] Rails init time: 9818ms
23:29:26,947 INFO [[/myapp]] Runtime 0 loaded
23:29:26,947 INFO [[/myapp]] Requests can now be processed
23:29:35,874 INFO [[/myapp]] Runtime 1 loaded
Básicamente, JBoss descomprime el war en un directorio temporal y lanza dos instancias de Rails, lo que sería equivalente a dos mongrels tradicionales (por supuesto todo esto en configurable, según se explca en el wiki de Headius)
Tras esto, y si no ha habido errores (es de suponer que no) ¡es el momento de probar nuestra aplicación! Sólo debemos tener en cuenta que la URL raíz es, por la configuración de JBoss por defecto, algo distinta: http://127.0.0.1:8080/myapp, por lo que las URLs absolutas de nuestra aplicación (si las hubiera, que no debería) dejarán de funcionar.


Sorry, comments are closed for this article.