2009-02-05 8 views
7

Possiedo un'applicazione RCP che utilizza una connessione a un database in memoria. C'è una circostanza che, quando si spengono le finestre, l'applicazione viene uccisa senza dargli la possibilità di chiudere la connessione al database.Qual è il modo corretto di aggiungere un gancio di arresto per un'applicazione RCP Eclipse?

Ho studiato un po 'e sembra che l'aggiunta di un hook Shutdown sia il modo migliore per rilevare questo evento e effettuare la pulizia in un'applicazione Java. Tuttavia, qual è il modo corretto di processarlo se si dispone di un'applicazione RCP, eventualmente con più editor aperti?

risposta

1

Ho provato il seguente codice, che eseguo dal mio IApplication implementor metodo start(), prima che l'applicazione RCP è in realtà lanciato:

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

Dove cleanup() chiude la connessione al database. Chiudi dovrebbe chiedere agli utenti di salvare se ci sono documenti aperti.

3

È necessario eseguire l'override del metodo preShutdown sulla classe che estende WorkbenachAdvisor. Restituire false per arrestare il processo di spegnimento o true per continuare.

+1

Ho anche quello, ma se la JVM termina questa sezione non viene chiamato. Ad esempio, come risultato di System.exit() –

5

Nota: questo blog entry suggerisce il seguente implementazione per il gancio di arresto:

Il codice di arresto deve essere eseguito nel thread UI e non dovrebbe essere eseguito se la pialla è chiusa con altri mezzi. Tutti gli editor dirty vengono automaticamente salvati. Questo evita di chiedere all'utente che è probabilmente a casa a dormire quando il computer è spento. Finalmente il banco di lavoro è chiuso.

(quindi non esattamente lo scenario, ma l'implementazione è ancora interessante in quanto mostra come eseguire all'interno del thread 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 
    } 
    } 
} 

Si trova, come hai detto, in the IApplication:

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