Pregunta

Estoy buscando una buena manera de ejecutar un servidor Apache Derby en modo de red. Estoy usando NetworkServerControl para iniciar el servidor y está funcionando muy bien.

Comienzo el servidor así:

/**
 * starts the network server
 * @return true if sucessfull
 */
public boolean start()
{
    try
    {
        // just to be sure that we don't start two servers
        this.stop();

        server = new NetworkServerControl();
        server.start( null );

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

Y detenlo así:

/**
 * stops the server
 * 
 * @return true if there were no problems stopping the server
 */
public boolean stop()
{
    try
    {
        if ( server == null )
        {
            server = new NetworkServerControl();
        }
        server.shutdown();

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

En main () tengo esto para que el proceso no muera mientras el servidor se está ejecutando

(...)
clsDB.start();

while( clsDB.testForConnection() )
{
   Thread.sleep( 60000 );
}

testForConnection () tiene este aspecto:

/**
 * Try to test for a connection
 * 
 * @return true if the server is alive
 */
public boolean testForConnection()
{
    try
    {
        server.ping();

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

Mi problema es que cuando se llama a una nueva instancia de mi JAR, la anterior seguirá ejecutándose (a menos que tenga mucha suerte y la prueba se realice antes de que se inicie el nuevo servidor).

Sé que podría probar si el servidor ya se está ejecutando y luego no volvería a comenzar, pero me gustaría comenzar a funcionar como un reinicio si el servidor ya está allí.

¿Fue útil?

Solución 3

Terminamos usando un archivo que se crea cuando se va a matar el servidor, luego, en el proceso del servidor, verificamos periódicamente si existe el archivo, si está allí, matamos al servidor.

Otros consejos

Hice un proyecto hace un tiempo con derby (incluida la ejecución en modo de red), y parece recordar que hay algo de SQL que puede ejecutar en el servidor que cierra el derby.

Entonces, suponiendo que ese sea el caso (no hay tiempo para buscarlo en Google, lo siento) podría, al inicio, buscar su instancia de red. Si existe, ejecute este SQL en él. Una vez que haya determinado que finalmente se ha cerrado (supongo que la encuesta existe), puede volver a iniciarla.

Editar: Oh, no fue SQL, se está conectando a la base de datos con 'shutdown = true' como parámetro. Consulte aquí :

DriverManager.getConnection(
    "jdbc:derby:sample;shutdown=true");

La otra solución que planteé no interactúa con su JAR, que puede que no disfrute.

Una alternativa es hacer que su JAR que inicia la instancia de derby abra un puerto TCP que monitorea cuando inicia derby. Luego puede enviar sus propios comandos de apagado desde su nueva instancia JAR (obviamente antes de abrir su propio puerto TCP).

El inicio de una instancia de su JAR derby sería:

  • Vea si se acordó que el puerto TCP estaba abierto.
  • Si es así, envíe el comando de apagado.
    • El JAR al que envía el comando cerraría derby utilizando el método stop () .
    • Una vez que termine de cerrar el derby, enviaría un éxito de lo que sea y cerrará la conexión.
  • Escuchamos el puerto TCP acordado.
  • Llamamos a start () e iniciamos Derby.

Esto es más trabajo que mi otra solución, pero teóricamente es una mejor, ya que como parte de su reinicio, su JAR también puede querer hacer otras cosas (limpiar / reiniciar otros recursos, registrar el hecho de que se está cerrando, cosas así).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top