我有一个 RCP 应用程序,它使用与内存数据库的连接。有一种情况是,当关闭 Windows 时,应用程序在没有机会关闭与数据库的连接的情况下被杀死。
我进行了一些研究,似乎添加一个 Shutdown 挂钩是检测此事件并在 Java 应用程序中进行清理的最佳方法。但是,如果您有一个 RCP 应用程序,并且可能打开了多个编辑器,那么正确的处理方法是什么?
我有一个 RCP 应用程序,它使用与内存数据库的连接。有一种情况是,当关闭 Windows 时,应用程序在没有机会关闭与数据库的连接的情况下被杀死。
我进行了一些研究,似乎添加一个 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 实现者 start() 方法执行的以下代码:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if (PlatformUI.isWorkbenchRunning()) {
PlatformUI.getWorkbench().close();
}
logger.info("Shutdown request received");
cleanup();
}
});
其中 cleanup() 关闭与数据库的连接。如果有任何文档打开,关闭应该要求用户保存。