[英]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.