Tengo un contenedor Docker con una aplicación Java que usa una base de datos para conservar algunos datos. Mi aplicación tiene una clase que extiende otra que no es código mío (concretamente SinkTask, una clase de Kafka que sirve para transferir datos de Kafka a otro sistema). Cuando la aplicación se inicia, abre una conexión a la base de datos. A veces, la base de datos cierra la conexión y las tareas comienzan a fallar. Las excepciones lanzadas por estas fallas están atrapadas en una parte de mi código y puedo pensar en diferentes formas de manejarlas: 1. Simplemente ejecutando el código desde dentro de la aplicación que detiene e inicia la conexión nuevamente 2. Reiniciando el contenedor Docker, creando una nueva conexión en el proceso
Creo que la mejor solución es la número 1. Sin embargo, quería saber cómo podría desencadenar la segunda situación. Supongo que debería lanzar una nueva excepción en el bloque catch capaz de finalizar la aplicación (recuerde que la parte SinkTask del código está fuera de mi control). ¿Sería esta una buena solución? ¿Qué tipo de excepción debo lanzar en este caso?
Esta es la parte del código donde capturo la excepción.
private void commitCollections() { for (SinkCollection sc : collections.values()) { try { commitCollection(sc); } catch (Exception e) { LOG.error("Error flushing collection " + sc.getTableName(), e); } } transactionRecordCount = 0; try { connection.commit(); } catch (SQLException e) { LOG.error("Commit error", e); } }Lanzar una Exception y dejar que se propague para finalizar la aplicación es una solución perfectamente agradable. En mi opinión, usar System.exit(exit_code) sería mejor porque describe claramente lo que está haciendo ese código.
Además, docker mostrará exit_code en el estado del contenedor ( docker ps -a ), lo que ayudará a diferenciar entre diferentes condiciones de error. Cuando se lanza una excepción no detectada, el código de salida siempre es 1.
Espero que ayude.