簡體   English   中英

為Eclipse RCP應用程序添加Shutdown Hook的正確方法是什么?

[英]What is the correct way to add a Shutdown Hook for an Eclipse RCP application?

我有一個RCP應用程序,它使用與內存數據庫的連接。 有一種情況是,當關閉窗口時,應用程序將被終止而不會讓它有機會關閉與數據庫的連接。

我研究了一下,似乎添加Shutdown鈎子是檢測此事件並在Java應用程序中進行清理的最佳方法。 但是,如果您有一個RCP應用程序,可能需要打開多個編輯器,那么處理此問題的正確方法是什么?

注意:此博客條目建議關閉掛鈎的以下實現:

關閉代碼必須在UI線程中運行,如果通過其他方式關閉工作台,則不應運行關閉代碼。 所有臟編輯器都會自動保存。 這樣可以避免在計算機關閉時提示可能在家中睡覺的用戶。 最后,工作台已關閉。

(所以不完全是你的場景,但實現仍然很有趣,因為它顯示了如何在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
    }
  }
}

如你所說,它在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...
  }
}

您應該覆蓋擴展WorkbenachAdvisor的類的preShutdown方法。 返回false以停止關閉進程,或返回true以繼續。

我嘗試了以下代碼,我在實際啟動RCP應用程序之前從IApplication implementsor start()方法執行:

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

cleanup()關閉與數據庫的連接。 如果有任何文檔打開,關閉應該要求用戶保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM