java eclipse application-shutdown

java - ¿Cuál es la forma correcta de agregar un Shutdown Hook para una aplicación Eclipse RCP?



application-shutdown (3)

Probé el siguiente código, que ejecuto desde mi método IApplication implementor start (), antes de que la aplicación RCP se lance realmente:

Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { if (PlatformUI.isWorkbenchRunning()) { PlatformUI.getWorkbench().close(); } logger.info("Shutdown request received"); cleanup(); } });

Donde cleanup () cierra la conexión a la base de datos. Cerrar debería solicitar a los usuarios que guarden si hay documentos abiertos.

Tengo una aplicación RCP que usa una conexión a una base de datos en memoria. Hay una circunstancia que, al cerrar Windows, la aplicación se cancela sin darle la oportunidad de cerrar la conexión a la base de datos.

Investigué un poco y parece que agregar un gancho de apagado es la mejor manera de detectar este evento y hacer una limpieza en una aplicación Java. Sin embargo, ¿cuál es la forma correcta de procesar esto si tiene una aplicación RCP, posiblemente con varios editores abiertos?


Debe anular el método preShutdown en su clase que extiende WorkbenachAdvisor. Devuelve falso para detener el proceso de cierre o true para continuar.


Nota: esta entrada de blog sugiere la siguiente implementación para el gancho de cierre:

El código de apagado debe ejecutarse en el subproceso de UI y no debe ejecutarse si el workbench se cierra por otros medios. Todos los editores sucios se guardan automáticamente. Esto evita que el usuario que está probablemente en casa duerma cuando su computadora se apaga. Finalmente, el banco de trabajo está cerrado.

(Así que no es exactamente su escenario, pero la implementación sigue siendo interesante ya que muestra cómo ejecutarlo dentro del hilo de UI)

private class ShutdownHook extends Thread { @Override public void run() { try { final IWorkbench workbench = PlatformUI.getWorkbench(); final Display display = PlatformUI.getWorkbench() .getDisplay(); if (workbench != null && !workbench.isClosing()) { display.syncExec(new Runnable() { public void run() { IWorkbenchWindow [] workbenchWindows = workbench.getWorkbenchWindows(); for(int i = 0;i < workbenchWindows.length;i++) { IWorkbenchWindow workbenchWindow = workbenchWindows[i]; if (workbenchWindow == null) { // SIGTERM shutdown code must access // workbench using UI thread!! } else { IWorkbenchPage[] pages = workbenchWindow .getPages(); for (int j = 0; j < pages.length; j++) { IEditorPart[] dirtyEditors = pages[j] .getDirtyEditors(); for (int k = 0; k < dirtyEditors.length; k++) { dirtyEditors[k] .doSave(new NullProgressMonitor()); } } } } } }); display.syncExec(new Runnable() { public void run() { workbench.close(); } }); } } catch (IllegalStateException e) { // ignore } } }

Está configurado, como dijiste, en la aplicación IA:

public class IPEApplication implements IApplication { public Object start(IApplicationContext context) throws Exception { final Display display = PlatformUI.createDisplay(); Runtime.getRuntime().addShutdownHook(new ShutdownHook()); } // start workbench... } }