Está en la página 1de 7

Ejecutar aplicacin Java como servicio Integracin

bsica

En esta entrada abordaremos un tema bastante interesante: cmo correr un programa en


Java como servicio en Windows o demonio en UNIX/Linux. Puesto que el API de Java
no proporciona nada para estos casos, utiliza

remos una librera llamada Java Service Wrapper. Dicha librera nos ofrece una serie de
scripts y binarios preparados para diferentes sistemas operativos y arquitecturas, que nos
permitirn correr nuestros programas como un servicio; adems ofrece diferentes versiones:
Profesional, Estndar y Comunity. En este caso usaremos la versin Comunity que es libre
y gratuita.

La mejor manera de aprender a usar dicha librera es con un pequeo laboratorio, as que he
preparado uno en donde explico la integracin ms simple que existe con Java Service
Wrapper (existen 4 mtodos; unos ms avanzados que otros). La integracin sencilla que he
escogido nos permitir ejecutar como servicio una aplicacin que ya est creada
(probablemente ya empaquetada en un .jar) y a la que no podemos o es difcil hacerle
modificaciones. Esta es la manera ms sencilla de hacerlo, sin embargo tiene una
desventaja: al detener el servicio se enva directamente un System.exit() a la JVM por lo
que la aplicacin no se cerrar limpiamente.

Si quieres integrar tu aplicacin de una manera ms segura y ests en la capacidad de


