Este articulo habla acerca de como implementar un servicio Java en Linux usando Apache Commons Daemon.Commons Daemon es la API de Apache para correr procesos en Linux o Windows. En el articulo de hoy vamos a ver como implementar un simple servicio desde la JVM, el codigo Java y el Script del Linux Daemon.

Actualmente estoy trabajando con un linux Ubuntu Server 7.10 y Java 1.6. Como primer paso tenemos que instalar Java y Commons Daemon, a continuacion los comandos.

1. Para instalar el java SDK hacemos..

 $ sudo apt-get install sun-java6-jdk

Esto instala el JDK de Sun (Si queres podes instalar otra distrubucion o version, como por ejemplo icetea open JDK.

2. Instalar JSVC (Apache Commons Daemon)

 $sudo apt-get install jsvc

JSVC es el binario que permite correr a aplicaciones Java como procesos en Linux.

3. El codigo Java. Aqui debemos implementar la interfaz Daemon el cual sera llamado por el servicio jsvc. Yo ODIO el vi, por eso uso nano como editor en el linux. La idea es teminar con codigo java asi que podes usar el editor que prefieras.

import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;

public class Test implements Daemon {

@Override
public void init(DaemonContext arg0) throws Exception {
  System.out.println("starting app...");
  while (true) {
    System.out.println(System.currentTimeMillis());
    Thread.sleep(1000);
  }
}

@Override
public void destroy() {
  System.out.println("destroy called");
}

@Override
public void start() throws Exception {
  System.out.println("start called");
}

@Override
public void stop() throws Exception {
  System.out.println("stop called");
}
}

4. Compilar el codigo Java, como todos ya saben supongo tienen que tener el JAR de commons-daemon en el classpath, lo pueden encontrar aca.

 javac -cp .:commons-daemon-jar Test.java

5. Hay que generar un shell script que va a actuar como linux daemon.

 nano /etc/init.d/testd

Esto abre el editor parecido al VI, el codigo a continuacion:

echo "Setting enviroment variables..."
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.03
export PATH=$PATH:$JAVA_HOME/bin

DAEMON_HOME=/usr/bin
PID_FILE=/home/myuser/test.pid
HOME=/home/myuser
USER=myuser
RETVAL=0
TMP_DIR=/var/tmp
CLASSPATH=.:/usr/share/java/commons-daemon.jar
$JAVA_HOME/lib/tools.jar\

case "$1" in
 start)

 echo "Starting Daemon Test"
 $DAEMON_HOME/jsvc \
 -user $USER \
 -home $JAVA_HOME \
 -Djava.io.tmpdir=$TMP_DIR \
 -pidfile $PID_FILE \
 -outfile $HOME/log.out \
 -errfile $HOME/log.err \
 -cp $CLASSPATH \
 Test

 echo "test daemon started OK."
 exit $?;;

 stop)
 echo "Stopping Test..."
 $DAEMON_HOME/jsvc \
 -stop \
 -pidfile $PID_FILE \
 Test
 echo "test stopped"
 exit $?
 ;;

 *)
 echo "Usage test start/stop"
 exit 1;;
esac

5. Este es el final donde hacemos correr nuestro daemon de la siguiente manera

 /etc/init.d/testd start

6. Para detener el daemon ejecutamos el siguiente comando:

 /etc/init.d/testd stop

Eso es todo, que lo disfruten.