在应用程序上运行代码关闭

时间:2017-12-04 06:46:22

标签: java eclipse-plugin

这又是一个非常普遍的问题,而且E4似乎没有真正的支持(但如果我没记错的话,它在E3中也不起作用。)

我想在应用程序关闭时关闭我的数据库连接。或者更一般:我想在退出时进行任何清理。

所以通常的API是:

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    public ApplicationWorkbenchWindowAdvisor(final IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }

    @Override
    public boolean preWindowShellClose() {
        if (PlatformUI.getWorkbench().getWorkbenchWindowCount() <= 1) {
            // the last window is about to close
            Datababase.close();
        }
        return super.preWindowShellClose();
    }
}

问题?每次应用程序关闭时都不会调用它,特别是不在PlatformUI.getWorkbench().close();上(即使JavaDoc声称此方法关闭了窗口)。

(如果您想测试此声明是否正确,只需使用ExitHandler关闭您的应用,则不会调用preWindowShellClose()。)

我可以创建自己的处理程序并再次手动调用清理方法,但我希望有更好的方法。

您可以对应用程序关闭做出反应的另一种方法是Shutdown Hooks API

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    Datababase.close();
}));

问题:对于RCP应用程序,此挂钩被称为方式,方式,太晚,例如,所有插件都已关闭。

我觉得必须有一种简单(和工作)的方式,我还没有找到它。如果它很重要,我们使用的是Lesser Evil Eclipse(又名E3兼容性)。

如何在应用程序关闭时运行代码?

1 个答案:

答案 0 :(得分:2)

使用IWorkbench::addWindowListenerIWorkbench::addWorkbenchListener在工作台窗口关闭或工作台关闭时收到通知。

您也可以考虑使用捆绑的stop方法运行清理代码。