prepararla para ello, podras intentar la integracin avanzada en la que utilizas el API de
Java Service Wrapper para implementar mtodos de inicio, pausa y detencin del servicio
[Para este caso utilizaremos una aplicacin de ejemplo que recibe un archivo como
parmetro y escribe en l informacin sobre la memoria del sistema, cada 60 segundos. He
escogido este ejemplo porque posee varios aspectos interesantes: requiere de libreras
externas (tanto JARs como libreras nativas [.so, dll, etc.]) y recibe parmetros.

Puedes descargar la aplicacin de ejemplo de haciendo clic aqu. Si la ejecutramos de


manera convencional veramos algo de este tipo:

gentookde@larry bin % java -jar servicio.jar /tmp/log


^C
gentookde@larry bin % cat /tmp/log
======Mon Oct 05 09:42:05 COT 2009=======
Cantidad de memoria RAM: 3952MB
Total: 4042664
Usada: 3509516
Disponible: 533148
Memoria SWAP total: 1052248
Memoria SWAP usada: 0
Memoria SWAP libre: 1052248

Como puedes ver se trata de una aplicacin de consola comn y corriente. La aplicacin
consta bsicamente de:

El ejecutable servicio.jar ubicado en el directorio bin/


La librera sigar.jar en el directorio lib/
Las libreras especficas de cada arquitectura de sigar en lib/

Pasos para la integracin

Lo primero es descargar el paquete de Java Service Wrapper y descomprimirlo.


Supondremos que el directorio donde se encuentra Java Service Wrapper es $RUTA_JSW
y que el directorio de la aplicacin que vamos a convertir en servicio es $RUTA_APP.

1. Copiamos los siguentes archivos al directorio bin de nuestra aplicacin de ejemplo

UNIX/Linux

cp $RUTA_JSW/bin/wrapper $RUTA_APP/bin/
cp $RUTA_JSW/src/bin/sh.script.in $RUTA_APP/bin/
cp $RUTA_JSW/lib/* $RUTA_APP/bin/

El archivo $RUTA_JSW/bin/wrapper podra no existir; por lo tanto lo que debes copiar es


el archivo wrapper-xxx especfico para tu plataforma. Por ejemplo, en este caso estoy
usando Gentoo Linux de 64bits por lo tanto copiar el archivo $RUTA_JSW/bin/wrapper-
linux-x86-64.

Windows

copy $RUTA_JSW/bin/ wrapper-windows-x86-32.exe $RUTA_APP/bin/


copy $RUTA_JSW/src/bin/ App.bat.in $RUTA_APP/bin/
copy $RUTA_JSW/src/bin/ InstallApp-NT.bat.in $RUTA_APP/bin/
copy $RUTA_JSW/src/bin/ UninstallApp-NT.bat.in $RUTA_APP/bin/
copy $RUTA_JSW/lib/* $RUTA_APP/bin/

2. Renombramos algunos archivos

UNIX/Linux

Ahora debes renombrar el script sh.script.in con el nombre de la aplicacin con la que
haremos la integracin y darle privilegios de ejecucin. En este cas se llama simplemente
servicio:
cd $RUTA_APP/bin
mv sh.script.in servicio
chmod a+x servicio

Windows

Ahora debes renombrar los archivos .bat para que concuerden con el nombre de la
aplicacin con la que haremos la integracin. En este cas se llama simplemente servicio
(lo puedes hacer usando el explorador si no te gusta usar la consola, pero a mi me dara
pena):

cd $RUTA_APP/bin
move App.bat.in servicio.bat
move InstallApp-NT.bat.in InstallServicio-NT.bat
move UninstallApp-NT.bat.in UninstallServicio-NT.bat

3. editar archivo de configuracin

Editamos el archivo wrapper.conf y lo dejamos en el directorio $RUTA_APP/conf/. El


archivo para este ejemplo tendr el siguiente contenido (importante! lee la explicacin si
usas Windows):

01# Comando de Java

02wrapper.java.command=java

03# Clase que ejecutara el Wrapper


wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
04
# Librerias necesarias para ejecutar el programa
05
wrapper.java.classpath.1=../lib/wrapper.jar
06
wrapper.java.classpath.2=servicio.jar
07
# Java Library Path (ubicacion de las librerias wrapper.dll o
08wrapper.so)
wrapper.java.library.path.1=../lib
09
# Java Bits. On applicable platforms, tells the JVM to run in 32 or
1064-bit mode.

11wrapper.java.additional.auto_bits=TRUE

12# Parametros del programa


13wrapper.app.parameter.1=net.casidiablo.servicio.Servicio

14wrapper.app.parameter.2=/tmp/log
#********************************************************************
15
# Wrapper General Properties
16
#********************************************************************
17
# Allow for the use of non-contiguous numbered properties
18
wrapper.ignore_sequence_gaps=TRUE
19
# Title to use when running as a <span class="IL_AD"
id="IL_AD8">console</span>
20
wrapper.console.title=servicio
21
#********************************************************************
22
# Wrapper Windows NT/2000/XP Service Properties
23
#********************************************************************
24
# <span class="IL_AD" id="IL_AD11">Name of</span> the service
25wrapper.name=jgossip

26# Display name of the service

27wrapper.displayname=Servicio

28# Description of the service

29wrapper.description=Monitor de memoria
# Mode in which the service is installed. AUTO_START or DEMAND_START
30
wrapper.ntservice.starttype=AUTO_START
31
# Allow the service to interact with the <span class="IL_AD"
32id="IL_AD10">desktop</span>.

33wrapper.ntservice.<span class="IL_AD"
id="IL_AD5">interactive</span>=false
34

Explicacin del archivo de configuracin:

wrapper.java.command=java es el comando para ejecutar java. En este caso es


simplemente java porque estoy en Linux y adems tengo configurado correctamente el
path. En Windows podra ser algo como: c:\archivos de programa\java\jdk1.6\bin\java.exe
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
indica el archivo a ejecutar es la clase WrapperSimpleApp que se usa en la integracin
sencilla. Esta clase envoltorio es la que permite ejecutar la aplicacin como servicio.
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=servicio.jar indican las rutas o archivos del
classpath.
wrapper.java.library.path.1=../lib indica el directorio donde se encuentran las
libreras a usar.
wrapper.app.parameter.1=net.casidiablo.servicio.Servicio
wrapper.app.parameter.2=/tmp/log estos son los parmetros que se pasarn al
programa. Importante: como estamos haciendo la integracin simple, el primer
parmetro debe ser la clase que contiene el mtodo main de nuestra aplicacin.
wrapper.name=jgossip esta opcin es para Windows y define el nombre del servicio
en el sistema.
wrapper.ntservice.starttype=AUTO_START si ests en windows, define si el
servicio quedar configurado para iniciar automticamente.

4. Probar/Instalar el servicio

Ahora veremos cmo podemos probar la aplicacin para asegurarnos que ha quedado bien
configurada antes de proceder con la instalacin.

UNIX/Linux

Ejecutamos el script servicio que configuramos en el paso 1 y 2 con el parmetro console:

./servicio console

Deberas ver algo como:

Running un servicio que escribe cosas


wrapper | > Wrapper Started as Console
wrapper | Java Service Wrapper Community Edition 64-bit 3.3.6
wrapper | Copyright (C) 1999-2009 Tanuki Software, Ltd. All Rights Reserved.
wrapper | http://wrapper.tanukisoftware.org
wrapper |
wrapper | Launching a JVM
jvm 1 | WrapperManager: Initializing

Lo detienes presionando Ctrl+C. Ahora, si queremos probarlo como demonio basta con
ejecutar los comandos tpicos de un demonio en UNIX/Linux:

$ ./servicio start
Starting un servicio que escribe cosas
$ ./servicio stop
Stopping un servicio que escribe cosas
Stopped un servicio que escribe cosas.

Para instalarlo basta con crear un enlace simblico del script en el directorio /etc/init.d y
aadirlo al listado de servicios a iniciar; por ejemplo:

sudo ln -sv $RUTA_APP/bin/servicio /etc/init.d/servicio


sudo rc-update add servicio default

Windows

Para instalarlo en Windows basta con ejecutar el archivo InstallServicio-NT.bat. Puedes


verificar que fue instalado correctamente accediendo a la consola de administracin de
servicios de NT (ejecutas el comando services.msc):
Fuentes y descargas

Aunque en esta entrada no explico cmo hacer la integracin avanzada, he preparado un


ejemplo completo que puedes descargar en el listado de abajo.

http://casidiablo.net/tag/demonio/

También podría gustarte