Intenta interpretar el código bien previamente a utilizarlo a tu proyecto si ttienes algo que aportar puedes dejarlo en la sección de comentarios.
Solución:
Creo que su sugerencia de abrir un puerto para escuchar cuando inicia su aplicación es la mejor idea.
Es muy fácil de hacer y no necesita preocuparse por limpiarlo cuando cierra su aplicación. Por ejemplo, si escribe en un archivo pero alguien elimina los procesos mediante el Administrador de tareas, el archivo no se eliminará.
Además, si no recuerdo mal, no hay una manera fácil de obtener el PID de un proceso Java desde el interior de la JVM, así que no intente formular una solución utilizando PID.
Algo como esto debería hacer el truco:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning()
try
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] 127,0,0,1));
catch (BindException e)
System.err.println("Already running.");
System.exit(1);
catch (IOException e)
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
Este código de muestra se une explícitamente a 127.0.0.1
lo que debería evitar cualquier advertencia de firewall, ya que cualquier tráfico en esta dirección debe provenir del sistema local.
Al elegir un puerto, trate de evitar uno mencionado en la lista de puertos conocidos. Idealmente, debería hacer que el puerto utilizado sea configurable en un archivo o a través de un interruptor de línea de comando en caso de conflictos.
Como la pregunta indica que se está utilizando WebStart, la solución obvia es usar javax.jnlp.SingleInstanceService
.
Este servicio está disponible en 1.5. Tenga en cuenta que 1.5 está actualmente en la mayor parte de su período de fin de vida útil. ¡Consíguelo con Java SE 6!
Creo que la mejor idea sería usar el bloqueo de archivos (una idea bastante antigua :)). Desde Java 1.4 se introdujo una nueva biblioteca de E/S que permite el bloqueo de archivos.
Una vez que la aplicación se inicia, intenta adquirir el bloqueo en un archivo (o crearlo si no existe), cuando la aplicación sale, el bloqueo se libera. Si la aplicación no puede adquirir un bloqueo, se cierra.
El ejemplo de cómo hacer el bloqueo de archivos es, por ejemplo, en Java Developers Almanac.
Si desea utilizar el bloqueo de archivos en la aplicación Java Web Start o en un subprograma, debe cantar la aplicación o el subprograma.
Al final de la web puedes encontrar las explicaciones de otros sys admins, tú igualmente eres capaz insertar el tuyo si dominas el tema.