Procesos Java en Heroku

22 septiembre 2011

Heroku no solo sirve para ejecutar aplicaciones web Java, sino que en realidad sirve para ejecutar cualquier tipo de aplicación Java. Observando el proyecto podemos ver que hay dos aplicaciones bien diferenciadas, la aplicación web (que se lanza a través del script webapp generado por Maven) y la aplicación SchemaGenerator, ejecutada a través del script schemaGenerator. Mientras que la primera es una aplicación web normal y corriente, SchemaGenerator es simplemente un proceso Java puro, se lanza se ejecuta y termina sin ningún tipo de interfaz gráfica involucrada.

A este tipo de proceso en Heroku le llaman "worker process", podría traducirlo de cualquier manera, pero paso, así que se queda como proceso worker, hala.

Tercer Práctica

El objetivo de esta práctica es desarrollar una aplicación que inserte un tick en la base de datos cada segundo. Se podrá visualizar refrescando la misma página ticks.jsp y posteriormente la escalaré a dos dynos.

Pasos:

  1. Crear la clase Ticker.java que insertará un tick en la base de datos cada segundo.
  2. Probar la aplicación en local.
  3. Desplegar la aplicación en Heroku, escalarla a dos dynos y detenerla.

Paso 1

Creo la clase Ticker.java, el código es trivial, con un while(true) y un sleep(1000), de todas formas queda en GitHub.

Se declara el programa en el pom.xml para generar el script que lo lanza:


	es.aguasnegras.helloheroku.Ticker
	ticker

Paso 2

Se instala en local y se ejecuta:

mvn install
export REPO=~/.m2/repository
export DATABASE_URL=postgres://helloheroku:helloheroku@localhost/helloheroku
sh target/bin/ticker

Y en otra consola:

export REPO=~/.m2/repository
export DATABASE_URL=postgres://helloheroku:helloheroku@localhost/helloheroku
sh target/bin/ticker

Ahora puedo comprobar en localhost:8080/ticks.jsp que efectivamente, se van actualizando los ticks independientemente de la aplicación.

Paso 3
Vale, ahora a desplegarla en Heroku. Para poder ejecutar el proceso en Heroku en su propio dyno, hay que declararla en el Procfile:

tick: sh target/bin/ticker

Listo, añado a git y subo a GitHub y Heroku:

git add .
git commit -m "añadido proceso worker"
git push github master
git push heroku master

Si abro http://fierce-autumn-4530.herokuapp.com/ticks.jsp puedo ver que todo sigue igual, cada vez que recargo la página se añade un tick a la base de datos. Voy a arrancar el worker:

heroku scale tick=2

Si hago un heroku ps me confirma que se han arrancado dos procesos, y es más, un heroku logs -t va refrescando la salida con dos ticks cada segundo, uno tick.1 y otro tick.2.
Además el jsp me confirma que se han ido insertando en la base de datos.
Bueno, pues ya esta. A poner el código en GitHub

Código en GitHub
GitHub

Conclusiones
Bueno, pues ya he visto como se ejecuta un proceso demonio y he trasteado un poco el Procfile, que es otro fleco que convendría investigar un poco, a ver que más cosas se pueden hacer.
Es curioso que el proceso se lanza mediante un scale y no un heroku run, supongo que podría igualmente con el heroku run... a ver. Efectivamente, se puede ejecutar igualmente con un heroku run, la diferencia es que no se puede escalar, claro.