Java Singleton APP – Crear un Socket para controlar una sola instancia de tu APP con opción de Shutdown

By | 10/12/2010

Este es un breve ejemplo sobre como crear un socket para controlar que corra una única instancia de tu app y que se quede escuchando hasta recibir un stop / shutdown para cerrar la aplicación.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.net.Socket;
 
import javax.net.ServerSocketFactory;
 
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
 
/**
* Socket stop example
* @author peiretti
*
*/
public class SocketStop {
 
     static Logger logger = Logger.getLogger(SocketStop. class );
 
    private static int port = 9898;
 
     public static void main(String[] args) {
 
         // Log4J
       BasicConfigurator.configure();
        logger .setLevel(Level. DEBUG );
 
        // Check arguments
        for (String string : args) {
             if ( "stop" .equals(string.toLowerCase()) || "shutdown" .equals(string.toLowerCase()));
            try {
                stop();
                return ;
           }  catch (Throwable e) {
                 return ;
           }
        }
 
         // --
        // -- inicializo otros servicios (ej. spring) y la applicacion ...
        // ......................... init app swing ...
        // ---
 
        // -- inicializo el Socket y lo dejo escuchando...
       ServerSocket serverSocket;
        try {
            serverSocket = ServerSocketFactory.getDefault().createServerSocket( port , 2, Inet4Address.getLocalHost());
       }  catch (Exception e) {
             logger .error( "Ya hay otra instacia de la aplicacion en ejecucion" ,e);
            throw new RuntimeException(e);
       }
 
         while ( true ) {
 
             final Socket socket;
            try {
                socket = serverSocket.accept();
           }  catch (IOException e) {
                 throw new RuntimeException(e.getMessage(), e);
           }
 
             try {
 
                 // ¿se ha recibido stop ?
 
                final BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
 
                final String line = in.readLine();
 
                if (line != null && "stop" .equals(line.trim().toLowerCase())) {
 
                     // se ha recibido stop... entonces break!
 
                    logger .info( "Se ha Recibido Stop..." );
                    break ;
 
               }  else {
 
                     logger .info( "Invalid '" + line + "'" );
 
               }
 
            }  catch (IOException ioe) {
 
                 logger .error(ioe);
 
           }  finally {
                 try {
                    socket.close();
               }  catch (IOException ioe) {
                     logger .error(ioe);
               }
            }
 
        }
 
         // Se ha recibido un stop
        // y se hizo un break dentro del while...
 
        try {
            serverSocket.close();
       }  catch (IOException e) {
             logger .error(e);
       }
 
         // --
        // - cerrar aplicacion
        // ...........
 
       System.exit(0);
 
        // ----
 
   }
 
     /**
     * Envio stop al socket
     */
    private static void stop() throws Throwable {
 
        Socket socket = new Socket(Inet4Address.getLocalHost(), port );
 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true );
 
        logger .info( "Send stop..." );
 
       out.write( "stop\n" );
 
       out.flush();
       out.close();
       socket.close();
   }
 
}
Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *