jueves, 23 de febrero de 2012

controlar que un programa no se ejecute más de una vez

Cómo controlar que un programa Java se cargue más de una vez. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar.

Existen formas desde Java Web Start y el modo SingleInstanceService para evitar que un programa se cargue dos veces. Pero en nuestro caso vamos a realizarlo de una forma "manual" en Java, pero muy efectiva.

El truco es que el programa Java cree un objeto que esté escuchando a un puerto específico del ordenador. Para ello utilizamos un ServerSocket, objeto que nos permite crear un objeto escuchando a un determinado puerto.
private static ServerSocket SERVER_SOCKET;
SERVER_SOCKET = new ServerSocket(12345);
Escoge un puerto que no sea el estándar de los protocolos: 80 para el http, 21 para el ftp,...

Además vemos que el objeto ServerSocket que hemos instanciado es un objeto estático dentro de nuestro programa. Así, nuestro programa tendrá un listener sobre un puerto, al que nadie dirá nada, pero que lo dejará como reservado.

Lo que sucede es que si intentamos volver a crear un ServerSocket sobre ese puerto, saldrá una excepción indicando que el puerto ya está en uso. Esto nos permite controlar que ya hay una instancia de nuestro programa ejecutándose.
try {
       SERVER_SOCKET = new ServerSocket(12345);
       System.out.println("La primera instancia de la aplicación...");
       System.in.read();
} catch (IOException x) {
       System.out.println("La aplicación ya se está ejecutando...");
}

Muy simple y con esto podemos evitar que un programa Java se ejecute dos veces.